Голосование

Как вы оцениваете Смуту?












Оформление



Пользователей
  • Всего: 28882
  • Последний: Gewa95
Сейчас на форуме
Пользователи: 3
Гостей: 707
Всего: 710

0 Пользователей и 1 Гость просматривают эту тему.

Тема: [OSP] MB Warband - Порт и Управление Судном  (Прочитано 7877 раз)

  • Сообщений: 91
  • За создание технических проектов различного характера
    • Просмотр профиля
    • Profile
+8
« : 04 Декабря, 2014, 01:38 »

Intro:
http://youtu.be/hcJ1TR3JwgQ

en-board: http://forums.taleworlds.com/index.php/topic,318130.0.html
Скачать: osp_seaway_v0.1_unfinished.zip

Доступно:
+ сцена порта
+ покупка / аренда судна
+ управление судном

Команды управления:
+ [LEFT_ALT] - открыть Командную Строку или установить фокус
+ [RIGHT_ALT] - закрыть Командную Строку
+ 'help' - показать все доступные команды
+ 'sail on' - поднять паруса (отойти от причала)
+ 'sail off' - спустить паруса и остановиться
+ 'ahead' - двигаться вперед
+ 'astern' - двигаться назад
+ 'left' - двигаться вперед и влево
+ 'right' - двигаться вперед и вправо
+ 'mooring' - швартовка




« Последнее редактирование: 12 Марта, 2015, 19:53 от Shcherbyna »
  • Сообщений: 91
  • За создание технических проектов различного характера
    • Просмотр профиля
    • Profile
+2
« Ответ #1 : 04 Января, 2015, 19:19 »
Чет после праздников тяжко вспоминается что и как делалось..=] А ну-ка оставлю техдоки.. может у кого мысли в тему появятся...


[OSP] Harbour + Ship Navigation

Глобальные переменные:
+ "$g_ship_navigation_is_active" -  для определения, установлен ли мод (1 = мод установлен). Определяется один раз на старте игры в скрипте script_game_start.

+ "$g_navigation_ship_instance" - инстанс судна, которым может управлять игрок. Устанавливается при создании судна на сцене порта. Обновляется при смене видимости - парус/без паруса.
+ "$g_sail_command" - текущая команда управления судном
+ "$g_navigation_player_on_ship" - флаг "игрок заходит в порт на судне"

+ "$g_check_scene_borders" - флаг активации проверки границ сцены (harbour_mt).  Флаг устанавливается в 1 при команде "sail on", заходе в порт ("mnu_proceed_to_port"), сбрасывается в 0 при "sail off" и выходе со сцены порта через границы судном.
+ "$g_navigation_mooring_wait_timer" - (1/0) включить-выключить таймер ожидания конца процесса швартовки

+ "$g_navigation_wind_direction" - направление ветра. Устанавливается случайное число от 0 до 360 в скрипте script_game_start. Затем каждые 12 часов обновляется в simpl_триггерах.
+ "$g_navigation_wind_strench"  - сила ветра. Устанавливается случайное число от 0 до 3  в скрипте script_game_start. Затем каждые 12 часов обновляется в simpl_триггерах.. Доступные состояния перечислены в ship_navigation_constants.py

+ pos2  - позиция судна при расчете направления движения, на отшвартовке

Слоты судов (индивидуальные свойства):
+ slot_ship_status  - состояние судна. Обновляется при швартовке/отшвартовке/дрейфе... Доступные состояния перечислены в ship_navigation_constants.py
+ slot_ship_oposit_instance - содержит номер инстанса судна с/без паруса
+ slot_ship_navigation_dificulty  = 3 # содержит уровень сложности управления судном (для проверки судна на предмет возможности его управления игроком)
+ slot_ship_owner         = 4 # владелец судна (0 - AI, 1 - player). Прописывается при создании судов (harbour_mt > ti_after_mission_start) и при смене владельца.
+ slot_ship_swing_speed   = 5 # шаг качки. Используется при расчете качки судна (триггер on_ship_swing)
+ slot_ship_swing_angle   = 6 # направление качки. Используется при расчете качки судна (триггер on_ship_swing)
+ slot_ship_condition     = 7 # состояние судна (управляется игроком = 1, продается = 2, арендуется = 3)
+ slot_ship_speed         = 8 # скорость судна

Сцена порта (scn_town_harbour.sco):
 + Точки появления (z-высота = 0):
    -------- 0-29 - люди ---------
    0 - точка появления игрока в порту
    1 - точка появления игрока на судне заходящем в порт
    2 - Мастер порта
    3 - Агент порта
    4 - Судоторговец
    -------- 30-59 - корабли -----
    Места швартовки:
    30, 31  - у низкого причала
    32      - у высокого причала
    40 - 42(49) - места появлений судов в гавани порта
    TODO: 50-59       - места появлений лодок
    -------- 60-99 - маршруты судов -------
    TODO:


Сценарий порта (harbour_mission_templates.py):
  - ti_before_mission_start:
    + раздаются баннеры
  - ti_after_mission_start:
    + определяются границы сцены => максимальные\минимальные значения XY записываются в слоты сцены (см. harbour_constants.py)
    + берутся координаты точки у причала в зависимости от типа судна => определяется место появления судна
    + в точке появления создается 2 судна: с парусом "spr_ship" и без "spr_ship_sail_off". Судно с парусом прячется.
    + устанавливается глобальная ссылка на текущее видимое судно ("$g_navigation_ship_instance").
    + для каждого судна рассчитываются параметры качки.
  - через 2 сек после загрузки сцены добавляется звуковое окружение. TODO: добавить звук на конкретный объект, чтобы не плыть на судне под звуки собачьего лая.
  - по TAB'у выход в меню города если игрок на суше, иначе переход на карту на судне. TODO:Если игрок на судне перевозчика => переход на меню "Выход из гавани порта" и глобальная карта.
  - каждые 3 сек проверяется положение судна относительно границ сцены.
    Когда судно выходит за границы => переход на глобальную карту где игрок продолжает управлять судном (если судно его) TODO: или ждет, пока его доставит перевозчик.

Меню (harbour_game_menus.py)
 + mnu_ship_departure - меню-прокладка для выхода из сцены порта на глобальную карту.

Команды управления судном (ship_navigation_scripts.py и ship_navigation_mission_templates.py): Добавляются на все морские сцены
    + Все команды делятся на 3 типа: одноразовые (выполняются один раз после команды), циклические (выполняются постоянно до появления следующей команды) и таймерные (выполняются с задержкой). Одноразовые команды находятся в ship_navigation_scripts.py, циклические и таймерные в ship_navigation_mission_templates.py.
   
    + "sail on" (одноразовая) - поднять парус, отшвартоваться. (Команда выполняется без задержки, чтобы игрок сразу видел результат её работы.)
        Взять судно игрока (по хэндлу)
        Проверить его статус:
            если Не Управляется (дрейфует, NOT_UNDER_COMMAND) или Ошвартовано => поднять парус: берется судно без паруса, на его место ставится судно с парусом. Переключается их видимость. Судно без паруса убирается под сцену, так как по невидимому объекту тоже можно ходить.
                ... проверка на необходимость отшвартовки
            иначе => сообщение "Капитан, паруса уже подняты!"

            Далее выполняется отшвартовка судна с парусом:
            Берется угол поворота причала (точки швартовки) относительно оси z
            Берется угол поворота судна относительно оси z - курс судна, т.е "куда смотрит нос"
            Определяется, стоит ли судно у причала или дрейфует => берется дистанция между судном и причалом:
                если дистанция менее 20 метров => судно у причала
                Определяется каким бортом ошвартовано судно => сравниваются углы Z судна и причала
                    если курс судна меньше угла поворота причала => отойти вправо
                    иначе => отойти влево
                    ..на расстояние 1000 за время 5000
            Если судно дрейфует:
                никуда не отходить TODO: взять направление ветра и отойти в его направлении.
   
    + "sail off" (таймерная) - опустить парус, остановиться.
        Если судно стояло => сообщение "Капитан, судно уже остановлено!"
        Если судно под парусом, действие выполняется через 1-2 сек после команды, так как в реальности судно тоже останавливается не сразу.
            Судно с парусом останавливается, затем берутся его координаты.
            В эти координаты помещается судно без паруса. Переключается видимость судов.
            Судно с парусом убирается под сцену.
            Триггер отключается.
            Если судно не на мели, состояние судна обновляется на "Не управляется" (SHIP_STATUS_NOT_UNDER_COMMAND)
           
    + "ahead" (таймерная, циклическая) - двигаться вперед
        Если судно с опущенным парусом => сообщение "Капитан, судно не готово к движению!"
        Если судно под парусом, выполняется движение.
            Раз в секунду триггер берет позицию судна, двигает ее по Х вперед на 1000. (Раз в сек => потому как проверяются глубины).
            И за время 1000 двигает судно к новой точке (скорость на полном ходу).
           
    + "astern" (таймерная, циклическая) - двигаться назад
        Если судно с опущенным парусом => сообщение "Капитан, судно не готово к движению!"
        Если судно под парусом, выполняется движение.
            Раз в секунду триггер берет позицию судна, двигает ее по Х назад -1000.
            И за время 1500 двигает судно к новой точке (скорость назад должна быть меньше).
           
    + "right" (таймерная, циклическая) - поворачивать направо
        Если судно с опущенным парусом => сообщение "Капитан, судно не готово к движению!"
        Если судно под парусом, выполняется движение.
            Раз в секунду триггер берет позицию судна, двигает по Х вперед (скорость при повороте) и крутит Z на -32 градуса (максимальный угол закладки штурвала).
            И за время 1000 двигает судно к новой точке.
           
    + "left" (таймерная, циклическая) - поворачивать налево
        Если судно с опущенным парусом => сообщение "Капитан, судно не готово к движению!"
        Если судно под парусом, выполняется движение.
            Раз в секунду триггер берет позицию судна, двигает по Х вперед (скорость при повороте) и крутит Z на 32 градуса (максимальный угол закладки штурвала).
            И за время 1000 двигает судно к новой точке.
           
    + "mooring" (таймерная) - пришвартовать судно к причалу
        Если судно под парусом => сообщение "Капитан, судно нужно остановить!"
        Если судно с опущенным парусом => проверить состояние судна, не ошвартовано ли оно уже?
            Если ошвартовано => сообщение "Капитан, судно уже ошвартовано!"
            Иначе, если судно не на мели -> выполнить швартовку..
            ..Действие выполняется через 1-2 сек после команды, так как в реальности ничего мгновенно не происходит =) (TODO: отыграть анимацию матросов)
                Берутся координаты судна игрока "$g_navigation_ship_instance" и ближайшей точки швартовки (entry_no 30-39) =>
                Вычисляется дистанция между ними
                Если дистанция больше 20 м => сообщение "[Боцман]> Капитан, нам нужно подойти ближе к причалу!"
                Иначе продолжить швартовку:
                    Определяется, под каким углом судно подошло к причалу:
                    Дальше идут расчеты по схеме... после которых судно правильно становится к причалу.
                    Триггер отключается
                    После окончания швартовки обновляется состояние судна на "Ошвартовано" + сообщение боцмана
       
        Для того чтобы понять, как происходит расчет нужных координат для швартовки, нужно знать такие исходные данные:
            1) Координаты швартовки правым бортом известны, так как это координаты появления судна на сцене.
            2) команда position_get_rotation_around_z возвращает поворот объекта в пределах 0-360. К примеру судно у причала показывает поворот 293 градуса. Причал (точка швартовки) возвращает 203 градуса. 293 градуса это 203 + 90. Значит нужная нам плоскость причала = углу пришвартованного судна (293).
            3) Если судно подойдет к причалу под углом 90 градусов, то его можно швартовать любым бортом, но если оно подойдет под другим углом, нужно определить каким бортом оно ближе к причалу.
            4) Итак в 360-градусной окружности, причал (точка швартовки) имеет поворот по Z 203 - это низ перпендикуляра опущенного на причал. 203 + 90 = это продольная ось причала у которой стоит судно и на которую опускается перпендикуляр. 203 + 180 = это верх перпендикуляра.
            5) Таким образом, если угол поворота судна (его курс), будет от 203 (низ перпенд.) до 203+180 (верх перпенд.) => судно нужно швартовать правым бортом, координаты такие как при спауне судна на старте.
                иначе => судно нужно швартовать левым бортом, координаты такие как при спауне судна на старте только с минусом.
   
    + "wind" (одноразовая)      - узнать силу и направление ветра
    + "course" (одноразовая)    - узнать курс судна. Команда работает только на борту судна
    + "pos" (одноразовая)       - узнать позицию судна [X:Y]. Команда работает только на борту судна
    + "swing" (одноразовая)     - узнать крен судна. Команда работает только на борту судна
   
    ====== DEBUG =====
    + "gvars"   - показывает глобальные переменные и слоты. Команда работает при "$cheat_menu"=1
   
Аренда судна:
    + На сцене порта через диалог у Портового Агента можно арендовать судно. На руки Игрок получает Документ Аренды,
        который дает право управлять арендованным судном.
    + Плата за аренду взымается каждую неделю как при зарплате войскам ("prsnt_budget_report").
    + Если у игрока не оказалось достаточной суммы, из инвентаря Документ Аренды удаляется.
    + TODO: Если при этом Игрок находится в море, он теряе управление судном и будет высажен на ближайшей земле.
    + Если при реембарке у Игрока не оказалось Документа Аренды, на судно его не пустят, само судно после этого (TODO: отплывает и) исчезает.

Физика:
    + Сила и направление ветра значения глобальные и определяются на старте игры ("script_game_start"), затем, каждые 12 часов обновляться simple_триггером.
    + Качка - TODO: переписать - залипает. TODO:для каждого судна индивидуальное значение: большие суда и груженные качает меньше, пустые и маленькие - больше. Поэтому значение качки нужно держать в слоте каждого судна и пересчитывать при смене ветра.
      В текущей версии судно качает, если оно не управляется (без паруса) (TODO: или на якоре).
    + Посадка на мель (mt => on_grounding):
        Если судно на воде (идет или дрейфует) раз в 2 сек проверяются глубины его позиции в районе бака, миделя и кормы.
            Если глубины менее заданных мин. значений => судно останавливается + обновляется его статус на SHIP_STATUS_GROUNDING
            TODO: написать механизм снятия с мели. В текущей версии, при повторном заходе на сцену судно создается у причала.



+ Игрок может управлять только своим или арендованным судном (slot_ship_owner = 1)
+ Игрок может покупать (TODO: и арендовать) любое количество судов (например, у игрока большой отряд и всех нужно посадить на судно).
   TODO: При этом на карте возле города создаются "sail_off суда"
+ Если у игрока нет судна => у причала создается судно, которое можно арендовать.
   Иначе, создается судно игрока (первое в инвентаре) (slot_ship_owner = 1 (0=AI, 1=Player))
+ Когда игрок арендует судно у портового агента, получает на руки Документ Аренды Судна + у судна изменяется slot_ship_owner на 1
+ Если игрок покупает судно, на руки получает Паспорт Судна  + у судна изменяется slot_ship_owner на 1
- отработка команд тормозит при качке AI судов - отключил качку для AI
- мод не совместим с Учебным Модом, так как последний постоянного обновляет позицию "имен" агентов, при этом КоманднаяСтрока не успевает отработать введенную команду.
   Во время управления судном это критично.


=== History ===

+ добавлена акселерация - постепенное нарастание/затухание движения судна.
+ на карте появляются пираты, но пока нет боевой сцены при встрече с ними - исчезают.
+ добавлена остановка судна при посадке на мель. TODO: как сойти с мели? unberthing, "скинуть груз", "подать сигнал бедствия"
+ увеличена сцена порта
+ при наличии нескольких судов у игрока, у причала создается то, которое стоит первым в инвентаре, (TODO: остальные на рейде).
+ прописан слот difficulty в паспорт судна.
v.0.1
+ поправлена опция Лагеря "Подождать некоторое время" для судна
+ добавлены Навигационные Сертификаты. TODO: добавить проверку на сложность управления судном и наличием необходимого сертификата.
+ возврат фокуса в Командную Строку по LEFT_ALT при не отработке введенной команды
+ добавлены новые суда на продажу (всего 5: 2 малых, 2 средних, 1 большое). У причала создается судно, которое стоит первым в инвентаре.
+ добавлены покупка и аренда судна. Арендованным судном можно управлять сразу, купленным - после повторного посещения сцены.
+ добавлены шаблоны диалогов для персонажей в порту.
+ добавлены Капитан порта, Агент порта и Судоторговец на сцену порта.
+ добавлено появление игрока на судне, при заходе в порт через меню Дизембарка
+ добавлена опция Proceed to Port ("Следовать в порт") для меню дизембарка, если это город у которого есть вода на расстоянии 6.
+ детализация сцены порта
+ добавлена проверка "Игрок на борту" как необходимое условие управления судном
v0.0.5
+ добавлена опция Go to Port ("Пройти в порт") для меню городов, возле которых есть вода на расстоянии 6.
+ добавлена качка судна, когда оно со спущенным парусом и не у причала. TODO: должна быть всегда, если сила ветра больше 0 и судно не ошвартовано.
+ добавлена команда управления судном "mooring" - швартовка
+ добавлены команды управления судном "right/left/sail off/astern"
+ разделил сцену Порта и Команды управления судном, так как командная строка должна пропатчить сценарий (mt) каждой морской сцены (пока только порта)
+ Поднялся на борт. С помощью команд "sail on" и "ahead" смог отшвартоваться и пойти вперед
+ Создал набросок сцены причала и судно


 (PS: ==Историю== читать с конца)
« Последнее редактирование: 12 Марта, 2015, 20:37 от Shcherbyna »
  • Сообщений: 25800
  • За победу в конкурсе "Знамя кальрадийца" И создали они сайт... За регистрацию на форуме не позже сентября 2008 года
  • Сервер Discord
    • Просмотр профиля
    • Всадники Кальрадии
0
« Ответ #2 : 23 Января, 2015, 21:29 »
Интересная концепция, но мне кажется, нынче проще воспользоваться наработками викингов.
  • Ник в M&B: [RUSMNB]Vanok
  • Фракция: Вегиры
И помните: "Хватит набивать посты" (NightHawkreal)
  • Сообщений: 91
  • За создание технических проектов различного характера
    • Просмотр профиля
    • Profile
0
« Ответ #3 : 24 Января, 2015, 15:53 »
Это так, проба сил.. начинал писал когда о викингах не слышал  (не читал новости=).. Проект начал расти, свободное время уменьшаться, в общем сейчас полный фриз.. выложу исходники как есть, до лучших времен. На самом деле довольно непросто гармонично организовать код, разделить его на независимые части, все начинает заплетаться одно за другое так что потом просто запутываешься.. а в голове вообще нереально удержать, нужно только описывать своими словами в техдоки. А если еще ставишь на паузу, пропадает азарт, а старые не поправленные баги давят и отбивают охоту вернуться к работе.  Жалко не успел написать боевую сцену вовремя, теперь не знаю когда вернусь. Такие дела.. Но в любом случае игра переросла в программирование, программирование в хобби, а там глядишь появится желание поработать с каким нибудь серьезным движком. Сам по себе MB не плох для стартапа. Он дает готовые инструменты для работы с объектами, сценами. Если отказаться от глобальной карты, можно спокойно писать 2d игры типа маджонга, ролевики типа Готика3 или даже современный ship simulator. Рисуй сцены, скриптуй поведение НПС, пиши события и квесты.. Когда это понимаешь, уже начинаешь задумываться как бы это сделать с нуля на стороннем движке, приходит понимание объемов и сложности работы. Смотрел по NHK интервью с создателями игр. В одиночку на разработку платформера в среднем уходит 1,5 - 2 года...
« Последнее редактирование: 24 Января, 2015, 16:17 от Shcherbyna »
  • Сообщений: 892
  • За создание крупных модов и других особо сложных проектов За создание технических проектов различного характера
    • Просмотр профиля
0
« Ответ #4 : 10 Марта, 2015, 16:23 »
Круто :D, а теперь в общих чертах куда все это, как я понимаю по частям в модульную вставлять, а куда  util_cmd_code_generator и  modmerger_options вставить и что за __init__ они ж пустые. Для человека воспитанного тетрисом это как то сложно :)
  • Сообщений: 91
  • За создание технических проектов различного характера
    • Просмотр профиля
    • Profile
+1
« Ответ #5 : 12 Марта, 2015, 19:13 »
..как я понимаю по частям в модульную вставлять

Нет, код написан для МодМержера и папки с кодом просто копируются в модульную, .sco-файлы в папку сцен игры, текстуры, brf'ы соответственно в свои папки.
util_cmd_code_generator - это вспомогательная утилитка для добавления в Командную Строку новых команд.. перевод текста в число (в игре она не используется, поэтому неважно где она лежит).
modmerger_options - это файл МодМержера в котором включаются мерж-паки/моды (появляется после установки мержера).
__init__.py - этот пустой файл является модуль-маркером.. т.е при компиляции питон заглянет в папку с этим файлом и отработает в ней скрипты. Простым языком говоря он позволяет держать скрипты в отдельных папках не смешивая их с нативными, объединять файлы строя логическую структуру мода/программы. Например все что относится к управлению судном лежит в папке ship_navigation. События и жизнь сцен находится в папке scenes. Папка global_map содержит такие вещи как создание пиратов на глобальной карте, фикс иконки лагеря при ожидании на судне и тд.. В свою очередь эти три папки объединяются в Seaway (Путь Моря).. Очень важно разделить одну сложную задачу на маленькие, это помогает при отладке возникающих ошибок. Каждая папка должна, насколько это возможно, являться самостоятельным юнитом.
Дополнительно про Мержер можно почитать тут: Инструментарий - [Other] Modmerger.

« Последнее редактирование: 12 Марта, 2015, 19:33 от Shcherbyna »
  • Сообщений: 3
    • Просмотр профиля
0
« Ответ #6 : 13 Сентября, 2015, 22:03 »
Интересная концепция, но мне кажется, нынче проще воспользоваться наработками викингов.
Вы не могли подсказать(дать ссылку), где можно взять ресурсы из Викингов или почитать об этом(OSP, модулька).
Пол форума перерыл, либо старое, либо непонятное.
  • Сообщений: 126
    • Просмотр профиля
0
« Ответ #7 : 14 Сентября, 2015, 20:08 »
xxxLogeinxxx  я так понимаю имелись в виду Viking Conquest  https://www.taleworlds.com/en/Games/VikingConquest
Насколько мне известно никаких ресурсов они не открывали.
По кораблям есть кое что на этом форуме
http://rusmnb.ru/index.php?topic=3390.0
http://rusmnb.ru/index.php?topic=11035.0
 и довольно много на официальном, например это, одно из последних
http://forums.taleworlds.com/index.php/topic,316581.0.html
ещё
http://forums.taleworlds.com/index.php/topic,163671.0.html
http://mbmodwiki.ollclan.eu/Seafaring
http://forums.taleworlds.com/index.php/topic,136095.0.html
http://www.mbrepository.com/file.php?id=2258
Если не знаете английский переводчик Вам в помощь   https://translate.yandex.ru/translate
К сожалению больше, помочь ничем не мог сам не разобрался.

Другой мод о Викингах
http://forums.taleworlds.com/index.php/board,202.0.html
« Последнее редактирование: 15 Сентября, 2015, 20:29 от world_silmarillion@bk.ru »
  • Сообщений: 3
    • Просмотр профиля
0
« Ответ #8 : 15 Сентября, 2015, 12:20 »
Спасибо Вам за информацию.
По кораблям есть кое что на этом форуме
http://rusmnb.ru/index.php?topic=3390.0

На счёт этого: я уже с ним пытался разобраться, но(как мне кажется) код написан либо под старую версию MBW, либо вообще под ИГ.
довольно много на официальном, например это, одно из последних
http://forums.taleworlds.com/index.php/topic,316581.0.html

Попробую это почитать и разобраться.
Ещё раз, Спасибо.

СиЧЪ Total War СиЧЪ Total War
Сайт "Всадники Кальрадии" не является СМИ. Администрация не несет ответственность за высказывания и публикацию каких-либо материалов, сделанные любыми пользователями форума, в том числе посредством личных и публичных сообщений. Материалы, размещенные на ресурсе третьими лицами, могут содержать информацию, не предназначенную для лиц, не достигнувших совершеннолетия. При обнаружении на ресурсе материалов, нарушающих законодательство Российской Федерации, необходимо обращаться к администрации.
Сайт работает на быстром VPS/VDS хостинге от FASTVPS


Powered by SMF 2.0 | SMF © Simple Machines LLC