» TeamX (Архив Форума)«


Форум TeamX » Исследования » World Map Timer (модификация Fallout2 Engine)

Переход по темам
<< Пред. След. >>
Единственная страница этой темы

 
Ray
Модератор

Откуда: Донецк,Украина
Регистрация: Янв. 2004

Всего: 746 сообщений

Ссылка для скачивания

По ссылке можно скачать rar архив со всеми требуемыми файлами. А теперь собственно описание того, что вы найдёте внутри:

Это моя первая серьёзная работа по модификации движка Ф2. На этом форуме неоднократно всплывали темы (а также моды), в которых обсуждалась возможность добавления в игру голода и т.п. В большинстве же случаев всё сводилось к тому, что мы не можем заставить игрока остановиться (прекратить движение по карте) в нужный нам момент. Т.е. если скажем у игрока еды на 2 дня он может без проблем пробегать хоть год и умрёт лишь при заходе на карту. Были и ещё идеи, которые не были реализованы именно по причине того, что мы никак не можем влиять на карту мира. Покрайней мере не могли раньше.
Собственно как всем известно скриптов для карты мира нет, как нет и никаких возможностей повлиять на игрока. Добавить скрипты для карты мира я конечно же не могу (без исходников уж точно), но я попробовал реализовать таймер. В глобальном плане этот таймер может пригодиться отнюдь не только для реализации голода. Всё ограничивается лишь вашей фантазией

Как всё это работает
В архиве вы найдёте следующие файлы:

  • fallout2.exe
  • Worldmap Patch.exe
  • VAULT13.GAM
  • OBJ_DUDE.INT

Первый файл собственно и есть движёк фолла, с внесёнными в него мной изменениями. В принципе одного его достаточно для мода. Остальные файлы для таймера совершенно не нужны (Worldmap Patch - идёт как дополнение к моду и используется для быстрых ПК, но об этом ниже). Движёк взят от Фаргуса - на остальных версих тоже заработает, но будет неприятное шипения в диалогах (пока не существенно). Позже я сделаю патч отдельным исполнительным файлом и для всех версий.

VAULT13.GAM - в принципе подойдёт и родной от фолла. Просто в том что в архиве подписаны движковые переменные, которые используются модом.
OBJ_DUDE.INT - нужен лишь для тестирования и отладки.

Принцип работы:
Для WMT (World Map Timer) мода в vault13.gam зарезервировано 3 глобальных переменных:
GVAR_ENGINE_WMT_COUNT   (640)
GVAR_ENGINE_WMT_LIMIT         (641)
GVAR_ENGINE_WMT_MAP           (642)

В игре передвижение по карте мира осуществляется по точкам (шаги цикла). На каждом шаге цикла осуществляется передвижение по карте (на разное расстояние, в зависимости от того какая приходимость, есть ли машина, её апгрейды и т.п.), а также на каждом шаге цикла увеличивается общий таймер игры на 18000 тиков (30 мин). Я же добавил в этот цикл алгоритм, который получает значение 640 гвары и увеличивает его также на 18000 тиков.
Таким образом в 640 гваре у нас находится количество времени - сколько игрок прошёл (проехал) по карте мира.
В 641 гваре находится время срабатывания таймера.
Я также добавил алгоритм, который сравнивает значение 640 и 641 гвар и в случае, если значение 640 гвары больше 641 прекращается передвижение по карте мира и вызывается карта (не город!!!) с номером равным значению 642 гвары. Номера городов в maps.txt
В случае если значение 641 гвары меньше 0 (рекомендую ставить -1) - срабатывание таймера будет отключено.

Т.е. ещё раз подробно:
Допустим мы хотим, чтобы таймер сработал спустя 3 игровых дня после заданного времени (если конечно игрок будет двигаться по карте). Для этого мы обнуляем 640 гвару (обнуляем счётчик). А в гвару 641 записываем число равное 3 дням в тиках (значение 641 гвары из архива). В 642 гвару мы записываем номер карты, на которой должен появится игрок. На каждом шаге передвижения по карте мира счётчик (640 гвара) будет увеличиваться и когда его значение будет превышать значение из gvar 641 игрок появится на нужной карте. В obj_dude советую поместить проверку - стоит ли обнулять таймер, стоит ли его выключить (если этого не сделать, то на каждом шаге цикла передвижения, при условии что GVAR_ENGINE_WMT_LIMIT<GVAR_ENGINE_WMT_COUNT игрок будет появляться на заданной карте).
Важно (1): если в момент срабатывания таймера игрок будет находиться в пределах города (зелёный круг на карте) - срабатывание таймера не произойдёт и игрок не появиться на нужной карте, но как только он сойдёт с города - тогда сразу сработает таймер.

Важно (2) - Обратите внимание: поскольку реализация передвижения по карте мира в движке игры реализована так как она есть реализация таймера косвенно связанна со случайными встречами. И тут возникает такая ситуация, что срабатывание таймера может происходить с погрешностями (т.е. не сразу как только счётчик сравняется с пределом). Чем выше производительность ПК - тем больше погрешность. Именно для этого я положил в архив worldmap patch. Для уменьшения погрешности (сведения к минимуму) при помощи утилиты следует настроить игру так, чтобы передвижение по карте мира (в плане случайных встреч) было максимально приближено к оригиналу (на старых ПК). Для этого надо запустить утилиту и подобрать значение второго параметра ("Encounter rate". Для сравнения:

процессор Athlon XP 2500+

Допустимая(нормальная) погрешность: около одного шага цикла - т.е. 30 мин
Для игры соответствующей оригиналу - использован worldmap patch: от 30 мин. до 2-4 часов
Для игры без патча: от 5 часов до 7 дней

Почувствуйте разницу

И последнее. В архиве находится obj_dude.int
Нужен лишь для тестирования:
При процедуре look_at_p_proc выводится значение 640 и 641 гвар и обнуляется счётчик
При description - выключатется таймер (set_global_var(641, -1))

Вроде всё. Если нужны дополнительные пояснения - спрашивайте. Реализация голода запросто делается путём правки map_exit в obj_dude.

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

Несмотря на всю кажущуюся лёгкость это была долгая работа и надеюсь не последняя

-----
Не бывает невозможных задач – бывает мало времени.

Отправлено: 0:57 - 15 Дек., 2007
Jordan 63
Пользователь

Откуда: Россия, Самара
Регистрация: Июль 2007

Всего: 228 сообщений

Ray

Ну что могу сказать это круто!

В vault13.gam я изменял на разные дни чтобы 3.5,10 все работает как часы но вот когда я пропатчил наверное я неправильно вводил числа то первый раз карта вызвалась через 3 часа следущая через 1 день.

Можешь подробнее обьяснить как этой патчилкой пользоваться для особа непонимающих)

У меня комп

Intel Celeron D, 3066 MHz

Какие нужно вводить числа!


Отправлено: 7:40 - 15 Дек., 2007
Ray
Модератор

Откуда: Донецк,Украина
Регистрация: Янв. 2004

Всего: 746 сообщений

Цитата:
В vault13.gam я изменял на разные дни чтобы 3.5,10


Вовсе не обязательно ставить дни. Шаг таймера 30 мин. Можно ставить 2,5 часа и т.п.

Цитата:
Можешь подробнее обьяснить как этой патчилкой пользоваться для особа непонимающих)

У меня комп

Intel Celeron D, 3066 MHz


Всё просто. Делается подбором. Для начала разберёмся с первым параметром. Это время задержки в милисекундах для каждого шага цикла перемещения. Т.е. фактически на каждом шаге ставится пауза. Попробуй значение 20. Если игрок перемещается слишком быстро - увеличивай этот параметр.
Теперь перейдём к случайным встречам - за это отвечает второй параметр. Это сугубо субъективное значение. Для оригинальной игры это значение равно 1500. Чтобы увеличить частоту появления случайных встреч надо уменьшать это значение (второго параметра). Для твоего ПК попробуй где-то 350-400. Если не устроит - увеличивай\уменьшай. Тут нужно лично каждому подбирать.

P.S. А вообще, чем ниже второй параметр патча - тем меньше погрешность срабатывания таймера. При значении равном 0 - погрешность не превышает 30 мин. Но тогда случайные встречи происходят слишком часто. Да и смысла от такой маленькой погрешности нет - как по мне то 4 часа - в пределах допустимого. Так что надо подбирать так, чтобы игра работала как это было задумано разработчиками (когда компы были слабыми) и WMT при этом будет работать нормально.

-----
Не бывает невозможных задач – бывает мало времени.

Отправлено: 14:44 - 15 Дек., 2007
Wasteland Ghost
Маленькое Злое Привидение

Откуда: Россия, Самара
Регистрация: Дек. 2002

Всего: 2251 сообщение

А нельзя вызвать случайную встречу через обычный стандартный if в worldmap.txt? If(Global(640) > 2000) ... Т.е. не зашивать в двиг конкретную карту и лимит, а пользоваться стандартными средствами? Насколько я понимаю, главная проблема в том, чтобы сделать счётчик, т.е. приращение какой-то гвары во время движения по карте мира. А дальше всё стандартно.

Отправлено: 10:17 - 20 Дек., 2007
Ray
Модератор

Откуда: Донецк,Украина
Регистрация: Янв. 2004

Всего: 746 сообщений

Цитата:
А нельзя вызвать случайную встречу через обычный стандартный if в worldmap.txt? If(Global(640) > 2000)


Конечно можно. Более того, я с самого начала так и делал (у меня естественно не было очень большого желания возиться с загрузкой карты через движёк. Если посмотреть на работу над WMT, то таймер - это 3 процента от всего объёма). Я ставил такую проверку, увеличивал вероятность до 100% и делал первой встречей (т.к. хоть у остальных встреч и были вероятности 3%, но в начале могли сработать именно они, а не таймер). Но есть один небольшой минус и один просто огромный (как выяснилось). Небольшой - пришлось бы переделывать все таблицы случайных встреч в worldmap.txt. А огромный - в связи с особенностью реализации случайных встреч в движке были (проверено) просто громадные погрешности срабатывания таймера. И поэтому я написал ещё и загрузку карт.

Цитата:
Т.е. не зашивать в двиг конкретную карту и лимит


А я конкретную карту и не зашивал Номер карты для загрузки - значение 642 гвары.

P.S. А вообще есть вариант как переделать WMT так, чтоб погрешности не было вообще. Надо будет заняться этим.

-----
Не бывает невозможных задач – бывает мало времени.

Отправлено: 11:25 - 20 Дек., 2007
Wasteland Ghost
Маленькое Злое Привидение

Откуда: Россия, Самара
Регистрация: Дек. 2002

Всего: 2251 сообщение

Цитата:
P.S. А вообще есть вариант как переделать WMT так, чтоб погрешности не было вообще. Надо будет заняться этим.

Это будет лучше. Получится новый вид случайной встречи, а не просто узкоспециальная вестч.

PS Я не ругаю . За работу решпект! Просто всегда хочется большего .

Отправлено: 17:38 - 26 Дек., 2007
Ray
Модератор

Откуда: Донецк,Украина
Регистрация: Янв. 2004

Всего: 746 сообщений

Скажем так - стратегия улучшения WMT:

1) Свести к нулю (в идеале) - погрешность при использовании WMT через скрипты (как и было запланировано). Через установку таймера и т.д. В данном случае погрешность будет минимальна.
2) Попробовать уменьшить погрешность срабатывания таймера при использовании worldmap.txt В данном случае погрешность при любых раскладах останется - так уж случайные встречи реализованы в движке.

Фактически, использовать worldmap.txt можно уже сейчас. В случаях не требующих ювелирной точности и допускающих 1-N дней погрешности (хотя при замедленом передвижении, как в оригинале игры, погрешность значительно меньше). Единственное различие между "скриптовым" вариантом и вариантом случайных встреч - во втором случае можно одновременно делать большое количество проверок и для разных зон карты, а также добавлять другие условия. Конечно же такой вариант более "гибкий"
Для узкоспециализированных случаев (голод и т.п.) гораздо предпочтительнее использовать первый вариант.

Я всегда "ЗА" конструктивную критику

-----
Не бывает невозможных задач – бывает мало времени.

Отправлено: 20:49 - 26 Дек., 2007 | ИСПРАВЛЕНО: Ray - 20:04 - 26 Дек., 2007
 

Переход по темам
<< Пред. След. >>
Единственная страница этой темы


Powered by Ikonboard 2.1.9 RUS
Modified by RU.Board Team
© 2000 Ikonboard.com