FKISS Specifications Last updated 3-1-97 This document explains the syntax for FKISS extension format. This document written by Dov Sherman with a lot of help from Yav. FKISS extension format is an extension to the existing KISS configuration format. FKISS code appears as comment lines at the end of KISS .CNF file. Usually, the code appears at the end of the file but this is not a requirement. General format All lines containing FKISS statements must begin with ;@ but more than one statement can appear on a line. For example: ;@map(#1) unmap("hat.cel") ...and... ;@map(#1) ;@unmap("hat.cel") ...would have the same effect After the ;@ any amount of spaces or tabs may appear before statements: ;@map(#1) ...and... ;@ map(#1) ...are equivalent FKISS Code is made up by an Identifier followed by a series of Events which each control series of Actions. Identifier ;@EventHandler This is the first line of the FKISS animation/sound code. It alerts FKISS that following lines should be read as FKISS commands. Only lines appearing after this statement are treated as FKISS code. Actions An Action is a command which is immediately executed. The sequence of actions in a given event is not defined. In an ideal implementation, all actions defined for a given event would have parallel execution (occur at the exact same time). Usual implementation executes action in listed order. ;@map(item or cel) This event takes one argument as an item number defining a group of cels or a filename defining a single cel. It causes the relevant cel or cels to become visible on any pages they are defined on. ;@unmap(item or cel) This event takes one argument as an item number defining a group of cels or a filename defining a single cel. It causes the relevant cel or cels to become invisible on any pages they are defined on. ;@altmap(item or cel) This event takes one argument as an item number defining a group of cels or a filename defining a single cel. It causes the relevant cel or cels to become visible if currently invisible and invisible if currently visible. ;@sound(WAV or AU file) This event takes one argument as the filename for a WAV or AU format sound sample. It causes the given sound sample to be played. It is recommended that alternate CNF files using each format be available since different viewers may be capable of only one format or the other. ;@move(item, x, y) This event takes three arguments. The first argument is an item number for a group of cels. The second and third arguments are x and y offsets. This action causes the given item to move relative to its current position. Example: ;@move(#5, 10, -3) ; Causes item #5 to move 10 pixels to the right and 3 pixels up ;@changeset(number) This event takes one argument as a set/page number. It causes the viewer to switch to the given set/page as long as the given set/page is defined. ;@changecol(number) This event takes one argument as a palette number. It causes the viewer to switch to the given palette. Only relevant if the KISS data set is of the customizable palette style. ;@timer(alarm, delay) This event takes two arguments. The first argument is an alarm number. The second argument is a delay time in milli-seconds. It causes the given alarm to be activated after the given delay time. If a timer is already active for the given alarm, the new delay value take precedence. Setting the delay time to zero will cancel any timers for that alarm. ;@randomtimer(alarm, delay, variance) This event takes three arguments. The first argument is an alarm number. The second argument is a delay time in milli-seconds. The third argument is a variance range. It causes the given alarm to be activated after the given delay time plus a random amount of time less than or equal to the variance range. If a timer is already active for the given alarm, the new delay value take precedence. ;@nop() Perform no action. ;@quit() Exits the KISS viewer entirely. Events An Event is an Event command followed by a series of Actions which are executed when the given Event is called. All Actions listed after an Event command are considered part of the Event until another Event commands is encountered. ;@initialize() This event signifies that the following actions should be executed immediately when the data set is loaded. This is useful for unmapping cels or items that should be invisible at start up or for starting timers which begin from start up. Initialization takes place before the data set becomes visible. Example: ;@initialize() ;@ unmap(#5) ;@ sound("welcome.wav") ;@begin() This event signifies that the following actions should be executed immediately after the data set first becomes visible. Example: ;@begin() ;@ timer(15,3000) ;@end() This event signifies that the following actions should be executed immediately when the data set is being unloaded at the end of use. Example: ;@end() ;@ sound("byebye.wav") This would cause the sound file "byebye.wav" to be played when the user stops using the data set by loading a new set or quitting KISS. ;@alarm(number) This event takes one argument identifying it as a given alarm number. Alarm number need not be listed in numerical order and there may be gaps between alarm numbers. (In other words, if the only alarms defined are 6, 3, 17, and 54, that's okay.) Alarm numbers must range from 0 to 63. This event should be followed by a series of actions to be executed when the alarm is called. Alarms can only be called by timer() commands. Example: ;@alarm(15) map(#5) unmap(#6) timer(16, 6000) ;@alarm(16) ;@ map(#6) unmap(#5) ;@ timer(15, 6000) In our begin() example, alarm 15 was called at start up to begin after three seconds. Here we define alarm 15 as making item 5 visible again, making item 6 invisible, and starting a timer for alarm 16 after 6 second. Alarm 16 we defined as putting item 6 back on-screen, clearing item 5 again, and starting a timer for alarm 15. In this way, you can create endlessly looping cycles for things like eyes that blink every 10 seconds or a neon sign that flickers on the backdrop. ;@press(item or cel) This event takes one argument as an item number defining a group of cels or a filename defining a single cel. It causes any following actions to be executed when the user clicks on the given item or cel. This applies whether the item is moveable or not. ;@catch(item or cel) This event takes one argument as an item number defining a group of cels or a filename defining a single cel. It causes any following actions to be executed when the user clicks on the given item or cel. This applies only to moveable items. ;@fixcatch(item or cel) This event takes one argument as an item number defining a group of cels or a filename defining a single cel. It causes any following actions to be executed when the user clicks on the given item or cel. This applies only to non-moveable items but not maximum non-moveable items. ;@release(item or cel) This event takes one argument as an item number defining a group of cels or a filename defining a single cel. It causes any following actions to be executed when the user has clicked on the given item or cel and now releases it. You can use this in tandem with the catch() event to have an item of clothing change shape as if being opened to put over the doll and then go back to normal when the user releases it, presumably on the doll. This applies whether the item is moveable or not. ;@drop(item or cel) This event takes one argument as an item number defining a group of cels or a filename defining a single cel. It causes any following actions to be executed when the user has clicked on the given item or cel and now releases it. You can use this in tandem with the catch() event to have an item of clothing change shape as if being opened to put over the doll and then go back to normal when the user releases it, presumably on the doll. This can only be used on moveable items. ;@fixdrop(item or cel) This event takes one argument as an item number defining a group of cels or a filename defining a single cel. It causes any following actions to be executed when the user has clicked on the given item or cel and it now snaps back to starting position. You can use this in tandem with the fixcatch() event to have an item of clothing change shape as if being opened to put over the doll and then go back to normal when the user releases it, presumably on the doll. This applies only to non-moveable items but not maximum non-moveable items. ;@unfix(item or cel) This event takes one argument as an item number defining a group of cels or a filename defining a single cel. It causes any following actions to be executed when the user has clicked on the item or cel enough times that the item's fixedness has counted down. This can only be used once from start up. Example: #12.20 hat.cel ; Defining an object with fixedness of 20 [...intervening stuff omitted...] ;@unfix(#12) sound("hatsoff.wav") In this example, when the user has clicked on the hat 20 times so that it now becomes moveable, the sound "hatsoff.wav" will be played. ;@set(page number) This event takes one argument as a page number defined in the data set. It causes any following events to be executed when the user switches to that page. ;@col(x) This event takes one argument as a palette number defined in the data set. It causes any following events to be executed when the user switches to that palette. ;@never() This event never happens and following actions are not processed. This is mainly useful for hiding actions while debugging FKISS code. Future Additions? Here are a few events that might added at some time in the future. ;@in(cel, cel) This event takes two arguments as a filenames defining cels. It causes any following actions to be executed when one or more non-transparent pixels in the first cel touch non-transparent pixels in the second cel. This event is not yet supported. ;@out(cel, cel) This event takes two arguments as a filenames defining cels. It causes any following actions to be executed when pixels in the first cel stop touching pixels in the second cel. This event is not yet supported.