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

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

Модератор: Apromix

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

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

Сообщение Apromix » 06 окт 2011, 12:46

Скрытый текст: ПОКАЗАТЬ
Библиотека для инвентаря. Место разработчика вакантное, кто согласится?

Мои соображения: тут одной функцией не ограничишься, а потому важными являются 6 функций:
InvClear - очистить весь инвентарь
InvCount - количество слотов в инвентаре;
ItemCount - количество предметов в слоте;
ItemClear - удалить слот
ItemAdd - добавить предмет(ы) в слот
ItemDel - удалить предмет(ы) из слота

В библиотеку нужно передавать только ссылки на предметы из списка, целые числа.

Ну и еще нужно придумать методы для "куклы" Doll и прочее... Высказываемся :D
Изображение Изображение

Аватара пользователя
Феникc
Сообщения: 679
Зарегистрирован: 27 ноя 2010, 15:01
Откуда: Челябинск

Re: BeaRLibInv

Сообщение Феникc » 08 окт 2011, 11:07

Скрытый текст: ПОКАЗАТЬ
Просто мысли вслух. Получается, инвентарь - это список с головой, в каждом слоте которого хранится предмет. Но как его хранить? Если указатель на предмет, то получается что структуру туда не запихнуть (она уничтожится после выхода из области видимости). Тогда можно использовать такой подход - в качестве параметра передавать размер описания предмета и указатель на предмет и копировать в список, что-то вроде memcpy(toIns, toInsSize, listEnd->Next->Item). Впрочем, это всё моё ИМХО, и я не удивлюсь если оно неправильно.

P.S. Завтра уже вернусь и продолжу работу над BeaRLibHS

Аватара пользователя
Феникc
Сообщения: 679
Зарегистрирован: 27 ноя 2010, 15:01
Откуда: Челябинск

Re: BeaRLibInv

Сообщение Феникc » 11 окт 2011, 15:12

Скрытый текст: ПОКАЗАТЬ
Мне интересно, зачем это разработчику, пусть даже начинающему? Инвентарь - это уже индивидуально для каждого разработчика, к тому же его сохранение придётся реализовывать ему самому (мы же не знаем структуру предметов).

Аватара пользователя
warchief
Сообщения: 297
Зарегистрирован: 11 янв 2008, 09:55
Откуда: Озеро снов

Re: BeaRLibInv

Сообщение warchief » 12 окт 2011, 05:03

интересная идея на самом деле. И я вижу это в виде просто контейнера (типа std::vector, std::map) дающего просто больше фич по работе с инвентарем.

Но надо подумать как оно должно работать - как быть со смешиванием предметов, вставлянием реагентов и т.д.

Хм, если никто не будет против, то я попробую (но ничего не обещаю, поэтому если кто еще хочет - делайте). Но думаю это будет написано на c++ с очень высоким уровнем ООП

Аватара пользователя
Jesus05
Сообщения: 1792
Зарегистрирован: 02 дек 2009, 07:50
Откуда: Норильск, сейчас Санкт-петербург.
Контактная информация:

Re: BeaRLibInv

Сообщение Jesus05 » 12 окт 2011, 05:25

Скрытый текст: ПОКАЗАТЬ
не вытерпел. считаю затею еще более бесполезной чем HighScore.
советую подумать над такими вещами:
1. стекинг.
2. предметы занимающие более 1 клетки.
3. безмерный по слотам, но ограниченный по весу и\или объему.

Аватара пользователя
Jesus05
Сообщения: 1792
Зарегистрирован: 02 дек 2009, 07:50
Откуда: Норильск, сейчас Санкт-петербург.
Контактная информация:

Re: BeaRLibInv

Сообщение Jesus05 » 12 окт 2011, 05:30

warchief писал(а): Но думаю это будет написано на c++ с очень высоким уровнем ООП
ООП никак не будет "виден" из DLL ибо функции соединяющие DLL с игрой должны быть обычными без классов, максимум допустимы структуры.

Аватара пользователя
warchief
Сообщения: 297
Зарегистрирован: 11 янв 2008, 09:55
Откуда: Озеро снов

Re: BeaRLibInv

Сообщение warchief » 12 окт 2011, 05:58

хех, я тут сначала подумал про шаблоны (но думаю и их не получится перенести на другой язык), потом про класс родитель который пользователь наследует, дописывает своими возможносятми... Но не знаю как переносится полиморфизм на тот же паскаль

Сейчас подумал хранить предмет в виде std::map (ключ, значение). Будут ли проблемы с std::map в других языках? Потому что пока я вижу единственный вариант не ограничивать пользователя - сделать скриптовый инвентарь

Вообщем сейчас настрочу концепт и по нему выскажитесь, стоит ли тратить время :mrgreen:

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

Re: BeaRLibInv

Сообщение kipar » 12 окт 2011, 06:01

warchief писал(а):хех, я тут сначала подумал про шаблоны (но думаю и их не получится перенести на другой язык), потом про класс родитель который пользователь наследует, дописывает своими возможносятми... Но не знаю как переносится полиморфизм на тот же паскальСейчас подумал хранить предмет в виде std::map (ключ, значение). Будут ли проблемы с std::map в других языках? Потому что пока я вижу единственный вариант не ограничивать пользователя - сделать скриптовый инвентарь
Шаблоны, map, наследование - все это можно использовать внутри библиотеки, но ни на C#, ни на паскаль, ни даже на С++(скажем библиотека откомпилирована в VS, а основной проект на gcc) не перенести. Внешний интерфейс должен состоять только из С-шных функций.

Аватара пользователя
warchief
Сообщения: 297
Зарегистрирован: 11 янв 2008, 09:55
Откуда: Озеро снов

Re: BeaRLibInv

Сообщение warchief » 12 окт 2011, 06:06

kipar писал(а):Шаблоны, map, наследование - все это можно использовать внутри библиотеки, но ни на C#, ни на паскаль, ни даже на С++(скажем библиотека откомпилирована в VS, а основной проект на gcc) не перенести. Внешний интерфейс должен состоять только из С-шных функций.
Ясно, учту.

Хорошо будет, если кто-нибудь даст статью о написании динамической библиотеки для других языков (я в этом вопросе не сильно разбираюсь - как-то не нужно было)

Аватара пользователя
warchief
Сообщения: 297
Зарегистрирован: 11 янв 2008, 09:55
Откуда: Озеро снов

Re: BeaRLibInv

Сообщение warchief » 12 окт 2011, 07:35

А пока предлагаю здесь описать что должно быть у предмета (стековая система, крафтовые операции и т.д.) контейнера, инвентаря и куклы.

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

Вот, первый набросок доки :mrgreen:

Пользователь - программист использующий эту библиотеку в своих целях.

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

Контейнер - сущность для хранения предметов. Является интерфейсом над предметами. Содержит бесчисленное число предметов. Все предметы хранятся в контейнерах, то есть нет предметов без контейнеров. Контейнеры также взаимодействуют друг с другом (передают предметы друг другу, копируют их и т.д.)

Интерфейс библиотеки - интерфейс позволяющий пользователю работать с контейнерами и предметами.


Предмет является структурой. Состоит из двух частей - интерфейса и базы.

База
Условное понятие. База содержит характеристики предмета. Но учитывая что невозможно угадать эти характеристики задуманные пользователям, база работает по системе ключ/значение. Количество ключей бесконечно (динамично). Ключ это уникальная строка названия характеристики. Значение - это строка содержащая описание характеристики.

Интерфейс
Позволяет пользователю получать из базы характеристики для последующего использования а также вносить изменения в эту базу.

Контейнер
Состоит из интерфейса, утилит и базы.

База - содержит бесконечное число предметов. Предметы имеют систему координат внутри контейнера - x указывает условное расположение предмета, а z - глубину вложения.

Интерфейс позволяет работать как в общем с инвентарем, так и с отдельными предметами

Утилиты - это функции дающие некоторые возможности (например сохранение, перенос содержимого контейнера в другой контейнер). Также имеются возможности

остается вопрос, как уникально хранить предметы внутри контейнера? Может по названию? Вроде плохо. Или банально по числу?

Аватара пользователя
warchief
Сообщения: 297
Зарегистрирован: 11 янв 2008, 09:55
Откуда: Озеро снов

Re: BeaRLibInv

Сообщение warchief » 12 окт 2011, 08:36

Код предмета
#pragma once

#include <map>
#include <string>
#include <vector>

#ifdef __UNICODESTRING
const wchar_t* divider = L"; ";
typedef std::wstring String;
#else
const char* divider = "; ";
typedef std::string String;
#endif

class BL_Item
{
public:
BL_Item(void);
~BL_Item(void);

void Clear();


void AddParam(std::string &name, String &param); // добавить параметр
void DelParam(std::string &name); // удалить

// установка значения параметра, старое стирается
void SetParam(std::string &name, String &newparam);
void SetParam(std::string &name, int newparam);
void SetParam(std::string &name, float newparam);

// получения значения параметра
String GetParam(std::string &name);

// вставка в значение параметра
void PasteInParam(std::string &name, String &pastetext);
// поиск вхождения строки в значении параметра
bool FindInParam(std::string &name, String &findparam);
// удаление слова из параметра.
void DelInParam(std::string &name, String &findparam);


private:
typedef std::map<std::string,String> ItemMap;
typedef std::map<std::string,String>::iterator ItemMapIterator;

ItemMap _param;
};
Комментируем 8)
Последний раз редактировалось warchief 12 окт 2011, 09:17, всего редактировалось 1 раз.

Аватара пользователя
alexbard
Сообщения: 670
Зарегистрирован: 22 апр 2011, 17:15
Откуда: Украина
Контактная информация:

Re: BeaRLibInv

Сообщение alexbard » 12 окт 2011, 09:07

Вообще не представляю, как вы хотите систематизировать инвентарь для рогалике во внешнюю библиотеку. Инвентарь для ролевой игры - это один из важнейших элементов игры. И в каждый разработчик реализует его по-своему:
кто-то хочет простую систему с предметами и все (100Rogues, Cardinal Quest), другой разработчик захочет более сложную систему с тонной префиксов, суффиксов и прочих эффектов, которые коренным образом будут изменять одни и теже предметы(тот же Diablo), третий, как я, например, создает предметы, базируясь на материалах, четвертый говорит: "эй, я хочу возможность добавить к любому предмету любое заклинание" (Daggerfall, Morrowind) и т.д. и т.п. Каждая игра имеет какие-то свои отличия, ньюансы, и включать их все в одну библиотеку - это:
слишком сложно
большая часть библиотеки останется невостребованной конкретным пользователем
невероятно сложно будет осуществить передачу данных между библиотекой и конкретным движком (признаюсь честно, я поигрался с либой, но под СиШарп так и не завел ее)

Но в целом, это действительно интересно наблюдать за вашим прогрессом. Все вышенаписанное появилось тут на правах личного мнения, высказанного в обеденный перерыв :) не принимайте это слишком серьезно.

Аватара пользователя
33 богатыря
Сообщения: 46
Зарегистрирован: 11 окт 2011, 13:10

Re: BeaRLibInv

Сообщение 33 богатыря » 12 окт 2011, 09:19

Универсализовать можно всё. Если сделать сложную систему предметов то при желании из неё можно легко сделать простую

Аватара пользователя
warchief
Сообщения: 297
Зарегистрирован: 11 янв 2008, 09:55
Откуда: Озеро снов

Re: BeaRLibInv

Сообщение warchief » 12 окт 2011, 09:26

alexbard писал(а):включать их все в одну библиотеку
Я и не собираюсь включать.

Гляньте код выше - это описание предмета. Что вы увидели?

Теперь постараюсь объяснить - все желания пользователя к предмету реализуются им самим.

Будет это как-то так:

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

Item it;
it.AddParam("name","меч дураков");
it.AddParam("text","это величайший меч дураков. Он отравляет, поджигает и просто рубит");
it.AddParam("damage","100");
it.AddParam("fire", "10");
it.AddParam("key", "колючий; режущий; великолепный; уникальный");
...
И так до бесконечности. Потом же пользователь пишет флеймворк который уже определяет что с этими параметрами делать. То есть поведение пользователь задает сам.

Аватара пользователя
alexbard
Сообщения: 670
Зарегистрирован: 22 апр 2011, 17:15
Откуда: Украина
Контактная информация:

Re: BeaRLibInv

Сообщение alexbard » 12 окт 2011, 09:49

В таком случае зачем пользователю эта библиотека, когда обозвать свою переменную int damage и сделать пару функций конструктор/деструктор - это вопрос ну максимум десяти минут, а основная сложность при проектировке инвентаря - это как раз создать взаимодействие между миром-предметом-пользователем-монстрами ? (которое все равно ложится на плечи конечного пользователя).

Как по мне: эта библиотека не решает проблем ее конечного пользователя.

Ответить

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

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