fallout.ru

Отслеживание времени

Существуют разнообразные способы, в том числе и недокументированные, заставить события выполняться строго по очереди, в зависимости от времени.

Таймер

GetSecondsPassed (возвращает float)

Функция позволяет создать простой секундомер, время которого будет увеличиваться не посекундно, а гораздо чаще. Рассмотрите следующий пример:

Begin TimerScript

Float timer
Short state

Set timer to (timer + GetSecondsPassed)

If (timer > 10)
            MessageBox “Отображается каждые 10 секунд”
            Set timer to 0
Endif

End TimerScript

Глобальные переменные времени Морровинда

GameHour (глобальная переменная типа float) ;час
Day (глобальная переменная типа short) ;день
Month (глобальная переменная типа short) ;месяц
Year (глобальная переменная типа short) ;год

Эти глобальные переменные устанавливаются и меняют свои значения по ходу игры.

Морровинд начинается в 16 день 7 месяца 427 года (16 Последнего Семени).

Месяц
Продолжительность
Солнечного Рассвета – Suns Dawn
31
Первого Семени – First Seed
28
Руки Дождя – Rain’s Hand
31
Второго Семени – Second Seed
30
Середины Года – Mid Year
31
Высоты Солнца – Sun’s Height
30
Последнего Семени – Last Seed
31
Сердечного Огня – Heart Fire
31
Падения Мороза – Frost Fall
30
Солнечного Заката – Suns Dusk
31
Вечерней Звезды – Evening Star
30

Похоже, Bethesda торопилась и, в итоге, потеряла месяц Утренней Звезды, поэтому в игре всего 334 дня! Суть ошибки заключается в том, что последний месяц года ссылается на второй месяц, как на следующий после себя. Если вручную поставить текущий месяц на 0, то будет отображён месяц Утренней Звезды. Так что эту ошибку вполне можно исправить с помощью глобального скрипта.

Пример: проверка времени в игре с помощью переменной GameHour.

Begin AfternoonTea

If ( GameHour >= 17 )
            If ( GameHour <= 19 )
                        “Cup of Tea” -> Enable
            endif
elseif ( GameHour < 17 )
            if ( GameHour >19 )
                        “Cup of Tea” -> Disable
            endif
endif

End AfternoonTea

Проверка на прошествие дней

Day (глобальная переменная типа short)

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

Short localdaysPassed
Short currentDay

if ( currentDay != Day ) ;как только значение переменной Day меняется
            set currentDay to Day
            set localdaysPassed to localdaysPassed + 1 ;увеличить показания счётчика на 1
endif

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

Лунные фазы

Просто незаменимые функции для мода об оборотнях:

GetMasserPhase (возвращает short)
GetSecundaPhase (возвращает short)

If ( GetMasserPhase == 4 )
            [активизировать оборотней]
endif

Заметьте: файл помощи упоминает неверную функцию GetSecundusPhase, вместо GetSecundaPhase. Также учтите, что эти функции возвращают фазу лун, которую игрок видел в последней наружной локации.

Я провёл лишь небольшое тестирование этой возможности, однако, вроде бы всё работало.
Обе функции могут возвращать следующие значения:

0 = Новолуние (по умолчанию)
1 = Четверть убывающей или растущей луны
2 = Половина убывающей или растущей луны
3 = Три четверти убывающей или растущей луны
4 = Полнолуние