Difference between revisions of "Text Input With TSFC"

From the Oblivion ConstructionSet Wiki
Jump to navigation Jump to search
imported>Speedo
(Reworked script to use MBoxes)
imported>KyleWollaston
 
(9 intermediate revisions by 3 users not shown)
Line 1: Line 1:
This code will accept text input from the player, storing the data in a [[:Category: TSFC|TSFC]] string.  All regular keyboard characters are supported except tilde(~).  Shift and Backspace may be used normally.  Text is show as typed via [[StrMessageBox|MessageBoxes]], which also have buttons for the player to end their input or clear all input.
This code will accept text input from the player, storing the data in a [[:Category: TSFC|TSFC]] string.  All regular keyboard characters are supported except tilde(~).  Shift and Backspace may be used normally.  Text is shown as typed via [[StrMessageBox|MessageBoxes]], which also have buttons for the player to end their input or clear all input.


==Requirements==
==Requirements==


*[[:Category: Oblivion Script Extender|Oblivion Script Extender (OBSE)]] v0014 or higher
*[[:Category: Oblivion Script Extender|Oblivion Script Extender]] v0014 or higher
*[[:Category: TSFC|Tibixe's String Function Collection (TSFC)]]
*[[:Category: TSFC|Tibixe's String Function Collection (TSFC)]]


Line 38: Line 38:
*[[StopQuest]]
*[[StopQuest]]
*[[StrAppend]]
*[[StrAppend]]
*[[StrAppendCharCode]]
*[[StrClear]]
*[[StrClear]]
*[[StrClearLast]]
*[[StrClearLast]]
Line 58: Line 59:
short console
short console


; Key input Variables
long key
long key
long shift
long shift


; StringID variables
long name
long name
long prompt
long prompt
Line 66: Line 69:
long done
long done


begin menumode 1001  
; 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))
   if ((isKeyPressed2 key) && (key != 42) && (key != 54))
     return
     return
   
   else
   else
     set key to GetKeyPress 0
     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)
     if (GetNumKeysPressed > 1)
      ; Use the "shift" variable to temporarily capture the second key
       set shift to GetKeyPress 1
       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))
       if ((key == 42) || (key == 54))
         set key to shift
         set key to shift
         set shift to 1
         set shift to 1
      ; If "key" didn't capture a Shift input, did "shift" get it?
       elseif ((shift == 42) || (shift == 54))
       elseif ((shift == 42) || (shift == 54))
         set shift to 1
         set shift to 1
      ; Otherwise Shift isn't pressed, toggle "shift" off
       else  
       else  
         set shift to 0
         set shift to 0
       endif
       endif
    ; Be sure "shift" is toggled off if only 1 key was pressed
     else
     else
       set shift to 0
       set shift to 0
Line 86: Line 104:
   endif
   endif
    
    
  ; Block Esc, the Shift keys, and others that aren't needed for typing
   if ((key == 1) || (key == 42) || (key == 54) || (key > 57))
   if ((key == 1) || (key == 42) || (key == 54) || (key > 57))
     ;
     ;
   elseif (key == 41)  ; Open console
   
  ; 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)
     if (console)
       set console to 0
       set console to 0
Line 94: Line 116:
       set console to 1
       set console to 1
     endif
     endif
   
  ; Block all input if the console is open
   elseif (console)
   elseif (console)
     ;
     ;  
 
   elseif (key == 14)  ; Backspace
   elseif (key == 14)  ; Backspace
     StrClearLast name
     StrClearLast name
Line 101: Line 126:
     StrAppend prompt name
     StrAppend prompt name
     StrMessageBox prompt clear done
     StrMessageBox prompt clear done
   
   elseif (key)
   elseif (key)
     StrAppendCharCode name key shift
     StrAppendCharCode name key shift
Line 109: Line 135:
end
end


; Gamemode block does initialization, catches input when a
; button is pressed in the MessageBox
begin gamemode
begin gamemode
   set fquestdelaytime to 0.01
   set fquestdelaytime to 0.01
    
    
  ; Catch input when a MBox button is pressed
   if (control)
   if (control)
     set button to getbuttonpressed
     set button to getbuttonpressed
   
    ; "Clear All" button
     if (button == 0)
     if (button == 0)
       StrClear name
       StrClear name
       StrSet prompt "Name:"
       StrSet prompt "Name:"
       StrMessageBox prompt clear done
       StrMessageBox prompt clear done
     
    ; "Finish Input" button
     elseif (button == 1)
     elseif (button == 1)
       StrSetName name item
       StrSetName name item
Line 123: Line 156:
       set control to 0
       set control to 0
       stopquest TextInput
       stopquest TextInput
     endif  
     endif
   
  ; Startup: create strings, prompt for input
   elseif (control == 0)
   elseif (control == 0)
     set name to StrNew
     set name to StrNew
Line 139: Line 174:


*The keys Enter, Tab, Alt, and Ctrl will add the text of their key name if pressed.
*The keys Enter, Tab, Alt, and Ctrl will add the text of their key name if pressed.
*If you need to save the input string, you can use [http://www.tesnexus.com/downloads/file.php?id=15390 PlugStr] to save it in a [[:Category: Pluggy|Pluggy]] array.


==See Also==
==See Also==


*[[MessageBoxEx-based Text Input Box]] - an alternative that does not require [[:Category: TSFC|TSFC]].
*[[Text Input With OBSE]] - an alternative that does not require [[:Category: TSFC|TSFC]].
*[[Text Input With Pluggy]] - an alternative using [[:Category: Pluggy|Pluggy]].


[[Category: Useful Code]]
[[Category: Useful Code]]

Latest revision as of 01:39, 30 November 2008

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.

Requirements[edit | edit source]

Setup[edit | edit source]

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

Limitations[edit | edit source]

  • 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.

Functions & Scripting Concepts Used[edit | edit source]

The Code[edit | edit source]

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

Notes[edit | edit source]

  • The keys Enter, Tab, Alt, and Ctrl will add the text of their key name if pressed.

See Also[edit | edit source]