BeaRLibMG - генератор карт
Модератор: Apromix
- Jolly Roger
- Сообщения: 2973
- Зарегистрирован: 27 ноя 2009, 09:10
- Откуда: Minsk, Belarus
Re: BeaRLibMG
Как я уже писал, просто не до конца разобрался с возможностями медведя. Выложил в первом посте по FFHtR тестовую версию, там рядом со стартовой позицией генерится город с помощью медведа, также накидываются жители.
Пока всё, никаких интересностей, более нет.
Пока всё, никаких интересностей, более нет.
Писать диздок спустя несколько лет разработки и множества изменений концепции - исконная русская девелоперская традиция.
- Jolly Roger
- Сообщения: 2973
- Зарегистрирован: 27 ноя 2009, 09:10
- Откуда: Minsk, Belarus
Re: BeaRLibMG
Медведь решает!
В два захода добавил кучу замечательных мест для посещения!
=D>
В заброшенной деревушке меня загнали.
В два захода добавил кучу замечательных мест для посещения!
=D>
В заброшенной деревушке меня загнали.
Скрытый текст: ПОКАЗАТЬ
Писать диздок спустя несколько лет разработки и множества изменений концепции - исконная русская девелоперская традиция.
Re: BeaRLib
Как сейчас обстоят дела с зерном (надо передать и по идее вернуть тоже неплохо было бы) ? Для Хода тут понадобилось оно , если не будет ответа некоторое время, сам полезу ручонками добавлять по своему усмотрению, хотя, конечно, постараюсь как-то соблюсти архитектуру и учесть размышления из темы.JustHarry писал(а): Зерно генерации передать не проблема
- Apromix
- Мастер
- Сообщения: 1236
- Зарегистрирован: 04 июл 2011, 10:44
- Откуда: Украина, Черновцы
- Контактная информация:
Re: BeaRLibMG - генератор карт
Добавил в либу еще 2 генератора комнат
- Вложения
-
- 222.png (9.94 КБ) 3642 просмотра
-
- 111.png (10.75 КБ) 3642 просмотра
Re: BeaRLibMG - генератор карт
JustHarry так что насчёт зерна ? Я добавил его установку в либу, но у меня не робит оно, дебаг ни к чему не привёл. Если будет возможность, давай на это дело скооперируемся, ибо в ходе некоторый кусочек функциональности из-за этого пропадает.
Re: BeaRLibMG - генератор карт
Там в начале CreateMap идет Randomize; который сбивает зерно. Так что если выставляем зерно - надо его убрать.phomm писал(а):Я добавил его установку в либу, но у меня не робит оно, дебаг ни к чему не привёл.
Re: BeaRLibMG - генератор карт
Спасибо, конечно, за совет. Я эти вещи отследил сразу.
Я сам конечно виноват, наверное, не указал ранее вот этого http://code.google.com/p/heart-of-darkn ... erator.pas
Проблема там в том, что я даже отдебажить не могу, брякаюсь до установки зерна в либе - а оно точно такое же как и зерно приложения (которое уже установлено и я по сути только делаю синхронизацию между либой и аппом) - у меня закрадываются сомнения, что я не могу таким образом (дебажа либу, по сути запущенную из аппа) увидеть родное зерно либы, а ввиду глобальности переменной RandSeed можно предположить, что мой код меняет зерно аппа, а не либы.. я уж боюсь варианта что у них единое зерно (но тогда почему бы не работала моя схема), хотя вся логика, конечно, говорит против этого варианта.
Пока писал пост, возникла хитрая мысль установить в аппе зерно одно, а передавать в либу другое (на данный момент я только лишь синхронизировал, т.е. выставлял одинаковые) и поглядеть что будет, хотя бы понять на каком этапе я мог лажануть.
Я сам конечно виноват, наверное, не указал ранее вот этого http://code.google.com/p/heart-of-darkn ... erator.pas
Проблема там в том, что я даже отдебажить не могу, брякаюсь до установки зерна в либе - а оно точно такое же как и зерно приложения (которое уже установлено и я по сути только делаю синхронизацию между либой и аппом) - у меня закрадываются сомнения, что я не могу таким образом (дебажа либу, по сути запущенную из аппа) увидеть родное зерно либы, а ввиду глобальности переменной RandSeed можно предположить, что мой код меняет зерно аппа, а не либы.. я уж боюсь варианта что у них единое зерно (но тогда почему бы не работала моя схема), хотя вся логика, конечно, говорит против этого варианта.
Пока писал пост, возникла хитрая мысль установить в аппе зерно одно, а передавать в либу другое (на данный момент я только лишь синхронизировал, т.е. выставлял одинаковые) и поглядеть что будет, хотя бы понять на каком этапе я мог лажануть.
- Jesus05
- Сообщения: 1840
- Зарегистрирован: 02 дек 2009, 07:50
- Откуда: Норильск, сейчас Санкт-петербург.
- Контактная информация:
Re: BeaRLibMG - генератор карт
Я конечно в делфи нифига не понимаю
Но мне кажется тебе надо добавить в либе в процедуру еще 1 параметр
и установить RandSeed сразу после начала процедуры.
ну или даже так...
(не уверен что последний кусок кода рабочий но думаю понятно что если seed на входе равен нуля то делать рандомную карту не основанную на входящем зерне);
адд: убрал точку с запятой перед else.
Но мне кажется тебе надо добавить в либе в процедуру еще 1 параметр
Код: Выделить всё
procedure CreateMap(X, Y, ID: Integer; var A: TBeaRLibMap; S: Integer; SEED: Integer);
Код: Выделить всё
RandSeed := SEED;
Код: Выделить всё
if SEED = 0 then Randomize
else RandSeed := SEED;
адд: убрал точку с запятой перед else.
Последний раз редактировалось Jesus05 13 фев 2013, 06:12, всего редактировалось 1 раз.
Re: BeaRLibMG - генератор карт
В предыдущем посте только точка с запятой перед else лишняя, а в остальном согласен.
Re: BeaRLibMG - генератор карт
Хорошо, попробую по Вашему, для меня, конечно, нет существенной разницы в установке зерна отдельной процедуркой, но памятуя предыдущие опыты , готов уж поверить и в такую магию )
Тут ещё надо заметить, что вне либы вся та же схема работала на ура. Ставилось зерно и внутренний ходовский генер рисовал идентичные карты (которые постом постобработкой немного модифицированились, получались сносные "сейвы" межуровневые) а вот с либой не проходит такой способ и всё тут.
Тут ещё надо заметить, что вне либы вся та же схема работала на ура. Ставилось зерно и внутренний ходовский генер рисовал идентичные карты (которые постом постобработкой немного модифицированились, получались сносные "сейвы" межуровневые) а вот с либой не проходит такой способ и всё тут.
- Cfyz
- Сообщения: 776
- Зарегистрирован: 30 ноя 2006, 10:03
- Откуда: Санкт-Петербург
- Контактная информация:
Re: BeaRLibMG - генератор карт
phomm писал(а):я уж боюсь варианта что у них единое зерно
Я, возможно, немного не в фокусе ситуации, но глобальные переменные при динамической линковке как раз-таки одни на все приложение (edit: кроме случаев, когда явно указано иное). Т. е. то, что зерно генератора едино для .exe и .dll, это совершенно нормально и полностью ожидаемо.phomm писал(а):готов уж поверить и в такую магию
Пытается раскуклиться
Re: BeaRLibMG - генератор карт
Я слабо верю, что у либы и ехе могут быть общие глобальные переменные. У них даже менеджер памяти разный. Может в каких-нибудь с++ либа и экспортирует сама какие-то переменные, но в паскале вроде такого нет - список того что экспортировать указывается явно.
- Cfyz
- Сообщения: 776
- Зарегистрирован: 30 ноя 2006, 10:03
- Откуда: Санкт-Петербург
- Контактная информация:
Re: BeaRLibMG - генератор карт
Не просто могут, а очень даже есть.kipar писал(а):Я слабо верю, что у либы и ехе могут быть общие глобальные переменные. У них даже менеджер памяти разный. Может в каких-нибудь с++ либа и экспортирует сама какие-то переменные, но в паскале вроде такого нет - список того что экспортировать указывается явно.
1. Явно: в таблице экспорта указывается лишь адрес, туда можно положить при сборке и, соответственно, импортировать в приложении хоть функцию, хоть переменную. Тут нужна поддержка языка.
2. Косвенно: вспомни, как вообще работает динамическая линковка. Если A.exe использует B.dll и С.dll, а B.dll тоже использует С.dll, то сколько экземпляров С.dll будет в памяти? Один, с одной своей глобальной переменной, которая будет как бы общей для A.exe и B.dll. Тут никакой языковой поддержки не нужно.
По поводу менеджеров памяти это вы зря. Вся адекватная работа с памятью как раз и строится на возможности косвенно расшарить данные между модулями. Иначе было бы невозможно создать объект (выделить память) в одном модуле, а удалить его (освободить память) в другом. Но поскольку malloc/free и все необходимые им структуры данных существуют в единственном экземпляре на процесс, все прекрасно работает.
В Windowd роль C.dll может играть msvcrtXX.dll. Это майкрософтовская реализация стандартной библиотеки языка С, которая куда только не линкуется -- там и менеджер памяти, и черт в ступе. Если вспомнить нездоровую любовь С к непотокобезопасным функциям (что начало исправляться лишь относительно недавно), одна-две глобальные переменные никого не удивят.
Впрочем, есть вариант и когда все как будто бы отдельно. Статическая сборка + никаких глобальных переменных. Тогда в каждом модуле своя собственная копия менеджера памяти, своя куча, свои переменные на этой куче. У этого подхода есть свои плюсы, есть и куча минусов. Плюсы как правило только в *nix, собрать честную статическую сборку на винде практически невозможно и она крайне нестабильна.
Пытается раскуклиться
Re: BeaRLibMG - генератор карт
Вот собственно , опять же надо было мне указать - http://code.google.com/p/heart-of-darkn ... s/uMap.pas
Тут и стат и дин линковка пробовалась, обе не дают ожидаемого результата. Я тоже думал про разные менеджеры памяти и разные адресные пространства для данных, куда должна, по идее, попасть глоб. переменная из модуля system, но не сообразил, за что бы можно было зацепиться, чтоб порешать проблему.
Вчера пробовал ещё и способ с передачей зерна прямо в функцию генера - результата не заметил, подебажил немного, сколько было времени - не нащупал ничего. Потом ещё попробую, просто была мысль тут может кто просветит из рогалиководоведов (те кто изучают рогалиководов ) , встречались может с чем-то таким.
Начинаю опасаться, что это может быть проблема чисто паскалева, ибо гугление как-то ничего не даёт.. возможно, слишком узкая тема.
При таком подходе подумываю, может переписать либу на что-то другое, чисто по идее, не должно быть проблемой, обычная пачка процедур с циклами.
Тут и стат и дин линковка пробовалась, обе не дают ожидаемого результата. Я тоже думал про разные менеджеры памяти и разные адресные пространства для данных, куда должна, по идее, попасть глоб. переменная из модуля system, но не сообразил, за что бы можно было зацепиться, чтоб порешать проблему.
Вчера пробовал ещё и способ с передачей зерна прямо в функцию генера - результата не заметил, подебажил немного, сколько было времени - не нащупал ничего. Потом ещё попробую, просто была мысль тут может кто просветит из рогалиководоведов (те кто изучают рогалиководов ) , встречались может с чем-то таким.
Начинаю опасаться, что это может быть проблема чисто паскалева, ибо гугление как-то ничего не даёт.. возможно, слишком узкая тема.
При таком подходе подумываю, может переписать либу на что-то другое, чисто по идее, не должно быть проблемой, обычная пачка процедур с циклами.
Re: BeaRLibMG - генератор карт
Но если посмотреть на таблицу экспорта, то там никаких левых переменных нет, только то что указали в директиве export.Cfyz писал(а):1. Явно: в таблице экспорта указывается лишь адрес, туда можно положить при сборке и, соответственно, импортировать в приложении хоть функцию, хоть переменную. Тут нужна поддержка языка.
Но с A.exe она будет не связана.Cfyz писал(а):2. Косвенно: вспомни, как вообще работает динамическая линковка. Если A.exe использует B.dll и С.dll, а B.dll тоже использует С.dll, то сколько экземпляров С.dll будет в памяти? Один, с одной своей глобальной переменной, которая будет как бы общей для A.exe и B.dll. Тут никакой языковой поддержки не нужно.
В частности, A.exe и B.dll могли быть собраны разными версиями паскаля и fpc, а т.к. в них даже алгоритм рандома разный, то странно было бы ожидать что зерно может быть общим.
Но паскаль то использует собственный менеджер памяти поверх malloc, и он как раз разный. Поэтому в старых версиях дельфи нельзя было передавать в библиотеку и назад AnsiString. Только когда начиная с 2007 перешли на менеджер FastMem эта проблема исчезла.Cfyz писал(а):По поводу менеджеров памяти это вы зря. Вся адекватная работа с памятью как раз и строится на возможности косвенно расшарить данные между модулями. Иначе было бы невозможно создать объект (выделить память) в одном модуле, а удалить его (освободить память) в другом. Но поскольку malloc/free и все необходимые им структуры данных существуют в единственном экземпляре на процесс, все прекрасно работает.
Но в паскале он не используется.Cfyz писал(а):В Windowd роль C.dll может играть msvcrtXX.dll. Это майкрософтовская реализация стандартной библиотеки языка С, которая куда только не линкуется -- там и менеджер памяти, и черт в ступе. Если вспомнить нездоровую любовь С к непотокобезопасным функциям (что начало исправляться лишь относительно недавно), одна-две глобальные переменные никого не удивят.
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 16 гостей