Text Input With TSFC
From The Elder Scrolls Construction Set Wiki
This code will accept text input from the player, storing the data in a TSFC string. All regular keyboard characters are supported except tilde(~). Shift and Backspace may be used normally. Text is shown as typed via MessageBoxes, which also have buttons for the player to end their input or clear all input.
Contents |
[edit] Requirements
[edit] Setup
As presented, this script is intended to run as a quest script and will use the player's input to rename an item. It could however be modified to use the input in a different way, or to run in an object's script.
After creating a quest for the script to run on, find the line "StopQuest TextInput" and replace "TextInput" with the name of your quest.
You'll then need to use the following snippet of code in another script when you're ready to get the player's input, assuming that you used the quest name TextInput.
set TextInput.item to myItem ; Must tell the script which item to rename StartQuest TextInput
[edit] Limitations
- It is impossible to support the tilde(~) or accent(`) keys.
- Caps Lock is ignored, since most players will use it to toggle run. It would be possible to add support for it, but it's not recommended.
- While the script can respond quickly, allowing the player to type at a fairly normal pace, if multiple keys are pressed at the same time only one of them will be recognized.
- If the typed text overflows to multiple lines on the MessageBox, a dash(-) will be shown at the end of each line (per normal grammar rules). This is a function of the game engine, and the actual text is not modified.
[edit] Functions & Scripting Concepts Used
- fQuestDelayTime
- GameMode
- GetButtonPressed
- GetKeyPress
- GetNumKeysPressed
- isKeyPressed2
- MenuMode
- StopQuest
- StrAppend
- StrAppendCharCode
- StrClear
- StrClearLast
- StrDeleteAll
- StrMessageBox
- StrNew
- StrSet
- StrSetName
[edit] The Code
scn TextInputScript
ref item
float fQuestDelayTime
short control
short button
short console
; Key input Variables
long key
long shift
; StringID variables
long name
long prompt
long clear
long done
; Menumode 1001 = Messagebox displayed
; Most of the actual work is done here
begin menumode 1001
; Block input if we've already captured the key that's currently pressed
; But - make an exception for the Shift keys
if ((isKeyPressed2 key) && (key != 42) && (key != 54))
return
else
set key to GetKeyPress 0
; If more than 1 key is pressed, capture the second key
; (more than 2 key presses are ignored)
if (GetNumKeysPressed > 1)
; Use the "shift" variable to temporarily capture the second key
set shift to GetKeyPress 1
; If "key" has captured a Shift input, flip the variable's contents
; and toggle "shift" on
if ((key == 42) || (key == 54))
set key to shift
set shift to 1
; If "key" didn't capture a Shift input, did "shift" get it?
elseif ((shift == 42) || (shift == 54))
set shift to 1
; Otherwise Shift isn't pressed, toggle "shift" off
else
set shift to 0
endif
; Be sure "shift" is toggled off if only 1 key was pressed
else
set shift to 0
endif
endif
; Block Esc, the Shift keys, and others that aren't needed for typing
if ((key == 1) || (key == 42) || (key == 54) || (key > 57))
;
; Toggle the console active variable on/of if tilde(~) is pressed
; so the player can use the console normally
elseif (key == 41) ; Open/close console
if (console)
set console to 0
else
set console to 1
endif
; Block all input if the console is open
elseif (console)
;
elseif (key == 14) ; Backspace
StrClearLast name
StrSet prompt "Name: "
StrAppend prompt name
StrMessageBox prompt clear done
elseif (key)
StrAppendCharCode name key shift
StrSet prompt "Name: "
StrAppend prompt name
StrMessageBox prompt clear done
endif
end
; Gamemode block does initialization, catches input when a
; button is pressed in the MessageBox
begin gamemode
set fquestdelaytime to 0.01
; Catch input when a MBox button is pressed
if (control)
set button to getbuttonpressed
; "Clear All" button
if (button == 0)
StrClear name
StrSet prompt "Name:"
StrMessageBox prompt clear done
; "Finish Input" button
elseif (button == 1)
StrSetName name item
StrDeleteAll
set control to 0
stopquest TextInput
endif
; Startup: create strings, prompt for input
elseif (control == 0)
set name to StrNew
StrClear name
set prompt to StrNew "Name:"
set clear to StrNew "Clear All"
set done to StrNew "Finish Input"
StrMessageBox prompt clear done
set control to 1
endif
end
[edit] Notes
- The keys Enter, Tab, Alt, and Ctrl will add the text of their key name if pressed.
[edit] See Also
- Text Input With OBSE - an alternative that does not require TSFC.
- Text Input With Pluggy - an alternative using Pluggy.

