OSP Порт и Управление Судном
Доступно:
Сцена порта
Покупка / аренда судна
Управление судном
Команды управления:
[LEFT_ALT] - открыть Командную Строку или установить фокус
[RIGHT_ALT] - закрыть Командную Строку
'help' - показать все доступные команды
'sail on' - поднять паруса
'sail off' - спустить паруса
'ahead' - двигаться вперед
'astern' - двигаться назад
'left' - двигаться вперед и влево
'right' - двигаться вперед и вправо
'mooring' - причалить
Глобальные переменные:
+ "$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" смог отшвартоваться и пойти вперед
+ Создал набросок сцены причала и судно
СКАЧАТЬ
СКАЧАТЬ
Источник информации
Комментариев 0
Посетители, находящиеся в группе Гости, не могут оставлять комментарии к данной публикации.