Предложение: если кто-нибудь возьмется писать учебник по OBSE,
До самого учебника, конечно, я не дозрела, но вот функции ввода текста, которые мне приходилось использовать, я переводила, для себя. Возможно, кому-то пригодятся они? Спасибо большое AleksTirex'у, который проверил и отредактировал этот перевод
PS Если отписалась не в той теме, то, пожалуйста, перенесите туда, где этот материал окажется на нужном месте)) Итак..
Функции ввода текста в OBSEhttp://cs.elderscrolls.com/constwiki/index.php/Text_Input_With_OBSEText Input With OBSEЭтот код будет принимать ввод текста с клавиатуры от игрока, а также отображать текст в MessageBox.
Требование:Extender Oblivion Script (OBSE) версии 0014 или выше.
Скрипт сохраняет строку в название объекта, для этого Вам необходим сам объект, определенный для этой цели. Этот объект может быть любым, который имеет имя и возможность быть активированным, желательно активатор.
Строка должна иметь начальное значение, которое заканчивается знаком акцента (`). Я использовал " `Ввести название `".
Чтобы использовать любое свое название, скрипт должен быть изменен в пяти местах - и у этих пяти мест это имя должно быть одинаковым. Эти пять мест были отмечены с комментариями "!!! INIT NAME!!! '".
Дополнительно, в двух из этих мест у названия должна быть замыкающая тильда (~).
Эти места были отмечены "w/~", а другие три были отмечены "w/o ~".
Имя не может быть "`~~`", если не изменить места, где эта строка используется в скрипте (в шести местах).
Кроме того, Вам необходим активатор, чтобы прикрепить к нему скрипт. Этот активатор должен быть размещен в мире, чтобы игрок мог активировать его, а так же он может быть активирован другим скриптом через RefID.
Недостатки:Как говорилось выше, у вводимого имени имеются некоторые специальные правила.
Скрипт поддерживает только латинские буквы, пробелы, тире и апостроф. Поддержка дополнительных символов относительно проста, но имейте в виду, что вам придется делать это самостоятельно, если вы захотите этого.
Кроме того, Caps Lock игнорируется. Учитывая, что он обычно используется для работы, то поддержка Caps Lock может быть добавлена в скрипт с минимальными усилиями.
Наконец, невозможно поддерживать знак акцента (`), тильды (~), точки с запятой (; ) или двойных кавычек (").
Сопутствующие функции.С этим кодом используются следующие функции:
GameMode
OnActivate
Activate
SetName
ModName
AppendToName
OnKeyDown
IsKeyPressed3
MessageBoxEX
Message
GetButtonPressed
Рекомендуется, чтобы у Вас было некоторое представление о том, что эти функции делают и как они работают.
Использование скрипта.В текстовом поле будет отображаться запись, когда объект, на котором висит скрипт, будет активирован. Активировать можно как сам объект, так и через другой активатор посредством кода: ActivatorRef.Activate player 1
Заключительные комментарии.Этот код был тщательно протестирован, и должен работать, если Вы указали String_Var для нужного объекта. Пояснение переводчика: String_Var - переменная строка, в которой будет храниться введенная информация. Для удобства ее добавляют в блок объявленных переменных.
Пример использования функцийscn TextInputBox
; Object script, goes on an Activator
short state
short caps
short button
ref StringVar
short bConsole
Begin GameMode
if ( state )
Activate player 1
endif
End
Begin MenuMode
if ( state )
Activate player 1
endif
End
Begin OnActivate
if ( state == 0 )
OnKeyDown 57 ; clears the counter from the initial press when activating the item
GetButtonPressed ; clears the counter as well
if ( StringVar == 0 )
set StringVar to INSERT_NAME_STORAGE_OBJECT_ID_HERE ; this is where your string gets stored
endif
SetName "`Enter Name`~" StringVar ; !!!INIT NAME!!! w/ ~
set state to 1
elseif ( state == 1 )
ModName "~|" StringVar
MessageBoxEx "%n|Done" StringVar ; the specific text can be changed to meet your needs
ModName "`Enter Name`|" StringVar ; !!!INIT NAME!!! w/o ~
AppendToName "~" StringVar
set state to 2
elseif ( state == 2 )
; first, standard MessageBox menu stuffs
set button to GetButtonPressed + 1
if ( button ) ; pressed Done
set state to 3
return
endif
; check for Console
if ( OnKeyDown 41 )
set bConsole to bConsole == 0 ; toggle bConsole
endif
if ( bConsole )
return ; return if in the Console (the rest of the commands break the Console)
endif
; now String-capturing code
set caps to 0
if ( IsKeyPressed3 42 ) || ( IsKeyPressed3 54 ) ; either Shift key
set caps to 1
endif
if ( OnKeyDown 16 )
if ( caps )
ModName "~|Q~" StringVar
else
ModName "~|q~" StringVar
endif
set state to 1
elseif ( OnKeyDown 17 )
if ( caps )
ModName "~|W~" StringVar
else
ModName "~|w~" StringVar
endif
set state to 1
elseif ( OnKeyDown 18 )
if ( caps )
ModName "~|E~" StringVar
else
ModName "~|e~" StringVar
endif
set state to 1
elseif ( OnKeyDown 19 )
if ( caps )
ModName "~|R~" StringVar
else
ModName "~|r~" StringVar
endif
set state to 1
elseif ( OnKeyDown 20 )
if ( caps )
ModName "~|T~" StringVar
else
ModName "~|t~" StringVar
endif
set state to 1
elseif ( OnKeyDown 21 )
if ( caps )
ModName "~|Y~" StringVar
else
ModName "~|y~" StringVar
endif
set state to 1
elseif ( OnKeyDown 22 )
if ( caps )
ModName "~|U~" StringVar
else
ModName "~|u~" StringVar
endif
set state to 1
elseif ( OnKeyDown 23 )
if ( caps )
ModName "~|I~" StringVar
else
ModName "~|i~" StringVar
endif
set state to 1
elseif ( OnKeyDown 24 )
if ( caps )
ModName "~|O~" StringVar
else
ModName "~|o~" StringVar
endif
set state to 1
elseif ( OnKeyDown 25 )
if ( caps )
ModName "~|P~" StringVar
else
ModName "~|p~" StringVar
endif
set state to 1
elseif ( OnKeyDown 30 )
if ( caps )
ModName "~|A~" StringVar
else
ModName "~|a~" StringVar
endif
set state to 1
elseif ( OnKeyDown 31 )
if ( caps )
ModName "~|S~" StringVar
else
ModName "~|s~" StringVar
endif
set state to 1
elseif ( OnKeyDown 32 )
if ( caps )
ModName "~|D~" StringVar
else
ModName "~|d~" StringVar
endif
set state to 1
elseif ( OnKeyDown 33 )
if ( caps )
ModName "~|F~" StringVar
else
ModName "~|f~" StringVar
endif
set state to 1
elseif ( OnKeyDown 34 )
if ( caps )
ModName "~|G~" StringVar
else
ModName "~|g~" StringVar
endif
set state to 1
elseif ( OnKeyDown 35 )
if ( caps )
ModName "~|H~" StringVar
else
ModName "~|h~" StringVar
endif
set state to 1
elseif ( OnKeyDown 36 )
if ( caps )
ModName "~|J~" StringVar
else
ModName "~|j~" StringVar
endif
set state to 1
elseif ( OnKeyDown 37 )
if ( caps )
ModName "~|K~" StringVar
else
ModName "~|k~" StringVar
endif
set state to 1
elseif ( OnKeyDown 38 )
if ( caps )
ModName "~|L~" StringVar
else
ModName "~|l~" StringVar
endif
set state to 1
elseif ( OnKeyDown 44 )
if ( caps )
ModName "~|Z~" StringVar
else
ModName "~|z~" StringVar
endif
set state to 1
elseif ( OnKeyDown 45 )
if ( caps )
ModName "~|X~" StringVar
else
ModName "~|x~" StringVar
endif
set state to 1
elseif ( OnKeyDown 46 )
if ( caps )
ModName "~|C~" StringVar
else
ModName "~|c~" StringVar
endif
set state to 1
elseif ( OnKeyDown 47 )
if ( caps )
ModName "~|V~" StringVar
else
ModName "~|v~" StringVar
endif
set state to 1
elseif ( OnKeyDown 48 )
if ( caps )
ModName "~|B~" StringVar
else
ModName "~|b~" StringVar
endif
set state to 1
elseif ( OnKeyDown 49 )
if ( caps )
ModName "~|N~" StringVar
else
ModName "~|n~" StringVar
endif
set state to 1
elseif ( OnKeyDown 50 )
if ( caps )
ModName "~|M~" StringVar
else
ModName "~|m~" StringVar
endif
set state to 1
elseif ( OnKeyDown 12 )
if ( caps )
ModName "~|_~" StringVar
else
ModName "~|-~" StringVar
endif
set state to 1
elseif ( OnKeyDown 57 )
ModName "~| ~" StringVar
set state to 1
elseif ( OnKeyDown 40 ) ; CANNOT type double-quote mark
ModName "~|'~" StringVar
set state to 1
elseif ( OnKeyDown 14 ) ; Backspace
Label 0
ModName "q~|" StringVar
ModName "w~|" StringVar
ModName "e~|" StringVar
ModName "r~|" StringVar
ModName "t~|" StringVar
ModName "y~|" StringVar
ModName "u~|" StringVar
ModName "i~|" StringVar
ModName "o~|" StringVar
ModName "p~|" StringVar
ModName "a~|" StringVar
ModName "s~|" StringVar
ModName "d~|" StringVar
ModName "f~|" StringVar
ModName "g~|" StringVar
ModName "h~|" StringVar
ModName "j~|" StringVar
ModName "k~|" StringVar
ModName "l~|" StringVar
ModName "z~|" StringVar
ModName "x~|" StringVar
ModName "c~|" StringVar
ModName "v~|" StringVar
ModName "b~|" StringVar
ModName "n~|" StringVar
ModName "m~|" StringVar
ModName "-~|" StringVar
ModName "_~|" StringVar
ModName " ~|" StringVar
ModName "'~|" StringVar
ModName " ~|" StringVar
AppendToName "~" StringVar
ModName "~~|~" StringVar
ModName "|`~~`" StringVar
ModName "`~~`~|`Enter Name`~" StringVar ; !!!INIT NAME!!! w/ ~
ModName "`~~`|" StringVar
if ( IsKeyPressed3 29 ) || ( IsKeyPressed3 157 ) ; Ctrl+Delete deletes an entire word.
if ( CompareName " ~" StringVar != 1 )
if ( CompareName "`Enter Name`" StringVar != 1 ) ; !!!INIT NAME!!! w/o ~
Goto 0
endif
endif
endif
set state to 1
elseif ( OnKeyDown 28 ) ; Enter - ends menu same as Done
set state to 3
endif
elseif ( state == 3 )
ModName "|`~~`" StringVar
if ( CompareName "`~~`~" StringVar )
SetName "`Enter Name`" StringVar ; !!!INIT NAME!!! w/o ~
Message "Must enter a new name."
set state to 1
else
ModName "`~~`|" StringVar
ModName "~|" StringVar
set state to 0
set button to 0
; include any code to use the string here
MessageBoxEx "Congratulations, you named it %n" StringVar
endif
endif
End
Функции ввода:http://cs.elderscrolls.com/constwiki/index.php/OpenTextInputOpenTextInput
Синтаксис:
OpenTextInput "текст1", "текст2",.... "текст20" MenuType maxLength
Открывает меню ввода текста, если он не используется в настоящее время. Значение MenuType равно 0 для MessageBox, 1 для книги, или 2 для прокрутки. Парметр MaxLength определяет максимальное количество символов. Если будет поставлено значение MenuType == 0, то в MessageBox строка ввода будет обозначена курсором. Следующие переменные, введенные после первой, будут обозначены как кнопки (аналогично тому, как это делается для команды GetButtonPressed).
http://cs.elderscrolls.com/constwiki/index.php/UpdateTextInputUpdateTextInput
Синтаксис:
UpdateTextInput
Выводит меню ввода текста для проверки введенных пользователем данных и обновления отображаемого текста, если это необходимо. Команда должна вызываться в каждом фрейме, в то время как открыто меню ввода, иначе меню просто закроется.
http://cs.elderscrolls.com/constwiki/index.php/InsertInInputTextInsertInInputText
Синтаксис:
InsertInInputText string_var1:varies_var2:varies ... var20: varies
Вставка введенного текста в текущую позицию курсора в меню ввода текста, пока это допускается максимальной длиной строки, определенной varies .
http://cs.elderscrolls.com/constwiki/index.php/GetInputTextGetInputText
Синтаксис:
GetInputText
Возвращает текст, введенный пользователем. Вы можете вызывать эту функцию в любой точке перед вызовом CloseTextInput. Обратите внимание, что возвращаемая строка включает в себя любое HTML форматирование, сделанное пользователем.
http://cs.elderscrolls.com/constwiki/index.php/CloseTextInputCloseTextInput
Синтаксис:
CloseTextInput
Закрывает меню ввода текста. Она должна ставиться в скрипт после того, как нужная информация уже введена соответствующей командой.
http://cs.elderscrolls.com/constwiki/index.php/IsTextInputInUseIsTextInputInUse
Синтаксис:
IsTextInputInUse
Возвращает 1, если скрипт в настоящее время использует меню ввода текста, независимо от того, видно оно или нет. Одновременно может работать только одно меню ввода текста.
http://cs.elderscrolls.com/constwiki/index.php/DeleteFromInputTextDeleteFromInputText
Синтаксис:
DeleteFromInputText numToDelete:short bBackwards:bool bDeleteWholeWords:bool
Удаляет количество символов или слов из введенного текста в указанном направлении, начиная с текущей позиции курсора. Обратите внимание, что HTML-теги трактуются и как слово и символ (только эту часть тега удалить не возможно). Оба дополнительных параметра, являются ложными по умолчанию.
http://cs.elderscrolls.com/constwiki/index.php/GetTextInputCursorPosGetTextInputCursorPos
Синтаксис:
GetTextInputCursorPos
Возвращает текущую позицию курсора как индекс в строке ввода.
http://cs.elderscrolls.com/constwiki/index.php/MoveTextInputCursorMoveTextInputCursor
Синтаксис:
MoveTextInputCursor numChars:short moveBackwards:bool
Перемещает курсор на указанное количество знаков в указанном направлении от текущей позиции. Обратите внимание, что каждый тег HTML рассматривается как один символ.
http://cs.elderscrolls.com/constwiki/index.php/GetTextInputControlPressedGetTextInputControlPressed
Синтаксис:
GetTextInputControlPressed
Возвращает скан-код последней нажатой клавиши в сочетании с ключевыми CTRL, за исключением тех ключей, которые зарезервированы для использования в меню ввода текста. Как только код восстановлен, последующий вызов этой команды вернет -1, он также вернет -1, если не была нажата клавиша.
http://cs.elderscrolls.com/constwiki/index.php/MessageBoxExMessageBoxEx
Синтаксис:
MessageBoxEX "текст1" var1 var2 ... var20
Отображение отформатированных MessageBox с помощью расширенного спецификатора формата для текстовых сообщений. Спецификаторы формата будут показаны в виде кнопок. Текст кнопок должен быть включен в строку формата, отделенную для каждой кнопки вертикальной чертой |.
Вы можете использовать до 10 кнопок.
Вы можете использовать до 20 переменных.
Примечания:
Для получения информации о том, как создать рабочие меню смотрите описание функции MessageBox.
Отображает максимум 512 символов.
В версии 0014a, количество увеличено 4096 символов.
В версии 0016 с добавлением переменной string_var, этот предел был увеличен до 16 400 символов, хотя однострочный предел еще 512. Использование string_var - очень простой способ обойти однострочный предел..
Применение нескольких MessageBoxes или MessageBoxExes может вызвать возврат GetButtonPressed неверного значения.