Keypad.talk
_______________________________________________________
// Script for Keypad 2.0 (advanced)
// by Oscar (4 Jan 2004)
// This is a more complex example than the Keypad 1.0
// Please note that you should look at tutorial that examines the lines
// otherwise it may be too overwhelming
// First it asks for the secret access code which can be any length (unlike the 1.0)
// and all necessary menus and connections are created by script.
// This script runs automatically after you load the Component
// You can bypass the script when you hold SHIFT
// Component access to the objects:
// in order to know which objects belongs to the component
// three array variables are filled up:menusInBlackBox, vmgsInBlackBox, moviesInBlackBox
// menusInBlackBox retuns the number of menus in box and
// menusInBlackBox[1] returns what is the order number relative to project of the first menu in box
// see this example below:
/*
print "Number of Menus in this Component: ",menusInBlackBox
for menu=1 to menusInBlackBox
print "Menu #",menu," in Component is a Menu #",menusInBlackBox[menu]," in a whole project"
next menu
*/*/
// note, the number returned by vmgsInBlackBox[x] is in range 1...255,
// while all Menu functions uses vmg in range 10001-10255
// that means you have to add 10000 or use function VMG(vmgsInBlackBox[x])
// Get The secret code from user
// use only numbers 1-9
nCode=123
input "This is a keypad component that allows access by code.","The access code can be any lenght, but use only digits 1-9","","Secret Access Code",nCode,"","(c) Oscar 2004"
// terminate script if pressed cancel
if bCancelInput then
end
endif
// some global font settings for the text object that will be created
fontSize = 70
fontFace = "Arial"
fontX = 317
fontY = 100
// now get the secret access sequence into array
// we will simply divide it by 10 untill there is no more digits
nNum = 1
nTempCode = nCode
//***** nice and happy goto loop :-) ************
10 nNewCode = INT(nTempCode/10)
// get the digit
codes[nNum] = nTempCode-nNewCode*10
// show it in output for debug
trace codes[nNum]
nNum=nNum+1
nTempCode = nNewCode
// still something left - loop to label 10
if (nNewCode>0) then
goto 10
endif
//************ end of the goto loop ***********************
// here we are, the digits are in the codes array, but in wrong dirrection: codes[1] is the last digit
// remember that later !!!!
nNumberOfDigits = nNum-1
// we have this many digits in our secret code
// this determines the number of menus
trace nNumberOfDigits
// create a BAD 1 menu
//********************************************
menu = MenuAdd(FALSE,"BAD 1",FALSE)
// copy from the first in black box to the new created menu
MenuCopy(menusInBlackBox[1], menu)
// now link all objects from menusInBlackBox[1] to menu
// how many objects in the menu
nOb = ObjectGetCount(menusInBlackBox[1])
// link all from start to bad 1
for x=1 to nOb
ObjectLinkToMenu(menusInBlackBox[1],x,menu)
next x
// put a star as text for user feedback
stars = "*"
object = ObjectAdd(menu,3,RGB(0,0,0),stars)
ObjectSetPos(menu,object,fontX,fontY)
ObjectSetFont(menu,object,fontFace,fontSize)
ObjectSetShadow(menu,object,0,0)
MenuPlaceNear(menu, menusInBlackBox[1], 0, 4)
MenuGroupWith(menu, menusInBlackBox[1],0)
// remeber the last good and bad menu
prevbad = menu
prevgood = menusInBlackBox[1]
// counter for codes array
codecounter = nNumberOfDigits
// now we need nNumberOfDigits-1 menu pairs
//*****************************************************
for y=1 to nNumberOfDigits-1
name = "GOOD "+CHR(48+y)
menuGood = MenuAdd(FALSE,name,FALSE)
MenuCopy(menusInBlackBox[1], menuGood)
// Place the box right of previous good and add it to the component
MenuPlaceNear(menuGood, prevgood, 0, 2)
MenuGroupWith(menuGood, prevgood,0)
name = "BAD "+CHR(48+y+1)
menuBad = MenuAdd(FALSE,name,FALSE)
MenuCopy(menusInBlackBox[1], menuBad)
// Place the box right of previous bad and add it to the component
MenuPlaceNear(menuBad, prevbad, 0, 2)
MenuGroupWith(menuBad, prevbad,0)
// now link this good menu and previous bad menu to the bad menu
for x=1 to nOb
ObjectLinkToMenu(menuGood,x,menuBad)
ObjectLinkToMenu(prevbad,x,menuBad)
next x
//link the object corresponding to the secret digit from last good menu to this good menu
ObjectLinkToMenu(prevgood,codes[codecounter],menuGood)
// add the star so users see feedback how many keys he enterred
// we defined the stars before loop
trace stars
// add text object
object = ObjectAdd(menuGood,3,RGB(0,0,0),stars)
ObjectSetPos(menuGood,object,fontX,fontY)
ObjectSetFont(menuGood,object,fontFace,fontSize)
ObjectSetShadow(menuGood,object,0,0)
// the bad has one star more
stars=stars+"*"
object = ObjectAdd(menuBad,3,RGB(0,0,0),stars)
ObjectSetPos(menuBad,object,fontX,fontY)
ObjectSetFont(menuBad,object,fontFace,fontSize)
ObjectSetShadow(menuBad,object,0,0)
// because the array is in opposite order
codecounter = codecounter-1
// now rememv=ber the previous bad and good
prevbad = menuBad
prevgood = menuGood
next y
// BAD end ********************************************************************
// the last bad menu doesn't link to anything - it is the dead end ACCESS DENIED
for x=1 to nOb
// since the ObjectDelete change the object order
// we need to delete just the first object few times
ObjectDelete(prevbad,1)
next x
// delete also the stars text, we will put access denied
ObjectDelete(prevbad,1)
object = ObjectAdd(prevbad,3,RGB(0,0,0),"WRONG CODE")
ObjectSetPos(prevbad,object,fontX,fontY+5)
ObjectSetFont(prevbad,object,fontFace,fontSize/3)
ObjectSetShadow(prevbad,object,0,0)
// link it to the start
MenuEndLink(prevbad, menusInBlackBox[1])
// set timer to 1 sec before we go to the start
MenuSetPBC(prevbad,1,0,0)
// GOOD END *************************************************
// this is the last menu
menuGood = MenuAdd(FALSE,"GOOD END",FALSE)
MenuCopy(menusInBlackBox[1], menuGood)
// right of last good menu
MenuPlaceNear(menuGood, prevgood, 0, 2)
// put it inside the Component
MenuGroupWith(menuGood, prevgood,0)
// delete all objects
for x=1 to nOb
// since the ObjectDelete change the object order
// we need to delete just the first object few times
ObjectDelete(menuGood,1)
next x
ObjectLinkToMenu(prevgood,codes[codecounter],menuGood)
// it should be 1, since this is the last digit = first in the array)
trace "Last Digit ",codecounter
// put a ACCESS OK text
object = ObjectAdd(menuGood,3,RGB(0,0,0),"ACCESS OK")
ObjectSetPos(menuGood,object,fontX,fontY+5)
ObjectSetFont(menuGood,object,fontFace,fontSize/3)
ObjectSetShadow(menuGood,object,0,0)
// set 2 sec timeout
MenuSetPBC(menuGood,2,0,0)
// set this menu to be an output object in connection
MenuSetComponent(menuGood, FALSE, TRUE)
// now you need to connect the GOOD END with any menu
Created with DVD-lab Pro