BeaRLibMG - генератор карт

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

Модератор: Apromix

Аватара пользователя
Jolly Roger
Сообщения: 2973
Зарегистрирован: 27 ноя 2009, 09:10
Откуда: Minsk, Belarus

Re: BeaRLibMG

Сообщение Jolly Roger » 13 фев 2012, 05:54

Как я уже писал, просто не до конца разобрался с возможностями медведя. Выложил в первом посте по FFHtR тестовую версию, там рядом со стартовой позицией генерится город с помощью медведа, также накидываются жители.

Пока всё, никаких интересностей, более нет.
Писать диздок спустя несколько лет разработки и множества изменений концепции - исконная русская девелоперская традиция.

Аватара пользователя
Jolly Roger
Сообщения: 2973
Зарегистрирован: 27 ноя 2009, 09:10
Откуда: Minsk, Belarus

Re: BeaRLibMG

Сообщение Jolly Roger » 31 авг 2012, 07:19

Медведь решает!
В два захода добавил кучу замечательных мест для посещения!
=D>

В заброшенной деревушке меня загнали. :(
Скрытый текст: ПОКАЗАТЬ
Ruined_vil.PNG
Ruined_vil.PNG (142.81 КБ) 3767 просмотров
Писать диздок спустя несколько лет разработки и множества изменений концепции - исконная русская девелоперская традиция.

phomm
Сообщения: 40
Зарегистрирован: 13 сен 2012, 07:14
Контактная информация:

Re: BeaRLib

Сообщение phomm » 14 ноя 2012, 18:23

JustHarry писал(а): Зерно генерации передать не проблема :roll:
Как сейчас обстоят дела с зерном (надо передать и по идее вернуть тоже неплохо было бы) ? Для Хода тут понадобилось оно , если не будет ответа некоторое время, сам полезу ручонками добавлять по своему усмотрению, хотя, конечно, постараюсь как-то соблюсти архитектуру и учесть размышления из темы.

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

Re: BeaRLibMG - генератор карт

Сообщение Apromix » 11 янв 2013, 11:41

Добавил в либу еще 2 генератора комнат :D
Вложения
222.png
222.png (9.94 КБ) 3641 просмотр
111.png
111.png (10.75 КБ) 3641 просмотр

phomm
Сообщения: 40
Зарегистрирован: 13 сен 2012, 07:14
Контактная информация:

Re: BeaRLibMG - генератор карт

Сообщение phomm » 10 фев 2013, 07:15

JustHarry так что насчёт зерна ? Я добавил его установку в либу, но у меня не робит оно, дебаг ни к чему не привёл. Если будет возможность, давай на это дело скооперируемся, ибо в ходе некоторый кусочек функциональности из-за этого пропадает.

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

Re: BeaRLibMG - генератор карт

Сообщение kipar » 12 фев 2013, 05:38

phomm писал(а):Я добавил его установку в либу, но у меня не робит оно, дебаг ни к чему не привёл.
Там в начале CreateMap идет Randomize; который сбивает зерно. Так что если выставляем зерно - надо его убрать.

phomm
Сообщения: 40
Зарегистрирован: 13 сен 2012, 07:14
Контактная информация:

Re: BeaRLibMG - генератор карт

Сообщение phomm » 13 фев 2013, 02:44

Спасибо, конечно, за совет. Я эти вещи отследил сразу.
Я сам конечно виноват, наверное, не указал ранее вот этого http://code.google.com/p/heart-of-darkn ... erator.pas

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

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

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

Re: BeaRLibMG - генератор карт

Сообщение Jesus05 » 13 фев 2013, 04:48

Я конечно в делфи нифига не понимаю :)
Но мне кажется тебе надо добавить в либе в процедуру еще 1 параметр

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

procedure CreateMap(X, Y, ID: Integer; var A: TBeaRLibMap; S: Integer; SEED: Integer);
и установить RandSeed сразу после начала процедуры.

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

RandSeed := SEED;
ну или даже так...

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

if SEED = 0 then Randomize
else RandSeed := SEED;
(не уверен что последний кусок кода рабочий :) но думаю понятно что если seed на входе равен нуля то делать рандомную карту не основанную на входящем зерне);

адд: убрал точку с запятой перед else.
Последний раз редактировалось Jesus05 13 фев 2013, 06:12, всего редактировалось 1 раз.

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

Re: BeaRLibMG - генератор карт

Сообщение kipar » 13 фев 2013, 05:41

В предыдущем посте только точка с запятой перед else лишняя, а в остальном согласен.

phomm
Сообщения: 40
Зарегистрирован: 13 сен 2012, 07:14
Контактная информация:

Re: BeaRLibMG - генератор карт

Сообщение phomm » 13 фев 2013, 18:12

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

Тут ещё надо заметить, что вне либы вся та же схема работала на ура. Ставилось зерно и внутренний ходовский генер рисовал идентичные карты (которые постом постобработкой немного модифицированились, получались сносные "сейвы" межуровневые) а вот с либой не проходит такой способ и всё тут.

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

Re: BeaRLibMG - генератор карт

Сообщение Cfyz » 13 фев 2013, 18:44

phomm писал(а):я уж боюсь варианта что у них единое зерно
phomm писал(а):готов уж поверить и в такую магию
Я, возможно, немного не в фокусе ситуации, но глобальные переменные при динамической линковке как раз-таки одни на все приложение (edit: кроме случаев, когда явно указано иное). Т. е. то, что зерно генератора едино для .exe и .dll, это совершенно нормально и полностью ожидаемо.
Пытается раскуклиться

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

Re: BeaRLibMG - генератор карт

Сообщение kipar » 13 фев 2013, 19:52

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

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

Re: BeaRLibMG - генератор карт

Сообщение Cfyz » 13 фев 2013, 22:42

kipar писал(а):Я слабо верю, что у либы и ехе могут быть общие глобальные переменные. У них даже менеджер памяти разный. Может в каких-нибудь с++ либа и экспортирует сама какие-то переменные, но в паскале вроде такого нет - список того что экспортировать указывается явно.
Не просто могут, а очень даже есть.
1. Явно: в таблице экспорта указывается лишь адрес, туда можно положить при сборке и, соответственно, импортировать в приложении хоть функцию, хоть переменную. Тут нужна поддержка языка.
2. Косвенно: вспомни, как вообще работает динамическая линковка. Если A.exe использует B.dll и С.dll, а B.dll тоже использует С.dll, то сколько экземпляров С.dll будет в памяти? Один, с одной своей глобальной переменной, которая будет как бы общей для A.exe и B.dll. Тут никакой языковой поддержки не нужно.

По поводу менеджеров памяти это вы зря. Вся адекватная работа с памятью как раз и строится на возможности косвенно расшарить данные между модулями. Иначе было бы невозможно создать объект (выделить память) в одном модуле, а удалить его (освободить память) в другом. Но поскольку malloc/free и все необходимые им структуры данных существуют в единственном экземпляре на процесс, все прекрасно работает.

В Windowd роль C.dll может играть msvcrtXX.dll. Это майкрософтовская реализация стандартной библиотеки языка С, которая куда только не линкуется -- там и менеджер памяти, и черт в ступе. Если вспомнить нездоровую любовь С к непотокобезопасным функциям (что начало исправляться лишь относительно недавно), одна-две глобальные переменные никого не удивят.

Впрочем, есть вариант и когда все как будто бы отдельно. Статическая сборка + никаких глобальных переменных. Тогда в каждом модуле своя собственная копия менеджера памяти, своя куча, свои переменные на этой куче. У этого подхода есть свои плюсы, есть и куча минусов. Плюсы как правило только в *nix, собрать честную статическую сборку на винде практически невозможно и она крайне нестабильна.
Пытается раскуклиться

phomm
Сообщения: 40
Зарегистрирован: 13 сен 2012, 07:14
Контактная информация:

Re: BeaRLibMG - генератор карт

Сообщение phomm » 14 фев 2013, 02:52

Вот собственно , опять же надо было мне указать - http://code.google.com/p/heart-of-darkn ... s/uMap.pas

Тут и стат и дин линковка пробовалась, обе не дают ожидаемого результата. Я тоже думал про разные менеджеры памяти и разные адресные пространства для данных, куда должна, по идее, попасть глоб. переменная из модуля system, но не сообразил, за что бы можно было зацепиться, чтоб порешать проблему.

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

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

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

Re: BeaRLibMG - генератор карт

Сообщение kipar » 14 фев 2013, 05:37

Cfyz писал(а):1. Явно: в таблице экспорта указывается лишь адрес, туда можно положить при сборке и, соответственно, импортировать в приложении хоть функцию, хоть переменную. Тут нужна поддержка языка.
Но если посмотреть на таблицу экспорта, то там никаких левых переменных нет, только то что указали в директиве export.
Cfyz писал(а):2. Косвенно: вспомни, как вообще работает динамическая линковка. Если A.exe использует B.dll и С.dll, а B.dll тоже использует С.dll, то сколько экземпляров С.dll будет в памяти? Один, с одной своей глобальной переменной, которая будет как бы общей для A.exe и B.dll. Тут никакой языковой поддержки не нужно.
Но с A.exe она будет не связана.
В частности, A.exe и B.dll могли быть собраны разными версиями паскаля и fpc, а т.к. в них даже алгоритм рандома разный, то странно было бы ожидать что зерно может быть общим.
Cfyz писал(а):По поводу менеджеров памяти это вы зря. Вся адекватная работа с памятью как раз и строится на возможности косвенно расшарить данные между модулями. Иначе было бы невозможно создать объект (выделить память) в одном модуле, а удалить его (освободить память) в другом. Но поскольку malloc/free и все необходимые им структуры данных существуют в единственном экземпляре на процесс, все прекрасно работает.
Но паскаль то использует собственный менеджер памяти поверх malloc, и он как раз разный. Поэтому в старых версиях дельфи нельзя было передавать в библиотеку и назад AnsiString. Только когда начиная с 2007 перешли на менеджер FastMem эта проблема исчезла.
Cfyz писал(а):В Windowd роль C.dll может играть msvcrtXX.dll. Это майкрософтовская реализация стандартной библиотеки языка С, которая куда только не линкуется -- там и менеджер памяти, и черт в ступе. Если вспомнить нездоровую любовь С к непотокобезопасным функциям (что начало исправляться лишь относительно недавно), одна-две глобальные переменные никого не удивят.
Но в паскале он не используется.

Ответить

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

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