Search Images Maps Play YouTube News Gmail Drive More »
Sign in
Screen reader users: click this link for accessible mode. Accessible mode has the same essential features but works better with your reader.

Patents

  1. Advanced Patent Search
Publication numberWO1996002898 A1
Publication typeApplication
Application numberPCT/IB1995/000628
Publication date1 Feb 1996
Filing date18 Jul 1995
Priority date18 Jul 1994
Publication numberPCT/1995/628, PCT/IB/1995/000628, PCT/IB/1995/00628, PCT/IB/95/000628, PCT/IB/95/00628, PCT/IB1995/000628, PCT/IB1995/00628, PCT/IB1995000628, PCT/IB199500628, PCT/IB95/000628, PCT/IB95/00628, PCT/IB95000628, PCT/IB9500628, WO 1996/002898 A1, WO 1996002898 A1, WO 1996002898A1, WO 9602898 A1, WO 9602898A1, WO-A1-1996002898, WO-A1-9602898, WO1996/002898A1, WO1996002898 A1, WO1996002898A1, WO9602898 A1, WO9602898A1
InventorsBradley K. Dahl
Applicant477250 B.C. Ltd.
Export CitationBiBTeX, EndNote, RefMan
External Links: Patentscope, Espacenet
Process of producing personalized video cartoons
WO 1996002898 A1
Abstract
A personalized cartoon is produced by inserting and overkeying a digitized image of a face, with an animated mouth, into an animated cartoon sequence in a digital image file. To synchronize audio narration files with the animate cartoon sequences, the image files are divided into smaller animation clips, the narration files are divided into smaller narration clips and the timing of the narration clips is adjusted to synchronize each narration clip with a respective one of the animation clips.
Claims  (OCR text may contain errors)
AMENDED CLAIMS [received by the International Bureau on 23 January 1996 (23.01.96); original claims 1-5 amended; new claims 6-10 added (4 pages)]
1. A method for producing a personalized computer generated image sequence, comprising the steps of: providing a background-free first image, in an electronic format of a face of a subject to be included in said image sequence; processing said first image to provide a portion of the face in at least two states; providing a background image sequence in an electronic format; overlaying said first image including said face portion, onto said background image sequence as a sequence of image frame data; providing audio data defining a plurality of audio sequences; dividing said image frame data into smaller image frame data packets; dividing said audio data into smaller audio data packets; synchronizing said audio data packets with respective ones of said image frame data packets; and producing said image frame data packets together with said audio data packets, synchronized therewith as said personalized computer generated image frame sequence containing audio.
2. The method of claim 1, wherein at least one of said image frame data packets includes a variable length zone; said synchronizing of said audio data packets step including the substep of adjusting a duration of one of said image frame data packets by varying said zone to correspond to lengths of a respective audio data packet.
3. The method of claim 1, further comprising the steps of providing a sound track as MIDI data, having portions which correspond to said image frame data packets; and processing said MIDI data to adjust a playback speed of said sound track to correspond to a duration of said corresponding image frame data packet.
4. The method of claim 1, further comprising the step of providing an
alphanumeric image signal including an identifier of said subject, and incorporating said alphanumeric image signal in said personalized computer generated image frame sequence .
5. The method of claim 1, wherein said dividing said image frame data step, said dividing said audio data step, and said synchronizing step are effected by selecting a number of frames included in an image frame data packet based on a duration of a corresponding one of said audio data packets.
6. A method for producing a composite image sequence, having a variable
foreground image, a variable audio sequence, and a background image sequence, comprising the steps of: providing the variable foreground image in an electronic format, including facial features; processing said variable foreground image to produce a plurality of images having different facial expressions; providing a stored background image sequence in an electronic format; providing audio data defining a plurality of audio sequences; dividing the background image sequence into a plurality of series of contiguous image frames; defining portions of the variable audio sequence in correspondence with said respective ones of said plurality of series of contiguous image frames; forming a composite of one of said series of contiguous frames, said defined portion of the variable audio sequence, and said processed variable foreground image; including the substeps of: adjusting a length of said series of frames to correspond to a duration of the variable audio sequence; and selecting ones of said plurality of images having different facial expressions synchronized to the variable audio sequence and said series of contiguous frames; and outputing said series of said composite image sequences.
7. The method according to claim 6, wherein at least one of said series of frames includes a variable length transition zone.
8 The method according to claim 6, further comprising the step of providing a
MIDI data sequence and synchronizing a playback of said MIDI data sequence with said series of composite image sequences.
9. The method according to claim 6, further comprising the step of outputting an alphanumeric message with said series of composite image sequences.
10. The method according to claim 6, wherein said series of contiguous image frames are predetermined having transitional zones for time synchronization with the variable audio sequence.
Description  (OCR text may contain errors)


  
 



   PROCESS OF PRODUCING PERSONALIZED VIDEO CARTOONS
 BACKGROUND OF THE INVENTION
Field of the Invention
The present invention relates to a process for the producing a personalized cartoon, for example a cartoon incorporating an image of the face of a child or an infant in an animated cartoon sequence.



  Description of the Related Art
The incorporation of images of real people into digitized animation sequences is at the present time used for various purposes, including the production of interactive video games.



  However, prior art techniques for this purpose are complicated and, therefore, expensive.



  It is accordingly an object of the present invention to provide a novel method of producing personalized video cartoons in a simple manner on inexpensive, readily available computer equipment.



   BRIEF SUMMARY OF THE INVENTION
According to the present invention, a process for the production of a personalized video cartoon comprises providing a background-free first image in a digital format of a face of an actual person to be included in the cartoon, and processing the first image to provide an animated mouth portion of the face. The first image is then inserted into  an animated cartoon sequence in a digital format to provide a plurality of first image files.



  An audio narration signal, incorporating the name of the person, is also provided as a plurality of narration files, and the image files and the narration files are then divided into smaller image clips and narration clips. To facilitate an approximate synchronization of the image clips and the narration clips, the narration clips are then associated with respective ones of the animation clips and are recorded, together with the animation clips, as an audio and video recording of the personalized cartoon.



  By dividing the image files and the narration files into smaller files, constituting the animation clips and the narration clips, it is possible to compensate for substantial differences in the sizes of the image files as compared with the narration files.



  It is also possible to adjust the speeds of the animation clips to correspond to the lengths of the respective narration clips.



  In the preferred embodiment of the invention, a musical soundtrack is recorded as a MIDI file, which is processed to adjust the playback speed of the soundtrack to correspond to the animation clips.



   BRIEF DESCRIPTION OF THE DRAWINGS
The invention will be more readily apparent from the following description thereof when taken in conjunction with the accompanying drawings, in which:  
 Figures 1 through 6 diagrammatically illustrate
 successive steps in a production process for the
 incorporation of an image of a face into a cartoon;
 Figure 7 shows a block diagram illustrating successive
 production steps in the method of Figures 1 through 6;
 Figures 8 and 9 show, in greater detail, the production
 scheme illustrated by the block diagram of Figure 7;
 and
 Figure 10 shows a computer network and associated
 accessories for use in the cartoon production process;
 and
 Figure 11 diagrammatically illustrates the
 synchronization of animation clips and narration clips.



   THE PREFERRED EMBODIMENTS
Figure 1 shows a photograph, indicated generally by reference numeral 11, bearing the image, indicated generally by reference numeral 12, of a child which is to be incorporated into an animated cartoon in the cartoon production process described below.



  To facilitate commercialization of this process, the production process is automated so as to require minimal human involvement and interaction time, and also is able to be performed utilizing low cost, commercially available personal computer systems.



  To control the process, an order entry is effected in a first procedure indicated by reference numeral 14 in the block diagram of Figure 7.  



  A video input signal is processed in a second procedure 15 to digitize and cut out the image 12, and data from the procedures 14 and 15 is stored at storage 17.



  In procedure 19, a digitized name is obtained, which can then be incorporated in procedure 21 in the rendering of an animation sequence and face image data from storage 17 to produce a personalized cartoon. Data from procedure 21 can be employed in procedure 23 to produce a CD-ROM record of the personalized cartoon.



  Also, the face image data from storage 17 can be employed in procedure 25 to make a personalized coloring book.



  More particularly, as shown in Figure 8, in procedure 14 an order entry form (not shown) is completed in a first step 16 to enter an order number and relevant information, including personalization, billing, source (i.e. distributor, mail order, phone, etc.) and shipping information, and also the name of the person whose image is to be incorporated into the cartoon and a personalized message, into a first computer 18 shown in Figure   10.    The program for the order entry is produced using Visual Basic and Access which are commercially available programs. The program for the order entry is produced using Visual Basic and Access which are commercially available programs. The order data thus extend is transferred to a box or label printer 20 and to a second computer 22.

  The order entry program controls the belowdescribed process as far as the rendering in computers 50 and 70 and the source code of this program is attached thereto as APPENDIX 1.



  More particularly, in the computer 18, the order entry program creates the following key image required by the production system:  1. The program, in computer 22 (Figure 10), creates a
 unique order number for tracking and identification of
 the order.



  2. The program creates a database entry in a permanent
 database 24 (Figure 8) for master reference, data
 processing, invoicing and archive retrieval.



  3. The program creates a sub-directory storage area 17 on
 the hard disk of computer 22 for temporary storage of
 files during production. This area is identified by
 the unique order number, and all files pertinent to the
 production process are stored in this area and can be
 subsequently copied to various production areas when
 required.



  4. The program retrieves "master" story files from store
 17 and modifies them by replacing generic information
 with personalized information in an existing formatted
 text file. The modified files are saved in the order
 storage area without modifying the original master
 files, and will be subsequently linked into a
 personalized colouring book, a video label and a video
 cover.



  5. The program creates an ASCII text file containing the
 following information required by the production
 system:
 - unique ID's or serial numbers for tracking the
 individual photos, video, activity book, and
 floppy disk/CD-ROM materials during production,
 - which master animation/story to use for
 production,  
 - how many copies of the different outputs are
 required.



   - personalized message information; character/stars
 names, age, home town, special greeting etc.



   - names required for rendering video sub-titling,
 and editing name changes in book. These names are
 also used to assist in matching appropriate
 digital name clips representing the sound of the
 child's name for the video and computer products.



  A NTSC or S/VHS analog video signal from a video camera 30, a flatbed scanner 32, or analog Photo-CD player (NTSC or S
VHS) 34 is connected to a frame buffer/digitizer (not shown) in the computer 22. The analog video source connected to the frame buffer allows for viewing of the photographic image on a computer monitor 36. The incoming video signal can be viewed and adjusted via individual software control parameters multi format color image processing software in the frame buffer of computer 22 for brightness, contrast, saturation, and hue, or by individual red, blue, and green components. This allows the operator to subjectively compensate the tint and color balance to match the digital image with the original photo.

 

  Once the image has been focused and adjusted for color and clarity, the frame buffer instantly freeze frames a single frame or field from the video source in 1/30th or 1/60th of a second. The analog-to-digital frame buffer stores the encoded information to its on-board memory (not shown) in computer 22 where it is further manipulated and processed.



  The image is also stored to the hard disk of the computer 22 for later recall in a "cut and paste" process.  



  Another method for source data input is to employ a Photo-CD image file that is a digital representation of a photograph scanned and stored on CD-ROM disk 34. A PC based multisession Photo-CD-ROM compatible player (not shown) is used for this purpose. An image is retrieved from the Photo-CD and displayed on the image processing system's RGB monitor.



  The .PCD image can then be stored to hard disk or directly processed by the "cut and paste" system.



  A "screen capture" via a software utility, can also capture the required source information if it is in this format or any other popular computer graphics file format (.TIF, EPS, .PCX, .BMP, .RLE, .TGA). This data is saved in the same file format (.TGA) as images captured from analog video for processing into .GIF files that are required by the animation rendering software.



  If the flatbed scanner 32 is used as the source of input, a photograph, transparency, or slide 35 is placed on the scanner 32, and via software control the desired area of the image is cropped and then captured by scanning. The scanner control software can save the image into the desired image file format for immediate use or storage and manipulation at a later time. The scanner 32 is the preferred input accessory when using the head size in the original photograph as less than 1 inch high. These images may be too small for the video camera 30 to resolve enough detail.



  The SNAPSHOT software serves as a computer-based imaging and paint program which is introduced to the process from computer 40 for creating an overlay or "digital cel" for animation purposes. The head or facial image of the character in the digitized photo is outlined and clipped from the background of the source image as a clipped image 41 as illustrated in Figure 2 and stored as a temporary  file. This file is stored to the hard disk in the computer 22 as an overlay for later recall. A second image which is basically a "framed pedestal" or mount 45 (like a headless statue or bust), as shown in Figure 3, is called up from the hard drive of the computer 22. The image 43 has a frame or border 42 outlined around it and is used as a guideline for sizing and positioning the previously clipped image 41 of the head.



  The previously clipped image is retrieved as an overlay and placed inside the framed pedestal image 43 and, more particularly, is centered on an image 44 of a reference neck. The boundary frame 42 remains visible as a guide for positioning, as shown in Figure 4. The clipped image 41 is sized to vertically fit the size of the boundary frame 43.



  The image 41 can be manipulated so the head always looks straight ahead or slightly to the right. Once the image 41 has been sized, and eye position coordinated, the image 41 is then maneuvered horizontally so the chin of the character image is centered on the reference neck.



  Once the image 41 is positioned correctly, the overlay image 41 is pasted or permanently applied to the background 44 of the image 41 is then re-colored the same as a background 47 of the image 44 around the frame 42. The resulting image, indicated generally be reference numeral 48 in Figure 4, is a centered head on a single color background. This image, now suitable for "keying" over another image as a "cel", is retained in the frame buffers memory. It is also stored to disk in the computer 22 for later processing.



  More particularly, the above-described cut and paste procedure is carried out, using the SNAPSHOT software, as follows:  1. The menu system is run and an order number is selected.



  2. "Cut out heads" is selected from a menu in the order
 entry program, which is used launch the SNAPSHOT
 program.. This will run the SNAPSHOT program with the
 head image 41 loaded.



  3. View/actual view 1:1 and maximize.



  4. The lasso tool is employed to outline the head image
 41. CTL is held down to subtract from mask and SHFT is
 held down to add to mask, if necessary.



  5. Edit/copy is selected from the menu.



  6. The   "cl head"    window, i.e. the window containing the
 cut-out head (Fig. 2) is reduced or closed and the
 image   "cl blank",    i.e. the windows containing the frame
 of Figure 3, is displayed. This image is used as a
 template guide for head and chin placement.



  7. The   "cl blank"    window and Edit\Paste\As are selected
 from the menu.



  8. Transform\Free Resize is employed to adjust head image
 41 to fit white box 42. The head image 41 is moved to
 line up with the bottom, a corner of the box is
 selected to start resizing and then the SHIFT key is
 held down to keep image proportions). The image should
 just fit in the white box of the template from top to
 bottom. By right clicking the mouse, the head is
 pasted in place.



  9. A green color is grabbed from the image with the
 eyedropper tool.  



  10. The fill tool (paint can) is selected and the color
 similarity is set to zero. This is so it will fill
 only solid areas of color.



  11. The pencil tool is used with the green ink to modify
 any hair or ribbons that stick outside of the template
 border.



  12. The fill tool is used to fill any white areas of the
 image with green ink.



  13. The "cl¯head.tga" window, i.e. the window containing
 the combined cut-out head and the frame (Figure 4) if
 it is still around, is closed.



  14. The "cl¯blank" window is saved as "Cl¯head.tga",
 overwriting the original   "cl head.tga"    image.



  15. The mouth is zoomed in on with the magnifying glass
 tool and the window is maximized.



  16. The lower lip is selected using the lasso tool.



  17.   "Edit\Cut"    is selected from the menu.



  18.   "Edit\Paste\As    Selection" is selected from the menu.



   The lip is moved down, leaving a blank space for the
 open mouth and is pasted by clicking the mouse. Note:
 depending on the image, opening the mouth or closing
 the mouth, may be employed.



  19. The   "Transform\distort"    tool from the menu is used to
 adjust the mouth to fit better.  



  20. The clipped mouth is pasted either slightly more open
 or shut depending on the person.



  21. A dark ink is selected from the image and used to fill
 the inside of the mouth.



  22. The smear tool is used to smooth out sharp edges inside
 the mouth. The edges of the lips are smeared to pull
 them towards the edges of the mouth.



  23. The image is saved to the \pstyler directory as
   "cl gab.tga"    (diagram 17).



  24. The processing software is exited, when the above steps
 have been completed, with a reply "yes" to "cut out
 ok?" if successful.



  The set of "talking head" files   (cl¯head.tga      cl gab.tga)    edited in the above procedure 15 are   "true-color    24-bit images". These images can contain any number of colors from a range of 16.7 million colors. As a limit of the current technology, the image files used in production of the animated video sequences and the animate sequences themselves are required to using a color map (palette) of 256 colors (8 bits of color). This enables the animated sequences to play back at reasonable speed with smooth motion. These 256 colors can be selected from an available range of 32,000 colors.

 

  The color of each pixel in an 8-bit image is stored as an index (0 to 255) to a "color map" containing a set of digital values for red, green and blue. (i.e. pixel coordinate X=340, Y=230 is color index 212 which has color specifications of R=135, G=45, B=100). For every pixel on the computer screen a color index is recorded and stored in  the digital file 2 digitized photos with different color palettes. When compressing 24 bits (16.7 million colors) to 8 bits (256 colors) the 256 color palette differs from one image to the next based on the colors of the original image along with the color map for the entire image.



  Every individual frame in an 8-bit animation sequence must use the same 256 color palette to avoid color shifts or flashes during the animation sequence. The digitized images (heads) must also conform to the same or a similar color palette with little or no shades of red.



  To satisfy the above conditions, a common color palette was developed that contains "skin tone" colors as well as a range of colors used in the animated background sequences.



  When the true-color 24 bit images are converted to 256 colors they are immediately forced to "fit" this common color palette. This is done by grouping close "neighbouring" colors into groups of similar colors and squeezing them into the limited range "commonly" available colors i.e., a color from the source image for a certain pixel is replaced by the closest color in the target color palette. A pixel with color coordinates R=135, G=45,   B 100    may then be replaced by the closest color with coordinates
R=130,   G=44,    B=100. A slight color variance or shift in the digital image takes place but is not readily visible to the average viewer.



  In the production system, the above process is referred to as "processing gifs" and is performed automatically by
DIGITAL ALCHEMY software in the computer 22 after the heads are cut out.



  Once the images have been color processed they are ready for retrieval (using ANIMATOR PRO software) by an animation  rendering station and a coloring book printing station implemented as computers 50 and 52, respectively, and associated accessories. The computers 50 and 52 have their own control menus in the order entry program to facilitate production flow, and use similar "script" languages" to "render" animation and coloring book images from the processed head images, as described below.



  Firstly, the rendering of the animation sequences in computer 50 by procedure 21 will be described. For the thousands of individual frames that are required to have an animated sequence play back from computer memory on a frame by frame basis, the ANIMATOR PRO software program is utilized to take the talking head "digital cels"   (cl¯head.gif     & cl¯gab.gif) and convert them to temporary work overlay key "cels". A base animated sequence with the characters' headless cartoon bodies, and any background scenes are automatically recalled from disk in the computer 50, as illustrated by the scene indicated by reference numeral 60 in Figure 5.

  POCO software, forming part of the
ANIMATOR PRO program, is employed to coordinate the positioning and sizing of the temporary overlay   "cels"    onto pre-determined x and y coordinates on a frame by frame basis over the base animation. The overlay cels are then permanently pasted and maneuvered over the base animation 60, as illustrated in Figure 6.



  At the same time, the ANIMATOR PRO program coordinates the planning of personalized video subtitling on monitor 54 of the computer 50. This video subtitling highlights the characters' name which is entered in the order entry process 14 (Figure 7), and automatically centers itself on the bottom of the screen. Once all the individual frames have been personalized for an animation sequence, they are saved to disk in the computer 50. The finished file is stored in  a temporary storage area in computer 50 with the respective order number and a story number playback name. The original base animation file is not overwritten and is left intact to be used in the next production. This process is repeated for all of the animated sequences that require personalization.

  The personalized sequences are then included in the master playback script, which may include "fixed" sequences that do not require re-rendering.



  A POCO program, which is a "C" like computer animation programming language used by Autodesk Animator Pro and the source code of which is appended hereto as APPENDIX II, is employed by the rendering process to place the individually prepared and unique character's head "digital cel" overlays into the pre-rendered animation sequences as described above. Using the animation function calls, the POCO program can shrink, zoom, rotate, flip, then paste the prepared "digital cels" into various X and Y coordinates along predetermined paths in the various "master" animation sequences.



  The character "digital cels" once embedded into the animation sequence are saved as a working version of the animation clip. The file is stored in a working directory in computer 50 and does not overwrite the original or "master" animation sequence. This basic render and save routine is repeated for each sub-sequence of the overall animation and is re-rendered for each personalized video produced. Batch rendering can be performed in this fashion to render multiple animation sequences for multiple orders.



  Overnight or batch rendered orders can further be distributed among several networked computers for rendering.



  More particularly, this animation rendering procedure 21 involves the following steps of the order entry program:  1. Retrieve order. Retrieve order from storage 17. This
 will copy the files needed for rendering to the
 computer 50. These are working copies that will be
 deleted when finished with. The operator then selects
 the order to work on from the local system.



  2. Check   gifs.    The operator can perform quality control
 by viewing the head images on the video monitor. Any
 last minute adjustments can be performed such as
 tweaking of contrast and brightness. A "namemast.txt"
 file is displayed for checking and can be edited by
 clicking on it.

 

  3. Create render batch. This creates a script file to
 render animation for all the orders on the local
 system. This allows the operator to set up a "batch"
 of orders to render in an unattended mode.



  4. Get names. This will bring up a smart name matching
 menu to allow matching of the name displayed with the
 name from the database of digitized names. The
 operator can choose from different characters in the
 story and listen to the sound sample to ensure correct
 pronunciation.



  5. Render sound. This takes the selected digitized names
 and renders them into the "master" sound file. This
 file is then saved as a working file for synchronized
 playback with the animation files.



  6. Quality control. One last quick check before recording
 the animation to video. This will display three key
 frames from the animation and play the digitized names.  



  7. Record animation. This will create a custom animation
 script that includes the animation files for the
 current order. It will then run the animation player
 (Autodesk) and the Windows media player for the MIDI
 background music. The operator is prompted to place a
 tape in the video recorder and hit record. The
 animation player and MIDI music are then started in
 sync and recorded to tape.



  8. Nuke. Remove current order from local system when
 recorded successfully.



  An alternative processing technique to the above "render, save, then record" technique is to perform the same type of keying effect in a "real time" render and record process without actually embedding or pasting the overlay "digital cels" into a master animation. The steps of creating the head cut outs (cl¯head.tga and c2¯gab.tga) are the same, and the rendering of the heads onto characters bodies is still performed.



  The technique departs from the render/save process by the fact that the images are played back as multiple sprites or overlay animations on a separate video plane from the video plane which represents the full frame animation backgrounds.



  The overlay animations on a separate video plane from the video plane which represents the full frame animation backgrounds. The overlay animations, (a character walking played in a cyclic fashion) are processed by a "digital video effects" (DVE) generator software component that resides in the computer 50. The DVE allows separate video planes to be windowed or displayed with separate image control of each video plane. The overlay animation is keyed with the DVE software to create the effect of multiple  planes of video being played back for viewing as a composite image.



  An example of this is a character walking sprite, or overlay animation that contains five individual cels. The cels are repeatedly cycled to create the act of walking for the cartoon character. This animated overlay is played back on plane 1 through the DVE, and the animated backgrounds are played back on plane 2 of the DVE. The plane 1 image's background color is transparent so the overlay animation cel is windowed onto video plane 2. Software controls and coordinates the path of the cycled overlay animation over the screen area by using x and y coordinates. If the background animation is 50 frames the overlay animation is cycled 10 times as the cels are moved over the screen according to x and y coordinates. The video is recorded in real time with the five cell animation cycle being repeated over and over again as the sprite is moved around the screen.



  Another alternative recording technique is to use prestriped time coded tape with blank sections where the personalized sequences can be inserted. Generic video segments that do not contain personalized information are pre-recorded according to the animation's master script.



  The recording device under computer control then uses insert editing techniques to advance and queue the tape recorder.



  When the script calls for a personalized animation segment the video is inserted into the blank area on the time coded tape. When all personalized segments of the tape have been inserted the tape is complete and is ready to be personally labelled and packaged for delivery ready for customer viewing.  



  Each custom animation sequence is further personalized during recording by using A Windows .wav file editor with a macro to create a voice over narrative audio track that features the name of the star or star's, which has been entered in the order entry process 14. Where ever a name appears in the video subtitling text of the animation, the voice over is modified to include a personalized name clip.



  A database of digitally recorded name clips in computer 70 is used in this process. The name is retrieved from the database and rendered into a base, or "master audio clip".



  The "master" clip is a digital audio file that either has a blank space where the star's name can be inserted, or alternately, may consist of pieces of the sentence around the star's name. For example, the video subtitling may read:
 "Matt the castle is in sight".



  The animation sequence would then have the same voice over narration:
   "Matt    the castle is in sight".



  The base or "master audio clip" digital recording of this voice over narrative would be:
 "the castle is in sight"
In this case a digital audio file (matt.wav) would be retrieved from the name database of pre-recorded name clips.



  The program would then append the "master audio clip: at the end. The resulting digital audio file would be:
 "Matt the castle is in sight".  



  This step is repeated over and over via macro program control so the entire process is automated. The entire narrative for the complete animation is customized by this procedure creating a personalized narration for every production.



  Depending on the sentence, the name may be inserted at the beginning, appended to the end or mixed into a blank space in the "master audio   clip".    This process can have side effects depending on the method used. Since the star's name can vary in length, the overall length of the "working audio clip" (insert/append method) used in animation can also vary. The other problem occurs when "mixing" a name of variable length into a fixed blank spaced in the "master" clip. This can leave too much space after the name to sound normal, or in extreme cases may overlap with the next sentence.

 

  These problems are minimized by the technique of using the
ANIMATOR PRO software and .wav file editor to break the animation into individual scenes, each with their own audio clip, thus varying the number of frames in the ANIMATOR PRO program to vary the data stream being processed by the computer to provide a smooth playback of the video and audio files simultaneously. This audio clip file is triggered by the appropriate line in the ANIMATOR PRO Windows Player or similar playback authoring language file. This keeps small timing errors in the audio from accumulating and ensures that the video subtitling will be in approximate sync with the narration.



  More particularly, the recording and digitizing of the names involves the following procedure:  1. An audio digitizer board in a DAT recorder 72 (Figure
 10) is connected to a computer 70.



  2. The recording process is performed in Windows with the
 audio editor. The Wave editor is clicked on to launch
 the record module.



  3. The record/microphone icon is clicked on to record from
 the DAT recorder 72.



  4. A file is called aaa.wav (this is a replaceable junk
 file).



  5. The settings for recording should be 22.05 or 41.0
 KHZ, mono channels and 16 bit resolution.



  6. To listen to the DAT while searching for the required
 sounds, the pause icon is clicked on.



  7. To record, "play" on the DAT is actuated and the record
 button is clicked on (note that the DAT shuts off every
 5 minutes and must be turned off and on to continue
 use).



  8. After recording the aaa.wav, which serves as a
 temporary master, any other wav. file is opened. This
 forces automatic saving of the aaa.wav. The aaa.wav
 file is re-opened to begin editing out the required
 names.



  9. The recorded series of names are edited down to one
 selection by testing and cutting out those that do not
 work. The name should be neutral inflection with
 warmth.  



  10. The name is trimmed by cutting off dead space at either
 end of the wave.



  11. Under the tools menu, "Gain Adjust" is selected to the
 entire file and the start and end gain are increased by
 1 to 3 points.



  12. Dead space at the start of the wave is highlighted and
 "Gain Adjust" is selected from the Tools menu. The
 selected area is chosen and the Macros are set to "Fade    In".   



  13. This process is repeated on the end of the wave and the
 Macros are set to "Fade Out".



  14. The file is saved into the Namehold directory as an
 appropriate name e.g. "johnny.wav".



  15. Steps 7 to 14 are repeated until all the required names
 have been saved.



  The process of matching the thus-obtained digitized name clips with names in the video is assisted by a custom menu forming part of the order entry program. The operator first selects the character to match (star, guest 1, etc.). The name to match is then displayed and the order entry program shows a selection of similar names from the name database for matching. Because names may be spelled differently but sound the name (or vice versa), the operator can play the name clip to confirm a match. This is also useful in checking pronunciation. When a satisfactory name is found, the save button is pressed and the digitized name clip file is moved to a directory for narration rendering on computer 70.  



  The entire voice over audio script with custom name and standard voice over narration tracks is controlled by
ANIMATOR PRO Windows Player or similar scripting language that coordinates the playback of all the animation sequences that will make up the finished video production. The individual animation sequences trigger the playback of the audio file that contains the name of the star in a   "work"    or "master audio   clip".    At the appropriate times in the animation playback sequence, a software trigger initiates the playback of the audio clip from a larger list of audio clips that represent the entire voice over narration for the production.



  This method is implemented to automate the task of creating the custom voice over narration. This methodology, however, produces some of the same side effects as the rendering of the animation (varying name clip audio file sizes), and is further complicated by the animation playback for recording process itself. The custom narration file sizes and the general inability of a computer system to play both animations and large digital audio files simultaneously with smooth consistent results requires synchronization of animation video, audio, and background music be performed as three separate data flows which are divided into small data bursts the computer processor could handle.



  Thus, each time the "base personalized materials" for a video, activity book or a CD-ROM, i.e. the personalized clips which are produced as described above, are to be produced, the entire process outlined above for rendering animation subsequence and creating voice over narration files must be completed. One of the unfortunate by-products of this situation, from a synchronization point of view, is that because each product is customized, no two productions produce exactly the same results, i.e. animation files used  in each video production can vary from 1/2 megabyte to 3-4 megabyte in aggregate file size. Ultimately the final product when mastered onto video, CD-ROM or print will play back the same way each time, but getting consistency overall requires an approach beyond brute force playback of the animation, audio and music files.



  Stability in the production system, and the achievement of consistent playback speed for use in recording, are nontrivial. The sizes of "working" animation production files for any given production sequence are never the same twice
One difference in file sizes stems from the fact that different print photos, once digitized and cut out, will rarely have the same number of relevant (not clear background) pixels. This results in varying file sizes for the cut-out head images used in processing the product and impacts all the way through the production chain.



  The digital narration files that need to be coordinated with the visuals also suffer from the phenomenon of varying size and playback speed. A one syllable name vs. a two syllable name requires a different amount of digital storage space on the hard drive. This results in varying file sizes names and other personalized audio information. Once again, the playback computer system is incapable of providing consistent playback speeds for these scripted files.



  The main impact of this phenomenon is that variance in file size will affect the playback time of individual animation and audio sequences. This has critical implications for the coordination of digital audio voice over narration files as these files need to be synchronized with the animation sequences in an exact sequences in an exact manner so the narration matches the video sequences and video titling.  



  This effort is diagrammatically illustrated in Figure 11, in which a plurality of animation or visual clips A through E are shown at a) and a plurality of corresponding audio clips
Al through El, played as one long sequence, are represented at b). As can be seen, the lengths of the animation clips A through E are greater than those of the audio clips Al through El and, consequently, although the sequences of both the animation clips and the audio clips are initiated simultaneously, they are subsequently out of synchronism with one another.



  By separating the audio clips Al through El as illustrated at c) in Figure 11, the audio clips can be brought into synchronism with respective ones of the animation clips, and this is effected as described in greater detail below.



  The method developed to achieve this effect in practice is to take large files and divide them up into smaller files.

 

  The smaller files play more consistently because the process can digest and multi-task smaller chunks of data more easily. The playback in this sequential fashion is orderly and at more stable speeds.



  Thus, files that made up the animations and voice over narration, e.g. of 12 minute lengths, are divided into files with playback durations of 2 to 10 seconds and approximate file sizes from .5 to 6 megabytes by using ANIMATOR PRO software to select the number of frames used in each file.



  This step is repeated as necessary until synchronization achieved, i.e. computer can process the data stream without stoppages or audio skips. The files are thus scripted using an ANIMATOR PRO, and more specifically ANIMATION PLAYER FOR
WINDOWS, so that each scene of animation would start simultaneously with it's respective sound clip.  



  To further fine tune the coordination of the video and audio components, the animation scripting software has the ability to vary the animation playback speed. The speed of each short animation clip is adjustable and can thus be tweaked to fit the length of it's corresponding audio track.



  Transition zones are also added in the ANIMATOR PRO scripting software to allow the system to blank out the screen, so that variations in animation vs. narration speed correct themselves. The transition period allows the CPU of computer 70 to finish processing any latent information in the background. "Latent information processing" is caused by the inability of the computer to process all three varying in size data streams, (animation, audio, and music) on a consistent basis so the transition which has no large amount of data being triggered or played back allows all the files to be finished playing, and or being removed from the
CPU's RAM or cache memories. The transition then allows the
CPU to begin playing back the next triggered playback event from the script the playback of the data streams becomes more predictable and consistent.



  With two data streams of animation and audio using most of the computers processing power, the third data stream for the music has very little resources available to it.



  Playing CD quality music off the hard drive for e.g. 15 minutes (the length of a finished video production) would require 100's of megabytes of data. In practice, the CPU resources are limited and could not play the required files for voice-over narration and music simultaneously. To overcome this problem and to create background music that requires little of the CPU's computing resources, an industry standard MIDI file format is employed.  



  The background musical sound track is recorded as a standard
MIDI file. By using a 16 bit hardware sound card (Turtle
Beach MULTISOUND) with it's own MIDI processing capabilities and sampled instruments, the task of processing the background music can be off-loaded from the main CPU. This allows the background music to be played back in conjunction with the animation files (.FLC) and the voice over narration files (.WAV) with little impact on these other data streams.



  The MIDI file structure allows for independent control of playback speed, tempo and volume within the same file. Thus the background music can be tweaked for an approximate fit to the overall animation playback.



  The cut out head images created in the cut  & paste process are employed to produce a coloring book in a similar way to the above-described animation rendering. The difference is that, in the coloring book production, the head "cels" are pasted onto still images instead of entire animation sequences. These images are selected from scenes in the animation but are created in higher resolution for use in print. The resolution of a video image (640  & 480) will appear too "jagged" when used as an 8" X 10" print image.



  The print resolution used is approximately 2.5 times this video resolution.



  A master coloring book is created using desktop publishing software (PAGEMAKER). This software allows individual "stories" and "bitmap images" to be linked to images and text files on the hard drive. Whenever any changes are made to a file considered a source image file, i.e. for a page in the book, a new person is rendered into a frame, and the software automatically links and updates the master activity book document. Thus, changes in these stored files will be reflected and updated in the master document.  



  The formatted text files used for the story are created by the order entry system which inserts the personalized names in a "master" story using a programmed search and replace technique.



  This allows operator control of the coloring book rendering process, which is performed employing the following steps: 1. Retrieve order. Same as for render control menu.



  2. Render test batch. This will create a POCO script for
 preparing test images for coloring book quality
 control. The operator then exits to DOS to run the
 rendering script.



  3. Adjust   alps.    Enter adjustment values for contrast and
 brightness for optimized printing of the heads in the
 coloring book. The software will then adjust the
 images.



  4. Create render batch. Creates a batch render file to
 render coloring books for all orders on the system.



   This will paste the cut out heads onto selected images
 from the animation for use in the coloring book.



  5. Print book. This will load up Aldus Pagemaker 5.0 with
 the correct file. This file is linked to the rendered
 images and modified story files for the current
 selected order.  



  A P P E N D I X I
EMI28.1     


<tb>  <SEP> t <SEP> et <SEP> Ee
<tb>  <SEP> I
<tb> Oiilei <SEP> U <SEP> Dirllil,utnr <SEP> 51etc
<tb> 1 <SEP> E <SEP> ii
<tb> Gbin <SEP> GhecL <SEP> )lurnl,el <SEP> Old <SEP> 11 <SEP> I <SEP> lleNumitcr <SEP> I <SEP> Onht <SEP> Dcle
<tb> I <SEP> I <SEP> I <SEP> I <SEP> I <SEP> I <SEP> J
<tb> clidi <SEP> lnIoimaicn
<tb>  <SEP> Iiei <SEP> Qurnlilr <SEP> A
<tb>  <SEP> 1:1 <SEP> IJI.S <SEP> Video <SEP> lape <SEP> and <SEP> cnlmninp <SEP> bk <SEP> htolt <SEP> cmbinFtbn. <SEP> X <SEP> El <SEP> O
<tb>  <SEP> z <SEP> sc.ss <SEP> Video <SEP> lap. <SEP> and <SEP> .:olnuiing <SEP> bonk <SEP> ccnnlinicm. <SEP> X <SEP> El <SEP> 2
<tb>  <SEP> o <SEP> S14.35 <SEP> Adtlkiannl <SEP> nFl <SEP> copy <SEP> id <SEP> piionaUro'l <SEP> veil.. <SEP> lapo. 

  <SEP> X <SEP> El <SEP> z
<tb> O <SEP> t <SEP> 3.:irJ <SEP> Ad,1ilion <SEP> copies <SEP> nt <SEP> pain <SEP> payer <SEP> cnleuinD <SEP> lw-k. <SEP> X <SEP> El <SEP> D
<tb>  <SEP> O <SEP> Yes <SEP> le <SEP> iling <SEP> vial.
<tb>



  I <SEP> 1I3 <SEP> licml <SEP> Ir <SEP> 1
<tb>  <SEP> l'enn liteel <SEP> Ueeezgn <SEP> * <SEP> Ualt <SEP> SlVeiqi
<tb>  <SEP> O <SEP> r.,.u <SEP> Xiii;; <SEP> llne
<tb> Cueal <SEP> 2-s <SEP> NMee <SEP> O <SEP> FoigoUnI <SEP> King. <SEP> T)moo
<tb> bill <SEP> t;ivel-s <SEP> Nain. <SEP> El. <SEP> Chlrtls <SEP> P,nnnmndn
<tb>  <SEP> &verbar; <SEP> 1 <SEP> cl <SEP> ctfge <SEP> r <SEP> /nee
<tb> l'le <SEP> ne <SEP> Numlee <SEP> 1;;11 <SEP> Dele <SEP> tlnzl <SEP> r* <SEP> b
<tb>  <SEP> Yendt <SEP> NtttelZelef <SEP> &verbar;

  <SEP> de <SEP> &verbar;&verbar;D*vµ, <SEP> Ihelee <SEP> &verbar;
<tb>      lNVENTRY.FRM-   
Dim   MylnvTable    As Table
Sub ExitRoutine ()
 If Changes% = True Then
 Responce% = MsgBox("Exit without saving changes?", 292, "Clear Entry")
 If Responce% = IDNO Then
 Exit Sub
 Elself Responce% = IDYES Then
 End
 End If
 Else
 End
 End If
End Sub
 Sub MyFieldFill ()
 Set MyField(0)   =      MylnvTable("BlankVideoCassettes")   
 Set MyField(l) = MylnvTable("Brochures")
 Set MyField(2) = MylnvTable("BrownPaper")
 Set MyField(3) = MylnvTable("CardBoardlnserts")
 Set MyField(4) = MylnvTable("ColouringBookBacks")
 Set MyField(5) = MyInvTable("ColouringBookCovers")
 Set MyField(6) = MyInvTable("ColouringBookPrintBundles")
 Set MyField(7) = MyInvTable("ConstructionPaper")
 Set MyField(8) =  <RTI  

    ID=29.5> MylnvTable("DPagelnserts")   
 Set MyField(9) =   MylnvTable("JobBoxes")   
 Set   MyField(10)      =    MylnvTable("PlasticZipLockBags")
 Set MyField(ll) = MylnvTable("PRColouringBooks")
 Set   MyField(12)    = MyInvTable("PRVideoCassettes-Mono")
 Set   MyField(13)    =   MylnvTable("PRVideoCassettes-Stereo")   
 Set   MyField(14)    = MylnvTable("PRV ideoCassettesBackSleeves")
 Set MyField(15) = MyInvTable("PrinterLabels")
 Set MyField(16)   =      MylnvTable("ShippingBoxes")   
 Set MyField(17)   =    MyInvTable("SmallStickers-Red")
 Set MyField(18) = MyInvTable("SmallStickers-Yellow")
 Set MyField(19) =  <RTI  

    ID=29.16> MylnvTable("SmallStickers-Green")   
 Set MyField(20) = MyInvTable("VideoCassetteBoxes-White")
 Set MyField(21) = MyInvTable("VideoCassetteSideLabelSheets")
 Set MyField(22) = MyInvTable("VideoCassetteTopLabelSheets")
 Set MyField(23) = MylnvTable("VideoCassetteFrontSleeves")
 Set MyField(24) = MylnvTable("WhitePaper-Letter")
 Set MyField(25) = MyInvTable("PlasticBindingCombs-White")
End Sub
Sub ScreenFill ()
 MyTable.Edit
 If   MyField(0) >       0    Then
 tbQuantity(0).Text = CStr(MyField(0))
 Else  
 thQuantity(0).Text = "0"
 End If
 If MyField(l)  >    0    Then
 tbQuantity(l).Text = CStr(MyField(l))
 Else   lNVENTRY.FRM- 2   
 tbquantity(1).Text = Cstr (MyField (2))
End If
If MyField(2)  >    0    Then
 tbQuantity(2).Text = CStr(MyField(2))
Else
 

   tbQuantity(2).Text = "0"
End If
If MyField(3)  >    0    Then
 tbQuantity(3).Text = CStr(MyField(3))
Else
 tbQuantity(3).Text = "0"
End If
If MyField(4) >    0    Then
 tbQuantity(4).Text = CStr(MyField(4))
Else
 tbQuantity(4).Text = "0"
End If
If   MyField(S) >       0    Then
 tbQuantity(5).Text = CStr(MyField(5))
Else
 tbQuantity(5).Text = "0"
End If
If MyField(6)  >    0    Then
 tbQuantity(6).Text = CStr(MyField(6))
Else
 tbQuantity(6).Text = "0"
End If
If MyField(7)  >    0    Then
 tbQuantity(7).Text = CStr(MyField(7))
Else
 tbQuantity(7).Text = "0"
End If
If MyField(8)  >    0    Then
 tbQuantity(8).Text = CStr(MyField(8))
Else
 tbQuantity(8).Text = "0"
End If
If MyField(9)  >    0    Then
 tbQuantity(9).Text = 

   CStr(MyField(9))
Else
 tbQuantity(9).Text = "0"
End If
If MyField(10)  >    0    Then
 tbQuantity(10).Text = CStr(MyField(10))
Else  
 tbQuantity( I O).Text = "0"
End If
If   MyField(ll)  >       0    Then
 tbQuantity(11).Text = CStr(MyField(11))
Else
 tbQuantity(ll).Text = "0"
End If
If MyField(12)  >    0    Then
 tbQuantity( I 2).Text = CStr(MyField( 12))
Else
 tbQuantity(12).Text = "0"
End.

  If
INVENTRY.FRM - 3
If MyField(13)    > 0    Then
 tbQuantity(13).Text = CStr(MyField(13))
Else
   tbQuantity( 1 3).Text    =
End If
If MyField(14)  >    0    Then
 tbQuantity(14).Text = CStr(MyField( 15))
Else
 tbQuantity(15).Text = "0"
End If
If MyField(16)  >  0 Then
 tbQuantity( 1 6).Text = CStr(MyField( 16))
Else
 tbQuantity( I 6).Text = "0"
End If
If MyField(17)  >  0 Then
 tbQuantity(1 7).Text = CStr(MyField( 17))
Else
 tbQuantity( I 7).Text = "0"
End If
If MyField(18)  >    0    Then
 tbQuantity(18).Text = CStr(MyField(18))
Else
 tbQuantity( I 8).Text = "0"
End If
If MyField(19)  >  0 Then
 tbQuantity( I 9).Text = CStr(MyField( 19))
Else
 tbQuantity( 19) Text = "0"
End If
If   MyField(20)  >       0    Then
 tbQuantity(20).Text = CStr(MyField(20))
Else
 

   tbQuantity(20).Text = "0"
End If   If MyField(21)  >       0    Then
 tbQuantity(21).Text = CStr(MyField(21))
 Else  
 tbQuantity(21).Text = "0"
End If
If   MyField(22)  >     O Then
 tbQuantity(22).Text = CStr(MyField(22))
Else
 tbQuantity(22).Text = "0"
End If
If   MyField(23) >     O Then
 tbQuantity(23).Text = CStr(MyField(23))
Else
 tbQuantity(23) Text = "0"
End If
If   MyField(24) >     O Then
 tbQuantity(24).Text = CStr(MyField(24))
Else
 tbQuantity(24).Text = "0"
End If
If MyField(25)  >  O Then
 tbQuantity(25).Text = CStr(MyField(25))   INVENTRY.FRM -4   
Else
 tbQuantity(25).Text = "0"
End If
End Sub
NAMECHEK.FRM - 1
Sub cmdOK - Click ()
 Unload Form6
End Sub   STARTUP.FRM - I   
Sub   cmdinventory    Click 

   ()
 DBName =   ordersdirS     & "orders.mdb"
 Set MyDb = OpenDatabase(DBName)
 Set MyTable = MyDb.OpenTable("lnventory")    Fonin4.Show   
 Unload Form5
End Sub
Sub cmdOrderEntry¯ Click ()
 DBName = ordersdir$  & "orders.mdb"
 .Set MyDb = OpenDatabase(DBName)  
 Set MyTable = MyDb.OpenTable("Orders")    Form7.Show   
 Unload FormS
End Sub
Sub Form   ¯Load ()   
 Dim Buffer As String   *    255
 Static Success As Integer
 Dim ds As dynaset
   nBytes%    = GetPrivateProfileString("General",   "OrderDataBase",    "d:

  :\Serious\",
 Buffer, 250, "productn.ini")
   ordersdirS    = Left$(Buffer,   nBytes%)   
 nBytes% = GetPrivateProfileString("General", "OptionOne",   "29.95",    Buffer, 2 50, "productn.ini")
 OptionOneS = Leff$(Buffer, nbytes%)
 nBytes%   =    GetPrivateProfileString("General", "OptionTwo", "39.95", Buffer, 2 50, "Productn.ini")
 OptionTwoS = LeftS(Buffer, nBytes%)
 nBytes% = GetPrivateProfileString("General", "OptionThree","14.95",Buffer, 250, "productn.ini")
 OptionThree$ = Left$(Buffer,nBytes%)
 nBytes%= GetPrivateProfileString("General", "OptionFour", "9.95", Buffer, 2 50, "productn.ini")
 OptionFourS = Left$(Buffer, nBytes%)
 nBytes% =   GetPrivateProfileString("General ",    "RemoteOrdersDrive", "W: 

  :\", Buf fer, 250, "Productn.ini")
 RemoteOrdersDrive$ = Left$(Buffer, nBytes%)
 nBytes% = GetPrivateProfileString("General", "OrdersDirectory", "\fkf\orders \", Buffer, 250, "Productn.ini")
 OrdersDirectoryS =   LeflS(Buffer,    nBytes%)
   nBytes% =    GetPrivateProfileString("General", "BaseTextDir",   "W:\fkf\basetext    \", Buffer, 250, "Productn.ini")
 BaseTextDir$ = Left$(Buffer, nBytes%)
 ErrorMsg = "Iggy Error"
 If   App.Previnstance    Then 'load only one
 Beep
 MsgBox "The Order Database is already running.", 16, ErrorMsg
 End
End If   STARTUP.FRM-2    'open up that database
End Sub
SUPENTER.FRM - 1  
 Dim   HasHit /O   
 Sub ClearEntry ()
 UniqueSearchID.Text = ""
 StoreNumber.Text = ""
 ClaimCheckNumber.

  Text = ""
 Distributor.Text
 Batch.Text = ""
 BoxNumber.Text = ""
 For Counter% = O To 3
 Item(Counter%).Value = 0
 Quantity(Counter%).Text = ""    SubTotal(CounterO/o).Caption = ""   
 Next Counter%
 Total.Caption = ""
 StarName.Text
 StarLastname.Text = ""
 Age.Text =
 starcity.Text = ""
 GuestlName.Text
 Guest2Name.Text = ""
 SupplierName.Text = ""
 Phonel.Text = ""    Message.

  Text   
 fkfl.Value = 0
   fkf3.Value =    0
   Promo-Value      =    0
   Forrn2.BillTol.Text    =
 Form2.BillTo2.Text = ""
 Form2.BillTo3.Text = ""
 Form2.Province.Text = ""
 Form2.Country.Text = ""    Form2.BillToPostalCode.Text = ""   
 Form2.Carrier(O).Value = 0
 Form2.Carrier(l).Value = 0
 Form2.Carrier(2).Value = 0
 Form2.DateShipped.Text = ""
 GiftDate.Text = ""
   OrderDate.Text =    Format(Now, "MMMM DD, YYYY")
   GiftDate.Text =    Format(Now, "MMMM YYYY")
End Sub
Sub ExitRoutine ()
 If changes% = True Then
 Responce% = MsgBox("Exit without saving changes?", 292,

   "Clear Entry
 If Responce% = IDNO Then
 Exit Sub
 Elself Responce% = IDYES Then
 End
 End If
 Else
 End  
 End If
End Sub
Sub MessageSplit ()   SUPENTER.FRM -2   
 If Trim(Message.Text-r   # "" Then   
 TempS = ""
 CurLine% = 1
 HasHit% = 0
 Message.Text MyField(23)
 MsgText$(1) = ""
 MsgText$(2) = ""
 MsgText$(3) = ""
   MsgText$(4)    ""
 MsgText$(5) = ""
 For i = 1 To Len(MyField(23)) 'Len(Message.Text)
 NextCharS =Mid$(MyField(23),

   i,   1)   
 If Asc(NextChar$) = 10 Then NextChar$ ="
 If Asc(NextChar$) = 13 Then
 MsgText$(CurLine%) = Trim(Temp$)
 Temp$= ""
 CurLine% =   CurLine% + I   
Else
 Temp$ = Temps + NextChar$
End If
Next   If CurLine% - I = I Then   
 MsgText$(3) = MsgText$(1)
 MsgText$(4) = ""
 MsgText$(2) = ""
 MsgText$(1) = ""   Elseif    CurLine% - I = 2 Then
 MsgText$(4) = MsgText$(3)
 MsgText$(3) = MsgText$(2)
 MsgText$(2) = MsgText$(1)
 MsgText$(1) = ""
ElseIf CurLine%- I = 3 Then
 MsgText$(4) = MsgText$(3)
 MsgText$(3) = MsgText$(2)
 MsgText$(2) = MsgText$(1)
 MsgText$(1) = ""
End If
 Save.messagel = ""
 Save.message2 = ""
 Save.message3
 Save.message4 = ""
 Save.message5 = "'  
 Save.messagel = MsgText(l)
 Save.message2 = MsgText(2)
 Save.message3 = MsgText(3)
 Save.message4 = MsgText(4)
 Save.message5 = 

   MsgText(5)
Elself Trim(Message.Text) = "" Then    Save.messagel= ""   
 Save.message2
 Save.message3
 Save.message4    Save.messageS = ""
SUPENTER.FRM -3   
 End If
End Sub
Sub MyFieldFill ()
 Set MyField(0) = MyTable("Store")
 Set MyField(l) = MyTable("ClaimCheckNumber")
 Set MyField(2) = MyTable("Distributor")
 Set MyField(3) = MyTable("Batch")
 Set MyField(4) = MyTable("BoxNumber")
 Set MyField(5) = MyTable("OnePersonVideo")
 Set MyField(6) = MyTable("OnePersonVideoQuantity")
 Set MyField(7) = MyTable("ThreePersonVideo")
 Set MyField(8) = MyTable("ThreePersonVideoQuantity")
 Set MyField(9) =   MyTable("AdditionalVideos")   
 Set   MyField(10)    =   MyTable("AdditionalVideosQuantity")   
 Set MyField(ll) = MyTable("AdditionalBooks")
 Set MyField(12) =  <RTI  

    ID=36.6> MyTable("AdditionalBooksQuantity")   
 Set   MyField(13)    = MyTable("MailingList")
 Set MyField(14) = MyTable("Total")
 Set MyField(15) = MyTable("Star'sFirstName")
 Set MyField(16) = MyTable("Star'sLastName")
 Set   MyField(l7)    = MyTable("StarsAge")
 Set   MyField(18)    = MyTable("Star'sCity Province")
 Set   MyField(19)    = MyTable("GuestOne'sName")
 Set MyField(20) = MyTable("GuestTwo'sName")
 Set   MyField(2 1)    =   MyTable("G iflGive?sName")   
 Set MyField(22) = MyTable("PhoneNumber")
 Set MyField(23) = MyTable("PersonalizedMessage")
 Set MyField(24) = MyTable("ForgetFullKingOne")
 Set MyField(25) = MyTable("ForgetFullKingThree")
 Set MyField(26) =   MyTable('NoChargePromo")   
 Set MyField(27) = 

   MyTable("ShippingAddressOne")
 Set MyField(28) = MyTable("ShippingAddressTwo")
 Set MyField(29) =   MyTable("ShippingAddressThree")   
 Set MyField(30) = MyTable("ShippingProvince")
 Set MyField(31) = MyTable("ShippingCountry")
 Set MyField(32) =   MyTable("ShippingZip").   



   Set MyField(33) = MyTable("Mail")
 Set MyField(34) = MyTable("TwoDayFedX")  
 Set MyField(35) = MyTable("OverNightFedX")
 Set MyField(36) = MyTable("DateShipped")
 Set MyField(37) = MyTable("OrderDate")
 Set MyField(38) = MyTable("GiftDate")
End Sub
Sub ScreenFill ()
 MyTable.Edit
 If MyField(0) o "" Then StoreNumber.Text = MyField(0)
 If MyField(1) o "" Then ClaimCheckNumber.Text = MyField(l)
   If MyField(2)      o      ""Then    Distributor.Text = MyField(2)
 If MyField(3)   #    "" Then Batch.Text=MyField(3)
 If MyField(4) o "" Then BoxNumber.Text = MyField(4)
 If MyField(37)   # "" Then    OrderDate.Text =   Forinat$(MyField(37),    "MMMM DD,

   YY
YY")
 If MyField(S) = True Then
 Item(0).Value = 1
 If MyField(6) o "" Then Quantity(0).Text = MyField(6)   SUPENTER.FRM -4   
   CurrencyHolder&commat;-    Clnt(Quantity(O).Text) * CCur(OptionOne$)
 SubTotal(O).Caption =   Fonnat(CurrencyHolder&commat;,    "&num;,&num;&num;&num;0.00")
 End If
 If MyField(7) = True Then
 Item(l).Value I
 If   MyField(S)      # 11"   Then Quantity(l).Text = MyField(8)
   CurrencyHolder&commat;      =    Clnt(Quantity(l).Text) * CCur(OptionTwoS)
 SubTotal(l).Caption   =      Format(CurrencyHolder&commat;,    "&num;,&num;&num;&num;

  ;0.00")
 End If
 If MyField(9) = True Then
 Item(2).Value = 1
 If   MyField(10)      ""Then    Quantity(2).Text = MyField(10)
   CurrencyHolder&commat;      =      CInt(Quantity(&commat;.Text)   * CCur(OptionTwoS)
 SubTotal(2).Caption =   Format(CurrencyHolder&commat;,    "&num;,&num;&num;&num;0.00")
 End If
 If MyField(ll) = True Then
   Item(3).Value =    I
 If MyField(12)   ""Then    Quantity(3).Text = MyField(12)
   CurrencyHolder&commat;    = Clnt(Quantity(3).Text)   *    CCur(OptionTwoS)
 SubTotal(3).Caption =   Format(CurrencyHolder&commat;,    "&num;,&num;&num;&num;

  ;0.00")
 End If
 If MyField(13) = True Then Item(4).Value   =    1
 If MyField(14)   # "" Then    Total.Caption = Format(MyField(14),"&num;,&num;&num;&num;0.00")
 If MyField(15)   O    ""Then StarName.Text = MyField(15)
 If MyField(16)   # "" Then    StarLastname.Text   =    MyField(16)
 If MyField(17)   # "" Then    Age.Text=MyField(17)
 If   MyField(18)      # "" Then    starcity.Text = MyField(18)
 If MyField(l9)  <  >    # ""   Then GuestlName.Text = MyField(l9)
 If MyField(20) o "" Then Guest2Name.Text   =    MyField(20)    If MyField(21) # "" Then SupplierName.Text = MyField(21)   
 If MyField(22) o "" Then Phonel.Text  <RTI   

    ID=37.38> =    MyField(22)  
 If MyField(23)   #    "" Then
 Message.Text =
 Message.Text = MyField(23)' Set Up Proper Formatting
 End If
 If MyField(24) = True Then fkfl.Value = 1
 If MyField(25) = True Then fkf3.Value   =.1   
 If MyField(26) = True Then Promo.Value = I
 If MyField(27)  <  > " o " " Then   Form2.BillTol.Text    = MyField(27)
 If MyField(28) o " " Then   Form2.BillTo2.Text    = MyField(28)
 If MyField(29) o " "Then Form2.BillTo3.Text = MyField(29)
 If MyField(30)   #    ""Then Form2.Province.Text = MyField(30)
 If   MyField(3 1)    o   " " Then    Form2.Country.Text =   MyField(3 1)   
 If MyField(32)  <  >  o " " Then Form2.BillToPostalCode.Text = MyField(32)
 If MyField(33) = True Then  

     Form2.Carrier(0).Value      =    1
 If MyField(34) = True Then Form2.Carrier(l).Value = 1
 If MyField(35) = True Then Form2.Carrier(2).Value = I
 If MyField(36)   # "" Then    Form2.DateShipped.Text = CStr(MyField(36))
 If MyField(38)   # "" Then      GiftDate.Text    = Format$(MyField(38), "MMMM YYYY")
End Sub
Sub Age¯Change   #   
 If L:

  :en(RTrim$(Age.Text)) >  15 Then
 KeyAscii = 0
 Beep
 msg$ = "You have already reached the maximum number of characters alowde
SUPENTER.FRM - 5 d."
 Msgbox msg$
 Age.Text = Left$(Age.Text, 15)
 Age.SelStart = 15
 End If
 Save.Age = Age.Text
 changes% = True
End Sub
Sub Age KeyPress (KeyAscii As Integer)
 If KeyAscii = ENTER Then
 KeyAscii = 0
 starcity.SetFocus
 End If
End Sub
Sub   batch¯Change    ()
 If Len(RTrimS(Batch.Text))  >  5 Then
 KeyAscii = 0
 Beep
 msg$ = "You have already reached the maximum number of characters alowde  
 MsgBox msg$
 Batch.Text =   Left$(Batch.Text,      5)   
 Batch.SelStart = 5
 End If
 changes% = True
End Sub
Sub batch¯KeyPress (KeyAscii As Integer)
 If KeyAscii = ENTER Then
 KeyAscii = 0
 OrderDate.SetFocus
 End If
End Sub   
Sub BoxNumber¯Change #
 

   IfLen(RTrimS(BoxNumber.Text)) S 5 Then   
 KeyAscii = 0
 Beep
 msg$ = "You have already reached the maximum number of characters aiowde
 d."
 MsgBox msg$
 BoxNumber.Text =   Left$(BoxNumber.Text,      5)   
 BoxNumber.SelStart = 5
 End If
 changes% = True
 Save.

  BoxNumber = BoxNumber.Text
End Sub
Sub By Change (Index As Integer)
 changes% = True
End Sub
Sub ClaimCheckNumber¯Change ()   SUPENTER.FRM - 6   
 If Len(RTrim$(ClaimCheckNumber.Text))  >  20 Then
 KeyAscii =0
 Beep
 msg$ = "You have already reached the maximum number of characters alowde
 d."
 MsgBox msg$
 ClaimCheckNumber.Text = Left$(ClaimCheckNumber.Text,

   20)
 ClaimCheckNumber.SelStart = 20
 End If
 Save.ClaimCheckNumber = ClaimCheckNumber.Text
 changes% = True
End Sub
Sub   ClaimCheckNumber¯KeyPress    (KeyAscii As Integer)
 If KeyAscii = ENTER Then
 KeyAscii   =0   
 Distributor.SetFocus  
 End If
 End Sub
 Sub ClaimCheckNumber¯LostFocus ()
 Batch.SetFocus
   Save.date    = OrderDate.Text
 End Sub
 Sub   cmdNewOrderClick    ()
 If changes% = True Then
 Responce% = MsgBox("Save changes to this order?", 292,

   "Clear Entry"
 If Responce% = IDYES Then
 Exit Sub
   ElselfResponce%    = IDNO Then
 ClearEntry
 changes% = False
 MyTable.AddNew
 End If
 Else
 ClearEntry
 MyTable.AddNew
 End If
   changes    = False
 Distributor.SetFocus
 End Sub
 Sub cmdSave¯Click ()
 If changes% = False Then Exit Sub
 Wait = True
 MyTable("Store")= StoreNumber.Text
 MyTable("ClaimCheckNumber") = ClaimCheckNumber.Text
 MyTable("UniqueKey") = ClaimCheckNumber.Text  & BoxNumber.Text
 MyTable("Distributor") = Distributor.Text
 MyTable("Batch")= Batch.Text    MyTable("BoxNumber") = BoxNumber.Text   
   If Item (0).

  Value    = 1 Then MyTable("OnePersonVideo") = True
   MyTable("OnePersonVideoquantity") =    Quantity(0).Text
SUPENTER.FRM - 7
 If Item(1).Value = I Then   MyTable("ThreePersonVideo") =    True
 MyTable("ThreePersonVideoQuantity") = Quantity(1).Text
 If Item(2). Value = I Then MyTable("AdditionalVideos") = True    MyTable("AdditionalVideosQuantity")= Quantity(2).Text   
 If Item(3).Value = I Then MyTable("AdditionalBooks") = True
 MyTable("AdditionalBooksQuantity") = Quantity(3).Text
 If Item(4).Value = I Then MyTable("MailingList") = True
 MyTable("Total")= Total.Caption
 MyTable("Star'sFirstName") = StarName.

  Text
   MyTable("Star'sLastName") =    StarLastname.Text  
 MyTable("StarsAge") = Age.Text
 MyTable("Star'sCity Province") = star city.Text
 MyTable("GuestOne'sName") = GuestlName.Text
 MyTable("GuestTwo'sName") = Guest2Name.Text
   MyTable("GiftGiver'sName")    = SupplierName.Text
   MyTable("PhoneNumber") =    Phonel.Text
 MyTable("PersonalizedMessage") = Message.Text
 If fkfl.Value = True Then MyTable("ForgetFullKingOne") = True
   If fkf3.Value    = True Then MyTable("ForgetFullKingThree") = True
 If Promo.Value = I Then MyTable("NoChargePromo") = True
   MyTable("ShippingAddressOne") =    Form2.BillTol.Text
 MyTable("ShippingAddressTwo") = Form2.BillTo2.Text
 MyTable("ShippingAddressThree") = Form2.BillTo3.Text
 MyTable("ShippingProvince")  <RTI  

    ID=41.5> Form2.Province.Text   
   MyTable("ShippingCountry") =    Form2.Country.Text
   MyTable("ShippingZip") =    Form2.BillToPostalCode.Text
 If   Form2.Carrier(0).Value    = I Then MyTable("Mail") = True
 If Form2.Carrier(l).Value = I Then MyTable("TwoDayFedX") = True
 If Form2.Carrier(2).Value = I Then MyTable("OverNightFedX") = True
   MyTable("DateShipped") =    Form2.DateShipped.Text
   MyTable("OrderDate") =    OrderDate.Text
 My Table("GiftDate") = GiftDate.Text
 MyTable.Update
 changes% = False
 Dim AreYouSure, Foundit, 

   Success As Integer
 Dim msg As String
 Dim RecNo As Long
 Dim VBFileNumber As Integer
 Dim FileName As String * 40
 'ReDim msgtextS(5)
 On Error Resume Next
 RemoteWorkDir$ =   Left$(RemoteOrdersDnveS,    2) + OrdersDirectoryS + Trim(Clai
 mCheckNumber.Text  & BoxNumber.Text) +"\"
 RemoteDirS = Left$(RemoteOrdersDrive$, 2) + OrdersDirectory$ + Trim(ClaimChe
 ckNumber.Text  & BoxNumber.Text)
 MkDir RemoteDirS
 FileName = RemoteWorkDir$ + "namemast.txt"
 Open FileName For Output As   &num;1   
 If StarLastname.Text   ""Then   
 Print &num;1, I, Trim(Save.starfirstname) + " " + Trim(Save.StarLastname)
 Else
 Print &num;1,   Trim(Save.starfirstname)   
SUPENTER.

  FRM-8
 End If
 If Age.Text o "" Then
 Print &num;1, "age " + Trim(Save.Age)  
 Else
 Print &num; I,
 End If
 Print &num;1, Trim(Save.starcity)
 Print &num;1, Format$(Trim(Save.GiftDate), "MMMM YYYY")
   Print &num;1,    Trim(Save.messagel)
 Print &num;1, Trim(Save.message2)
   Print &num;1,    Trim(Save.message3)
 Print &num;1, Trim(Save.message4)    Print &num;

  I, Trim(Save.message5)   
 Print &num; 1, Trim(Save.starfirstname)
 Print &num;1, Trim(Save.GuestlName)
 Print &num; 1, Trim(Save.Guest2Name)
 Print &num;1, Trim(Save.SupplierName)
 Print &num;1, Trim(ClaimCheckNumber.Text  & BoxNumber.Text)
 Print &num;1, ""
 Print &num;1, "Work Order &num; " + Trim(ClaimCheckNumber.Text  & BoxNumber.Text)
 Print &num;1, ""
 If   Item(0).Value =    1 Then
 SingleVideo$ = CStr(Clnt(Quantity(0).Text) * Val(OptionOne$))
 'Print &num;1, "Video with Single Star" + Chr$(9) + Quantity(0).Text + Chr$( 9) + "x" +   ChrS(9) +    "29.95" + Chr$(9) + "S" + SingleVideoS
 Print &num;

  ;1, "Video with Single Star" + Chr$(9) + Quantity(0).Text +   ChrS(9    ) + "x" + Chr$(9)+ Trim(OptionOne$) + Chr$(9) + FormatS(SingleVideoS, "currency
 Else
 SingleVideoS =   "S0.00"   
 'SingleVideoS = " "
 Print &num;1, "Video with Single Star" + Chr$(9) + "0" + Chr$(9) + "x" + Chr $(9) + Trim(OptionOne$) + Chr$(9) + SingleVideoS
 End If
 If Item(l).Value = I Then
 FamilyVideo$ = CStr(CInt(Quantity(1).Text)* Val(OptionTwo$))
 'Print   l,    "Family Version" + Chr$(9) + Quantity(l).Text + Chr$(9) + "x"
 + Chr$(9)+ "S39.95" + Chr$(9)+   "S"    + FamilyVideo$
 Print &num;1, "Family Version" +   ChrS(9) +    Quantity(l).Text + Chr$(9)+ "x"
 + Chr$(9) + Trim(OptionTwo$) + Chr$(9) + Format$(FamilyVideo$, "currency")
 Else
 FamilyVideoS = "$0.00"
 'FamilyVideo$=
 Print &num;

  ;1, "Family Version" + Chr$(9) + "0" + Chr$(9) + "x" + Chr$(9) + T rim(OptionTwo$) + Chr$(9) +   FamilyVideoS   
 End If
 If Item(2).Value = I Then
 DuplicateVideo$ = CStr(CInt(Quantity(2).Text) * Val(OptionThree$))
 'Print &num;1, "Duplicate Video" + Chr$(9) + Quantity(2).Text + Chr$(9) +"x " + Chr$(9) + "14.95" + Chr$(9) +   "$"    + DuplicateVideo$
 Print &num;1, 1, "Duplicate Video" + Chr$(9) + Quantity(2).Text + Chr$(9) + "x" + Chr$(9) + Trim(optionThree$) +   ChrS(9) +    Format$(DuplicateVideo$, "currency")  
 Else
 DuplicateVideo$ = "$0.00"    SUPENTER.FRM -9   
 'DuplicateVideo$ = ""
 Print &num;

  ;1, "Duplicate Video" + Chr$(9) + "0" + Chr$(9) + "x" + Chr$(9) +
 Trim(OptionThree$) + Chr$(9) + DuplicateVideo$
 End If
 If Item(3).Value = I Then
 AdditionalBooks$   =    CStr(Clnt(Quantity(3).Text) * Val(OptionFour$))
 'Print &num;1, "Additional Books" + Chr$(9) + Quantity(3).Text + Chr$(9) +"
 x" + Chr$(9); Trim(OptionFour$) + Chr$(9) + "S" + AdditionalBooksS
 Print &num;1, I, "Additional Books" + Chr$(9) + Quantity(3).Text + Chr$(9) + "x
 "+Chr$(9);

  Trim(OptionFour$) + Chr$(9) + Format$(AdditionalBooks$, "currency")
 Else
 AdditionalBooks$ = "$0.00"
 'AdditionalBooks$ = ""
 Print   &num;    I, "Additional Books" + Chr$(9) + "0" + Chr$(9) + "x" + Chr$(9)+
 Trim(OptionFour$) + Chr$(9) + AdditionalBooks$
 End If
   TheTotal&commat;    = CCur(SingleVideo$)+ CCur(FamilyVideo$) + CCur(DuplicateVideoS)
 + CCur(AdditionalBooksS)
 'Print &num;1, "Total" + Chr$(9) + Chr$(9) + Chr$(9) + Chr$(9) + "$" + CStr(TheT    otal&commat;)   
 Print &num;1, "Total" + Chr$(9) + Chr$(9) + Chr$(9) + Chr$(9) + Format$(TheTotal
   &commat;,    "Currency")
 Print &num;1, I, "Videos: " + Trim(CStr(CInt(Quantity(0).Text +   ".1") +    Cint(Quanti
 ty(l).

  Text+   ".1") +    Clnt(Quantity(2) Text+ ".1")))    Print &num; 1, Books: " + Trim(CStr(Clnt(Quantity(3).Text + ".1") + 1))   
 Close   &num; I   
 If Form2.Carrier(0).Value = True Then
 Form2.CarrierHolder.Text = "M"
 Elself   Form2.Carrier(l).Value    = True Then
 Form2.CarrierHolder.Text =
 Elself   Form2.Carrier(2).Value    = True Then
 Form2.CarrierHolder.Text = "0"
 End If
 FileName = RemoteWorkDir$ + Trim(Left$(ClaimCheckNumber.Text  & BoxN umber.Tex t, 8)) + ". inf"
 Open FileName For Output As &num;1
 Print &num;1, "[General]"
 If Form7.fkfl. Value = True Then
 Print &num;1, "VideoType   =      I "   
 Print &num;1, "UseGenericCharacter = False"  
 ElseIf Form7.fkf3.

  Value True Then
 Print &num;1, "VideoType = 3"
 If cbGenericChar.Value = 1 Then
 Print &num;1, "UseGenericCharacter = True"
 ElseIf cbGenericChar. Value =   0    Then
 Print &num; I, "UseGenericCharacter = False"
 End If
 End If
 Print &num;1, "Digitizing = Not¯Done"
   SUPENTER.FRM-    10
 Print &num;1, "Cutting = Not¯Done"
 Print   &num; 1,    "Processing = Not¯Done"    Print &num;1, 1, "VideoTransfer = Not Done"   
 Print &num;1, "BookTransfer = Not-Done"
 Print &num;1, "Archiving = Not¯Done"
 Close   &num;1   
 '--- create dummy files to aid in digitizing process
 If Form7.fkf3.

  Value = True Then 'if family version
 FileName = RemoteWorkDir$ + "Cl¯Gab.gif"
 Open FileName For Output As&num;l
 Print &num;1,
 Close   &num;1   
 FileName = RemoteWorkDir$ + "C2¯Gab.gif"
 Open FileName For Output As&num;l
 Print &num;1,
 Close   41   
 FileName = RemoteWorkDir$ + "Cl¯head.tga"
 Open FileName For Output   As4I   
 Print &num;1, ""
 Close &num;1
 FileName = RemoteWorkDir$ + "C2¯head.tga"
 Open FileName For Output As&num;l
 Print &num;1, ""
 Close   41   
 If cbGenericChar.Value = 0 0 Then
 FileName = RemoteWorkDir$ + "C3¯Gab.gif"
 Open FileName For Output As &num;1
 Print   &num;1,""   
 Close &num;1
 FileName = RemoteWorkDir$ + "C3¯Head.tga"
 Open FileName For Output As &num;1
 Print   41,   
 Close &num; 

  ;1
   ElselfcbGenericChar.Value =    I Then
 FileCopy Base TextDir$ + "CodyBook.Gif", RemoteWorkDir$ + "C3¯Book.Gi f"
 FileCopy Base TextDir$ + "CodyHead.Gif", RemoteWorkDir$ + "C3¯Head.Gi f"
 FileCopy Base TextDir$ + "CodyGab.Gif", RemoteWorkDir$ + "C3¯Gab.Gif"  
 End If
 ElseIf Form 7.fkfl. Value = True Then
 FileName = RemoteWorkDir$ + "Cl¯Gab.TGA"
 Open FileName For Output As &num;1
 Print &num;1, ""
 Close   &num; I   
 FileName = RemoteWorkDir$ + "Cl¯Head.TGA"
 Open FileName For Output As   &num;1   
 Print   &num;1, ""   
 Close   &num;1   
 End If
 If Form7.fkfl.Value = True Then
 FileCopy BaseTextDir$ + "fkfvers.l", RemoteWorkDir$ + "fkfvers.1"
 FileCopy BaseTextDir$ + "fkfbasl.wri", RemoteWorkDir$ + llfkfwrkl.wri"
SUPENTER.

  FRM - 11
 FileCopy BaseTextDir$ + "cvrbasel.wri", RemoteWorkDir$ + "cvrworkl.wri"
   ShellReturn%    = Shell("write.exe " + RemoteWorkDir$ + "fkfwrkl.wri", 3)
 SendKeys   "%(NE)" +    "cl¯name" + "TAB", Wait
 SendKeys TrimS(StarName.Text), Wait
 For Counter% = 0 To 7
 SendKeys "%R", Wait
 Next Counter%
 SendKeys   "#{ESCAPE}" +    "%FS", Wait
 SendKeys"%FO", Wait
 SendKeys RemoteWorkDir$ + "cvrworkl.wri" + "-", Wait
 SendKeys"%(NE)" + cl¯name", Wait
   SendKeys" (TAB)",    Wait
 SendKeysTrimS(StarName.Text), Wait
 For Counter% =   0    To I
 SendKeys "%R", Wait
 Next   Counter /e   
 SendKeys   "#{ESC}" +    "%FS", Wait
 SendKeys "%FX", Wait
 ElseIf Form7.fkf3.

  Value = True Then
 FileCopy BaseTextDir$ + "fkfvers.3", RemoteWorkDir$ + "fkfvers.3"
 FileCopy BaseTextDir$ + "fkfbas3.wri", RemoteWorkDir$ +   "fkfwrk3.wri"   
 FileCopy BaseTextDir$ + "cvrbase3.wri", RemoteWorkDir$ +   "cvrwork3.wri"   
 ShellReturn% =   Shell("write.exe    " + RemoteWorkDir$ + "fkfwrk3.wri", 3)
 SendKeys "%(ne)"+ "cl¯name"   + "(TAB)",    Wait
 SendKeys Trim$(StarName.Text), Wait
 For Counter%   =0    To 5
 SendKeys "%R", Wait
 Next Counter%
 SendKeys   "#%N"    + "c2 name" +   "(TAB)",    Wait
 SendKeys   Trim$(GuestlName.Text),    Wait
 For Counter%   =0    To 7
 SendKeys "%R", Wait
 Next Counter%
   SendKeys"#%N" +    "c3¯name" + "{TAB}",

   Wait  
 SendKeys   Trim$(Guest2Name.Text),    Wait
 For Counter% =   0    To 7
 SendKeys "%R", Wait
 Next Counter%
 SendKeys   "¯{ESCAPE}"      + "%FS",    Wait
 SendKeys "%FO", Wait
 Send Keys RemoteWorkDir$ + "cvrwork3.wri" +   "#",    Wait
 SendKeys "%NE", Wait
 Send Keys "cl¯name", Wait
 SendKeys   "(TAB)",    Wait
 Send Keys Trim$(StarName.Text), Wait
 For Counter% =   0    To 2
 SendKeys "%R", Wait
 Next Counter%
 SendKeys   "#%N" +    "c2¯name"   + "(TAB)",    Wait
 SendKeys Trim$(Guest1Name.Text), Wait
 For Counter% =   0    To 1
 SendKeys "%R", Wait
 Next Counter%
 SendKeys   "#%N"    + "c3¯name" +   "(TAB)",

   Wait   
 SendKeys Trim$(Guest2Name.Text), Wait
 For Counter% =   0    To 1   SUPENTER.FRM-    12
 SendKeys "%R%R", Wait
 Next Counter%
 SendKeys   "-",    Wait
 SendKeys   "(ESC)" +    "%FS", Wait
 SendKeys "%FX", Wait
 End If
End Sub
Sub cmdVerifyNameMast¯Click   #   
 Form 6.picNameMast.C Is
 Form6.Show
 If StarLastname.Text o "" Then
 Form6.picNameMast.Print Trim(Save.starfirstname) + "" + Trim(Save.StarL astname)
Else
 Form6.picNameMast.Print   Trim(Save.starfirstname)   
End If
If Age.Text o "" Then
 Form6.picNameMast.Print "age" + Trim(Save.Age)
Else
 Form6.picNameMast.Print ""
End If
Form6.picNameMast.Print Trim(Save.starcity)
Form6.picNameMast.Print Format$(Trim(Save.GiftDate),

   "MMMM YYYY")
Form6.picNameMast.Print Trim(Save.messagel)
Form6.picNameMast.Print Trim(Save.message2)
Form6.picNameMast.Print Trim(Save.message3)  
Form6.picNameMast.Print Trim(Save.message4)
Form6.picNameMast.Print Trim(Save.messageS)
Form6.picNameMast Print Trim(Save.starfirstname)
Form6.picNameMast.Print Trim(Save.GuestlName)
Form6.picNameMast.Print Trim(Save.Guest2Name)   Form6.picNameMast.Print    Trim(Save.SupplierName)
Form6.picNameMast.Print Trim(ClaimCheckNumber.Text  & BoxNumber.Text)
Form6.picNameMast.Print
Form6.picNameMast.Print "Work Order   &num;

  ;    " + Trim(ClaimCheckNumber.Text  & BoxNu mber.Text)    Form6.picNameMast.Print""   
   If ltem(0).Value    = I Then
 SingleVideo$ = CStr(Clnt(Quantity(0).Text) *   Val(OptionOneS))   
 Form6.picNameMast.Print "Video with Single Star" + Chr$(9) + Quantity(0)
 .Text + Chr$(9) + "x" + Chr$(9) + Trim(OptionOne$) + Chr$(9) + "$" + SingleVideo
S
 Else
 SingleVideo$ = "$0.00"
 Form6.picNameMast.Print "Video with Single Star" + Chr$(9)+ "O" + Chr$( 9) + "x" + Chr$(9) + Trim(OptionOne$) + Chr$(9) + SingleVideo$
 End If
 If Item(l).Value = I Then
 FamilyVideo$ =   CStr(Clnt(Quantity(l).Text)    *   Val(OptionTwoS))   
 Form6.picNameMast.Print "Family Version" +   ChrS(9) +    Quantity(l).Text +
Chr$(9) + "x" + Chr$(9)+   Trim(OptionTwoS) +    

   Chr$(9) + "S" + FamilyVideoS
Else
 FamilyVideo$ = "$0.00"
 Form6.picNameMast.Print "Family Version" + Chr$(9) + "O" + Chr$(9)+ "x"   SUPENTER.FRM-    13 + Chr$(9) + Trim(Option,Two$) + Chr$(9) + FamilyVideoS
 End If
 If Item(2).Value = 1 Then
 DuplicateVideo$ = CStr(Clnt(Quantity(2).Text) *   Val(OptionThreeS))   
   Form6.picNameMastPrint    "Duplicate Video" + Chr$(9)+ Quantity(2).Text +
Chr$(9)+ "x" + Chr$(9)+   Trim(OptionThreeS) +    Chr$(9) +   "S"    + DuplicateVideoS
Else
   DuplicateVideoS=    "S0.00"
 Form6.picNameMast.Print "Duplicate Video" + Chr$(9)+   "O"    + Chr$(9)+ "x "+Chr$(9) + Trim(OptionThree$) + Chr$(9) + Duplicate Video$
 End If
 If Item(3).Value = I Then
 AdditionalBooks$ = CStr(Clnt(Quantity(3).Text) * 

   Val(OptionFour$))
 Form6.picNameMast.Print "Additional Books" + Chr$(9) + Quantity(3).Text + Chr$(9) + "x" +   ChrS(9);      Trim(OptionFourS) +    Chr$(9) +   "S"    + AdditionalBooks$
 Else
AdditionalBooks$ = "$0.00"  
 Form6.picNameMast.Print "Additional Books" + Chr$(9) + "0" + Chr$(9)+ "
 x" + Chr$(9)+   Trim(OptionFour$) +    Chr$(9) + AdditionalBooks$
 End If
   TheTotal&commat;    = CCur(SingleVideo$) + CCur(FamilyVideo$) + CCur(DuplicateVideo$)
 + CCur(AdditionalBooks$)
 Form6.picNameMast.Print "Total" + Chr$(9) +   CStr(TheTotal&commat;

  ;)   
 End Sub
 Sub Descriptor¯ Change (Index As Integer)
 changes% = True
 End Sub
 Sub distributor Change¯()
 If Len(RTrim$(Distributor.Text))  >  20 Then
 KeyAscii = 0
 Beep
 msg$ = "You have already reached the maximum number of characters alowde
 d."
 MsgBox msg$
 Distributor. Text =   Left$(Distributor.Text,    20)
 Distributor.SelStart = 20
 End If
 changes% = True
 End Sub
 Sub distributor KeyPress (KeyAscii As Integer)
   lfKeyAscii=    ENTER Then
 KeyAscii = 0
 StoreNumber.SetFocus
 End If
 End Sub
 Sub Dupe¯btn¯Click   #   
 If changes% = True Then
 Responce% = MsgBox(l'Dupe without saving changes?", 292, 

   "Clear Entry
 ')
 If Responce% = IDNO Then
 Exit Sub
 SUPENTERFRM - 14
   Elself Responce /.    = IDYES Then
 'ClearEntry
 changes% = False
 MyTable.AddNew
 End If
 Else
 ClearEntry
 MyTable.AddNew
End If
 changes% = False
 Distributor. SetFocus  
 End Sub
 Sub ExitMenu¯Click   #   
 ExitRoutine
 EndSub
 Sub fkfl Click ()
   Save.story =    "fkfl"
 changes% = True
 End Sub
 Sub   fkss¯Click    ()
 Save.story = "fkf3"
 changes% = True
 End Sub
 Sub Form Load ()
 Form7.Top =   (Screen.Height) /2 -    Form7.Height/ 2
 Form7.Left = Screen.Width / 2 - Form7.Width / 2
 OrderDate.

  Text = Format(Now, "MMMM DD, YYYY")
 GiftDate.Text = Format (Now, "MMMM YYYY")
 Do While Not MyTable.EOF
 UniqueSearchID.AddItem MyTable("UniqueKey")
 MyTable.MoveNext
 Loop
 End Sub
 Sub Form ¯Unload (Cancel As Integer)
 ExitRoutine
 End Sub
 Sub GiftDate¯Change   #   
 If Len(RCTrim$(GiftDate.Text)) >  25 Then
 KeyAscii = 0
 Beep
 msg$ = "You have already reached the maximum number of characters alowde
 d."
 MsgBox msg$
 GiftDate.Text = Left$(GiftDate.Text,

   25)
 GiftDate.SelStart = 25
 End If
 Save.GiftDate = GiftDate.Text
 End Sub   SUPENTER.FRM-    15
Sub GiftDate KeyPress (KeyAscii As Integer)
 If KeyAscii = ENTER Then
 KeyAscii =   0   
 Item (0).SetFocus
 End If
End Sub  
Sub GuestlName¯Change ()
 If   Len(RTrimS(GuestlName.Text))  >     30 Then
 KeyAscii = 0
Beep
 msg$ = "You have already reached,the maximum number of characters alowde d."
 MsgBox msg$
 GuestlName.Text =   Left$(GuestlName.Text,    30)
 GuestlName.SelStart = 30
End If
 Save.GuestlName = GuestlName.Text
 changes% = True
End Sub
Sub GuestlName¯KeyPress (KeyAscii As Integer)
 If KeyAscii = ENTER Then
 KeyAscii = 0
 Guest2Name.SetFocus
 End If
 End Sub
 Sub GuestlName¯LostFocus ()    if GuestlName.Text o "" Then fkf3.Value = True   
   If 

   GuestlName.Text =    "" Then
 fkfl.Value = True
 cbGenericChar.Value = 0
 End If
 End Sub
Sub Guest2Name¯Change ()
 If Len(RTrimS(Guest2Name.Text))  >  30 Then
 KeyAscii = 0
 Beep
 msg$ = "You have already reached the maximum number of characters alowde d."
 MsgBox msg$
 Guest2Name. Text = Left$(Guest2Name.Text, 30)
 Guest2Name.SelStart = 30
End If
   Save.Guest2Name    = Guest2Name.Text
 changes% = True
End Sub
Sub   Guest2NameKeyPress    (KeyAscii As Integer)
 if KeyAscii = ENTER Then
 KeyAscii = 0
 Message.SetFocus
End If
End Sub   SUPENTER.FRM-    16
Sub Guest2Name¯LostFocus ()  
   If Guest2Name.Text #    "" Then fkf3.

  Value = True
 If GuestlName.Text o "" Eqv Guest2Name.Text = "" Then
 cbGenericChar.Value =
 Guest2Name.Text = "Cody"
 Else
 cbGenericChar.Value = 0
 End If
End Sub
Sub Item¯Click (Index As Integer)
 If Item(Index).Value = False Then
 Item(index).Value = False
 If SubTotal(lndex).Caption   =    "" Then Exit Sub
   NumHolder&commat;    = CCur(Total.Caption) -   CCur(SubTotal(lndex).Caption)   
   If NumHolder&commat;

    >     0 Then
 Total.Caption =   Format(CStr(NumHolder&commat;),    "&num;,&num;&num;&num;0.00")
 Else
 Total.Caption =
 End If
   Quantity(Index).Text    =
 SubTotal(lndex).Caption = " "
 End If
 If Item(4).Value   =    True Then
 Save.mailinglist = "Yes"
 Else
 Save.mailinglist = "NO"
End If
 If Index o 4 Then
 Quantity(lndex).SetFocus
 Else
 StarName.SetFocus
 End If
 changes% = True
End Sub
Sub Message Change   0   
 If Len(RTrimS(Message.Text))  >  64 Then
 KeyAscii = 0
 Beep
 msg$ = "You have already reached the maximum number of characters alowde d."
 msgbox msg$
 Message.Text = Left$(Message.Text,

   64)
 Message.SelStart   =64   
End If changes% = True
End Sub
Sub Message KeyPress (KeyAscii As Integer)  
 If KeyAscii = ENTER Then
   HasHiP/o    = HasHit% + I
 If HasHit%  >  5 Then
 SUPENTER.FRM- 17
 Beep
 msg$ = "You may only enter 5 Lines."
 MsgBox msg$
   HasHitP/o    = HasHit% 
 End If
 End If
End Sub
Sub Message¯LostFocus   #   
 If Trim(Message.Text)   ""Then       MsgText$(1) =   
 Msg Text$(2) = ""
 Msg Text$(3) = ""
 Msg Text$(4) = ""
 Msg Text$(5) = ""
 '---- mike added this to decode message to 5 lines
 Temp$ = ""
   CurLine% =    I
 HasHit% = 0
 Message. Text = Trim$(Message.

  Text)'+ Chr$(13) + Chr$(13)
 For i = I To Len(Message.Text)
 NextChar$ =   MidS(Message.Text,    i,   1)   
 If Asc(NextChar$) = 10 Then NextChar$ = " "
 If Asc(NextChar$) = 13 Then
   MsgTextS(CurLine%)=    Trim(TempS)
 Temp$ = ""
 CurLine% = CurLine% + 1
 Else
 Temp$ = Temp$ + NextChar$
 End If    Next   
 '---- center lines if necessary    If CurLine% - I = 1 Then   
 MsgText$(3) = MsgText$(1)
 MsgText$(4) = ""
 MsgText$(2) = ""
 MsgText$(1) = ""
   ElselfCurLine%    - I = 2 Then
 MsgText$(4) = MsgTextS(3)
 MsgText$(3) = MsgTextS(2)
 MsgText$(2) = MsgText$(1)
 MsgText$(1) = ""
 Elself CurLine%- I = 3 Then
 MsgText$(4) = MsgText$(3)
 MsgText$(3) = MsgText$(2)
 MsgText$(2) = MsgText$(1)
 MsgText$(1) = ""  
End If
   Save.messagel=    

   MsgText(l)
 Save.message2 = MsgText(2)
 Save.message3 = MsgText(3)
 Save.message4 = MsgText(4)
 Save.messageS = MsgText(S)
 End If
 End Sub
 Sub NewOrderMenu¯Click   #       SUPENTER.FRM - 18   
 If changes% = True Then
 Responce% = MsgBox("Exit without saving   changes?",

   292,    "Clear Entry
 If Responce% = IDNO Then
 Exit Sub
 Elself Responce% = IDYES Then
 ClearEntry
 changes% = False
 MyTableAddNew
 End If
 Else
 ClearEntry
 MyTable AddNew
 End If
 changes% = False
 Distributor.SetFocus
 End Sub
 Sub NextPage¯Click   #   
 Form2.Show
 End Sub
 Sub   NextPageMenu¯Click    ()
 Form2 Show
 End Sub
 Sub OrderDate¯Change   #   
 If Len(RTrimS(OrderDate.Text))  > 25 Then
 KeyAscii   =0   
 Beep
 msg$ = "You have already reached the maximum number of characters alowde
 d."
 MsgBox msg$
 OrderDate.Text = Left$(OrderDate.Text,

   25)
 OrderDate.SelStart = 25
 End If
 Save.date = OrderDate.Text
 End Sub
 Sub OrderDate KeyPress (KeyAscii As Integer)  
 If KeyAscii = ENTER Then
 KeyAscii = 0
 Item (O).SetFocus
 End If
 End Sub
Sub Phonel¯KeyPress (KeyAscii As Integer)
 If KeyAscii = ENTER Then
 KeyAscii = 0
 fkfl.SetFocus
 End If
End Sub
Sub promo Click ()
 Save.Promo =
End Sub
SUPENTER.

  FRM- - 19
Sub Quantity Change (Index As Integer)
 If Len(RTrim$(Quantity(Index).Text))  >  2 Then
 KeyAscii = 0
 Beep
 msg$ = "You have already reached the maximum number of characters alowde d."
 MsgBox msg$
 Quantity(lndex).Text =   Left$(Quantity(Index).Text,    2)
 Quantity(lndex).SelStart = 2
 End If
End Sub
Sub Quantity¯KeyPress (Index As Integer, KeyAscii As Integer)
 'If KeyAscii = 13 Then Item(lndex + I ).SetFocus
End Sub
Sub Quantity¯LostFocus (Index As Integer)
 If Trim$(Quantity(0).Text) o " " Then
 SubTotal(0).Caption =   Format$(Clnt(Quantity(0).Text)    * Val(OptionOne$), "&num;,&num;&num;&num;0.00")
 End If
 If   Trim$(Quantity(1).Text) #    "" Then
 SubTotal(1).Caption = Format$(Clnt(Quantity(1).Text) * Val(Option Two$), "&num;,&num;&num;&num; 

  ;0.00")
 End If
 If Trim$(Quantity(2).Text) o " " Then
 SubTotal(2).Caption =   FormatS(Clnt(Quantity(2).Text)    * Val(OptionThree$) , "&num;,&num;&num;&num;0.00")
 End If
 If Trim$(Quantity(3).Text)   # "" Then   
 Sub Total(3).Caption = Format$(Clnt(Quantity(3).Text) * Val(OptionFour$), "&num;,&num;&num;,&num;0.00")
 End If
 Total.Caption = " "  
 For Counter% =   0    To 3    If Sub Total(Counter%).Caption # "".

  Then NumHolder&commat; = Ccur(SubTotal(Coun
 teP/o).Caption) + NumHolder&commat;   
 Next Counter%
 Total.Caption =   Format(CStr(NumHolder&commat;), "&num;,&num;&num;&num;0.00")       If Sub Total(Index).Caption o " " Then Item(lndex).Value =   
 If SubTotal(lndex).Caption = " "Then Item(Index).Value = 0
 End Sub
 Sub   SaveMenuCIick    ()
   If changes%    = False Then Exit Sub
 Wait = True
 MyTable("Store")=   StoreNumber.Text   
 MyTable("ClaimCheckNumber") = ClaimCheckNumber.Text
 MyTable("UniqueKey") = ClaimCheckNumber.Text  & BoxNumber.Text
   MyTable("Distributor") =    Distributor.Text
 MyTable("Batch")= Batch.Text
 MyTable("BoxNumber") = BoxNumber.Text
 If Item(O).Value = 1 Then MyTable("OnePersonVideo") = True
 MyTable("OnePerson VideoQuantity") 

   = Quantity(O).Text
SUPENTER.FRM   20   
 If   Item(l).Value=    I Then   MyTable("ThreePersonVideo") =    True
 MyTable("ThreePersonVideoQuantity") = Quantity(1).Text
 If Item(2).Value = 1 Then MyTable("AdditionalVideos") = True    MyTable("AdditionalVideosQuantity") =;

  Quantity(2).Text   
 If ltem(3).Value = 1 Then MyTable("AdditionalBooks") = True
 MyTable("AdditionalBooksQuantity") =   Quantity(3).Text   
 If Item(4).Value = I Then MyTable("MailingList") = True
   MyTable("Total")=    Total.Caption
   MyTable("Star'sFirstName") =    StarName.Text
 MyTable("Star'sLastName")= StarLastname.Text
 MyTable("StarsAge") = Age.Text
 MyTable("Star'sCity Province") = starcity.Text
 MyTable("GuestOne'sName") = GuestlName.Text
 MyTable("GuestTwo'sName") = Guest2Name.Text
   MyTable("GiftGive?sName") =    SupplierName.Text
 MyTable("PhoneNumber") = Phonel.Text
 MyTable("PersonalizedMessage") = Message.Text
 If fkfl. Value = True Then MyTable("ForgetFullKingOne") True
 If   fkf3.Value    = True Then MyTable("ForgetFullKingThree") = True
 If Promo.

  Value = I Then MyTable("NoChargePromo")   =    True
   MyTable("ShippingAddressOne") =    Form2.BillTol.Text
 MyTable("ShippingAddressTwo") = Form2.BillTo2.Text
 MyTable("ShippingAddressThree") = Form2.BillTo3.Text
 MyTable("ShippingProvince") = Form2.Province.Text
 MyTable("ShippingCountry") = Form2.Country.Text
 MyTable("ShippingZip") = Form2.BillToPostalCode.Text
 If Form2.Carrier(O).Value = 1 Then MyTable("Mail") = True
 If Form2.Carrier(l).Value =   1    Then MyTable("TwoDayFedX") = True  
 If Form2.Carrier(2).Value = 1 Then MyTable("OverNightFedX") = True
   MyTable("DateShipped") =    Form2.DateShipped.Text
   MyTable( "OrderDate") =    OrderDate.Text
 MyTable("GiftDate") = GiftDate.Text
 MyTable.Update
 changes% = False
 Dim AreYouSure,   Foundit,    

   Success As Integer
 Dim msg As String
 Dim RecNo As Long
 Dim VBFileNumber As Integer
 Dim FileName As String * 40
 'ReDim   msgtext$(5)   
 On Error Resume Next
 RemoteWorkDir$ = Left$(RemoteOrdersDrive$, 2) + OrdersDirectory$ + Trim(Clai
 mCheckNumber.Text  & BoxNumber.Text) + "\"
   RemoteDirS    = Left$(RemoteOrdersDrive$, 2) + OrdersDirectory$ + Trim(ClaimChe
   ckNumber.Text     & BoxNumber.Text)
 MkDir RemoteDir$
 FileName = RemoteWorkDir$ + "namemast.txt"
 Open FileName For Output As   &num;l   
 If   StarLastname.Text    o " " Then
 Print &num;1, Trim(Save.starfirstname) + " " + Trim(Save.StarLastname)
 Else
 Print   l,    Trim(Save.starfirstname)
SUPENTER.

  FRM - 21
 End If
 If Age.Text o " " Then
 Print &num;1, "age " + Trim(Save.Age)
 Else
 Print &num;1, " "
 End If
 Print &num; I, Trim(Save.starcity)
 Print &num;1,   Format$(Trim(Save.GiflDate),    "MMMM YYYY")
 Print &num;1, Trim(Save.messagel)
 Print &num;1, Trim(Save.message2)
 Print &num;1, Trim(Save.message3)
 Print &num;1, Trim(Save.message4)    Print &num;1, Trim(Save.message5)   
 Print &num;1, I, Trim(Save.starfirstname)
 Print   &num;      1,    Trim(Save.GuestlName)
 Print &num;1, Trim(Save.Guest2Name)
   Print &num;1,    Trim(Save.SupplierName)
 Print &num;1, Trim(ClaimCheckNumber.Text  & BoxNumber.Text)
 Print &num;1, " "  
 Print   &num; 1,    "Work Order &num;

   "+ Trim(ClaimCheckNumber.Text  & BoxNumber.Text)
 Print &num;1, " "
 If Item(0).Value = I Then
 SingleVideoS =   CStr(Clnt(Quantity(0).Text)    * Val(OptionOne$))
 Print &num;1, I, "Video with Single Star" + Chr$(9) + Quantity(0).Text + Chr$(9
 + "x" + Chr$(9) + Trim(OptionOne$) +   ChrS(9) +    "$" + SingleVideoS
Else
   SingeVideoS    = "$0.00"
 Print &num;1, "Video with Single Star" + Chr$(9)+ "0" + Chr$(9) + "x" + Ch r   S(9) +    Trim(OptionOne$) + Chr$(9) + SingleVideo$
 End If
 If Item(l).Value = 1 Then
 Family Video$ = CStr(Clnt(Quantity(1).Text) * Val(Option Two$))
 Print &num;1, "Family Version" + Chr$(9)+ Quantity(l).Text + Chr$(9) + "x" + Chr$(9)+ Trim(OptionTwo$) + Chr$(9) +   "5"    + FamilyVideo$
 Else
 FamilyVideoS = "S0.00"
 Print &num;

  ;1, "Family Version" + Chr$(9) + "0" + Chr$(9)+ "x" + ChrS(9) + T rim(OptionTwo$) + Chr$(9)+
FamilyVideo$
 End If
 If Item(2).Value = I Then
 DuplicateVideoS = CStr(CInt(Quantity(2).Text)   *    Val(Option Three$))
 Print &num;1, "Duplicate Video" + Chr$(9)+ Quantity(2).Text + Chr$(9) + "x" + Chr$(9)+ Trim(OptionThree$) + Chr$(9) + "$" + Duplicate Video$
 Else
 DuplicateVideo$ = "$0.00"
 Print&num;1, "Duplicate Video" + Chr$(9) + "0" + Chr$(9) + "x" + Chr$(9) + Trim(Option Three$) + Chr$(9)+
DuplicateVideoS
 End If
 If Item(3).Value = 1 Then
 AdditionalBooksS = CStr(Clnt(Quantity(3).Text) * Val(OptionFour$))
 Print &num;1, "Additional Books" + Chr$(9) + Quantity(3).Text + Chr$(9) + "x " + Chr$(9); 

  Trim(OptionFour$) + Chr$(9) + "$" + AdditionalBooks$
Else
SUPENTER.FRM - 22
 AdditionalBooks$= "$0.00"
 Print &num;1, "Additional Books" +   ChrS    (9) + "0" + ChrS (9) + "x" + ChrS (9) +
 Trim(OptionFour$) + Chr$(9) + AdditionalBooks$
 End If   TheTotal&commat;      =    CCur(SingleVideo$) + CCur(FamilyVideo$) + CCur(DuplicateVideo$) + CCur(AdditionalBooksS)
 Print &num;

  I, "Total" + Chr$(9)+   CStr(TheTotal&commat;)   
 Close   &num;1   
 if   Form2.Carrier(0).Value    = True Then
   Form2.CarrierHolder.Text    =
 Elself   Form2.Carrier(l).Value    = True Then  
 Form2.CarrierHolder.Text =
 Elself Form2.Carrier(2).Value = True Then
 Form2.CarrierHolder.Text = "0"
 End If
 FileName = RemoteWorkDir$ +   Trim(LeftS(ClaimCheckNumber.Text     & BoxNumber.Tex
   t,8))+".    inf"
 Open FileName For Output As &num;1
 Print &num;1, "[General]"
 If Form7.fkfl. Value = True Then
 Print &num;1, "VideoType =   I "   
 Print &num; I, "UseGenericCharacter = False"
 ElseIf Form 7.fkf3. Value = True Then
 Print &num;1, "VideoType = 3"
 If cbGenericChar.

  Value = 1 Then
 Print   &num;1,    "UseGenericCharacter = True"
 ElselfcbGenericChar.Value =   0    Then
 Print   &num;1,    "UseGenericCharacter = False"
 End If
 End If
 Print &num;1, I, "Digitizing = Not¯Done"
 Print &num;1, "Cutting = Not¯Done"
 Print &num;1, "Processing = Not¯Done"
 Print   &num;1,    "VideoTransfer = Not¯Done"    Print &num;1, 1, "BookTransfer Not¯Done"   
 Print &num;1, "Archiving Not¯Done"
 Close   &num; I   
 If Form 7.fkf3.

  Value = True Then
 FileName = RemoteWorkDir$ + "Cl¯Gab.TGA"
 Open FileName For Output As   &num;1   
 Print &num;1, " "
 Close   &num;1   
 FileName = RemoteWorkDir$ +   "C2¯Gab.TGA"   
 Open FileName For Output As &num;1
 Print &num;1, " "
 Close &num;1
 FileName = RemoteWorkDir$ + "Cl¯Head.TGA"
 Open FileName For Output As &num;1
 Print &num;1, " "
SUPENTER.FRM - 23
 Close &num;1
 FileName = RemoteWorkDir$ + "C2¯Head.TGA"
 Open FileName For Output As &num;1    Print &num;1,""   
 Close   &num;

  I   
 If cbGenericChar.Value =   0    Then
 FileName = RemoteWorkDir$ + "C3¯Gab.TGA"  
 Open FileName For Output As &num;1    Print &num;1,""   
 Close &num;1
 FileName = RemoteWorkDir$ + "C3 Head.TGA"
 Open FileName For Output As &num;1
 Print &num;1,
 Close   &num;1   
 Elself cbGenericChar.Value = 1 Then
 FileCopy BaseTextDir$ + "CodyBook.Gif", RemoteWorkDir$ + "C3-Book.Gi f'
 FileCopy BaseTextDir$ + "CodyHead.Gif",RemoteWorkDir$ + "C3¯Head.Gi f'
 FileCopy BaseTextDir$ + "CodyGab.Gif", RemoteWorkDir$ + 'IC3-Gab.Gif"
 End If
Elself Form 7.fkfl.Value = True Then
 FileName = RemoteWorkDir$ + "CI¯Gab.TGA"
 Open FileName For Output As   &num;1   
 Print &num;1,
 Close   &num;

  ;l   
 FileName = RemoteWorkDir$ +   "Cl Head.TGA"   
 Open FileName For Output As &num;1
 Print &num;1, " "
 Close &num;1
 End If
 If Form7.fkfl.Value = True Then
 FileCopy BaseTextDir$ + "fkfvers.l", RemoteWorkDirS + "fkfvers.1"
 FileCopy BaseTextDir$ + "fkfbasl.wri", RemoteWorkDir$ +   "fkfivrkl.wri"   
 FileCopy BaseTextDir$ + "cvrbasel.wri", RemoteWorkDir$ +   "cvrworkl.wri"   
   ShellRetum%    = Shell("write.exe" + RemoteWorkDir$ + "fkfwrkl.wri", 3)
 SendKeys "%(NE)" + "cl¯name" + "{TAB}", Wait
 SendKeys TrimS(StarName.Text), Wait
 For Counter%   =0    To 7
 SendKeys "%R", Wait
 Next Counter%
 SendKeys   "¯{ESCAPE}" +    "%FS", Wait
 SendKeys "%FO",

   Wait
 SendKeys RemoteWorkDir$ + "cvrworkl.wri" +   "#",    Wait
 SendKeys "%(NE)" + "cl¯name", Wait
 SendKeys   "(TAB)",    Wait
 SendKeys Trim$(StarName.Text), Wait
 For Counter% =   0    To I
 SendKeys "%R", Wait
 Next Counter%
 SendKeys   "#{ESC}" +    "%FS", Wait
 SendKeys "%FX", Wait
 Elself Form 7.fkf3.Value = True Then
 FileCopy BaseTextDir$ +   "fkfvers.3",    RemoteWorkDir$ +   "fkfvers.3"   
 FileCopy BaseTextDir$ + "fkfbas3.wri", RemoteWorkDir$ + "fkfwrk3.wri"
SUPENTER.FRM - 24  
 FileCopy BaseTextDir$+ "cvrbase3.wri", RemoteWorkDir$ + "cvrwork3.wri"
 ShellReturn%= Shell("write.exe" + RemoteWorkDir$ + "fkfwrk3.wri", 3)
 SendKeys "%(ne)" + "cl¯name" +   "(TAB)",    Wait
 Send Keys Trim$(StarName.Text),

   Wait
 For Counter% =   0    To 5
 SendKeys "%R", Wait
 Next Counter%
 SendKeys   "AN"    + "c2¯name" + "{TAB}", Wait
 SendKeys Trim$(Guest1Name.Text), Wait
 For Counter% =   0    To 7
 SendKeys "%RI', Wait
 Next Counter%
 SendKeys   "#%N"    + "c3¯name" + "{TAB}", Wait
 SendKeys   Trim$(Guest2Name.Text),    Wait
 For Counter% =   0    To 7
 SendKeys "%R", Wait
 Next Counter%
 SendKeys   "#{ESCAPE}" +    "%FS", Wait
 SendKeys "%FO", Wait
 SendKeys RemoteWorkDir$ + "cvrwork3.wri" +   "-",    Wait
 SendKeys "%NE", Wait
 SendKeys "cl¯name",

   Wait
 SendKeys   "(TAB)",    Wait
 SendKeys   Trim$(StarName.Text),    Wait
 For Counter% =   0    To 2
   SendKeys "%R",    Wait
 Next Counter%
 SendKeys   "#%N"    + "c2 name" +   "(TAB)",    Wait
 SendKeys TrimS(GuestlName.Text), Wait
 For Counter% =   0    To I
 SendKeys "%R", Wait
 Next Counter%
 SendKeys   "#%N"    + "c3 name" +   "(TAB)",    Wait
 SendKeys   Trim$(Guest2Name.Text),    Wait
 For Counter% =   0    To 1
 SendKeys "%R%R", Wait
 Next Counter%
 SendKeys "-", Wait
 SendKeys   "(ESC)" +    "%FS",

   Wait
   SendKeys "%FX",    Wait
 End If
End Sub
Sub starcity¯Change   #   
 If Len(RTrim$(starcity Text))  > 30 Then
 KeyAscii = 0
 Beep
 msg$ = "You have already reached the maximum number of characters alowde d."
 MsgBox msg$
 starcity.Text = Trim$(starcity.Text)
 starcity.SelStart = 30  
End If
Save.starcity = starcity.Text
End Sub
SUPENTER.FRM - 25
Sub starcity¯KeyPress (KeyAscii As Integer)
 If KeyAscii = ENTER Then
 KeyAscii = 0
 GuestlName.SetFocus
End If
End Sub
Sub   starlastname¯Change #   
   Save.StarLastname =    StarLastname.Text
End Sub
Sub starlastname¯KeyPress (KeyAscii As Integer)
 If KeyAscii = ENTER Then
 KeyAscii = 0
 Age.SetFocus
 End If
End Sub
Sub StarName¯Change ()
 If Len(RTrimS(StarName.Text))  >  30 Then
 KeyAscii = 0
 Beep
 msg$ = "You have already reached the maximum  

   number of characters alowde d."
 MsgBox msg$
 StarName.Text   =    Left$(StarName.Text, 30)
 StarName.Text = Trim$(StarName.Text)
 StarName.SelStart = 30
End If   Save. starflrstname =    StarName.Text
End Sub
Sub StarName¯KeyPress (KeyAscii As Integer)
 If KeyAscii = ENTER Then
 KeyAscii= 0
 StarLastname.SetFocus
End If
End Sub
 Sub StarName¯LostFocus ()
 If StarName.Text o " " Then fkfl.Value = True
 End Sub
Sub   StoreNumberChange    ()
 If Len(RTrimS(StoreNumber.Text))  >  5 Then
 KeyAscii   =    0
 Beep  
 msg$ = "You have already reached the maximum number of characters alowde d."
 MsgBox msg$
 StoreNumber.Text = Left$(StoreNumber.Text,

   5)
 StoreNumber.SelStart = 5
 End If
End Sub
Sub   storenumber    KeyPress (KeyAscii As Integer)
 If KeyAscii = ENTER Then
SUPENTER.FRM   26   
 KeyAscii = 0
 Batch.SetFocus
 End If
End Sub
Sub SupplierName¯Change ()
 If   Len(RTrimS(Suppl ierN ame.Text))  >     30 Then
 KeyAscii = 0
 Beep
 msg$ = "You have already reached the maximum number of characters alowde d."
 MsgBox msg$
 SupplierName.Text =   LeftS(SupplierName.Text,    30)
 SupplierName.SelStart = 30
End If
Save.SupplierName = SupplierName.Text
End Sub
Sub SupplierName¯KeyPress (KeyAscii As Integer)
 if KeyAscii = ENTER Then
 KeyAscii= 0
 Phonel.SetFocus
End If
End Sub
Sub   UniqueSearchiD¯Change    ()
 If   Len(RTrim$(UniqueSearchlD.Text)) >     25 Then
 KeyAscii = 0
 Beep
 msg$ = "You have already 

   reached the maximum number of characters alowde d."
 MsgBox msg$
 UniqueSearchlD.Text =   LeftS(UniqueSearchlD.Text,    25)
 UniqueSearchlD.SelStart = 25
End If
End Sub
Sub UniqueSearchlD¯ LostFocus ()
 MyTable.lndex = "ValidationKey" ' Define current index.



   MyTable.Seek "=", UniqueSearchlD.Text ' Seek record.  



   If MyTable.NoMatch = False Then
 Beep
 Responce% = MsgBox("This Record already exists. Do you wish to edit/upd ate it?", 292, "Record Exists")
 If Responce% = IDNO Then
 StoreN umber.Text
 ClaimCheckNumber.Text
 StoreNumber.SetFocus    MyTable.AddNew   
 EditMode% = AddNewRecord%
 Elself Responce% = IDYES Then
 Load Form2
 ClearEntry
 MyFieldFill
 ScreenFill
 If   fkf3.Value    = True Then
 If Guest2Name.Text = " " Then
 SUPENTER.FRM - 27
 Guest2Name.Text = "Cody"
 'cbGenericChar.Value = I
 End If
 End If
 MessageSplit
 MyTable.Edit
 EditMode% = EditRecord%
 StoreN umber.SetFocus
 changes% = False
 End If
 Else
 MyTableAddNew
 EditMode% =   AddNewRecord%   
 End If
 Save.date = OrderDate.Text    Save.GiftDate = GiftDate.Text   
 End Sub    SUPENTR2.FRM - I   
 Sub BillTol¯Change  

     #   
 If Len(RTrim$(BillTol.Text))  >  30 Then
 KeyAscii   =0   
 Beep
 Msg$ = "You have already reached the maximum number of characters alowde
 d."
 MsgBox Msg$
 BillTol.Text = Left$(BillTol.Text, 30)
   BillTol.SelStart    = 30  
End If
End Sub
Sub BillTol¯KeyPress (KeyAscii As Integer)
 If KeyAscii = ENTER Then
 KeyAscii = 0
 BillTo2.SetFocus
End If
End Sub
Sub BillTo2¯Change ()
 If   Len(RTrim%(BillTo2.Text))  >     30 Then
 KeyAscii = 0
 Beep
 Msg$ = "You have already reached the maximum number of characters alowde d."
 MsgBox Msg$
 BillTo2.Text = Left$(BillTo2.Text,

   30)
 BillTo2.SelStart = 30
End If
End Sub
Sub BillTo2¯KeyPress (KeyAscii As Integer)
   If KeyAscii =    ENTER Then
 KeyAscii = 0
 BillTo3.SetFocus
End If
End Sub   Sub BillTo3¯Change #   
 If Len(RTrim$(BillTo3.Text))  >  30 Then
 KeyAscii = 0
 Beep
 Msg$ = "You have already reached the maximum number of characters alowde d."
 MsgBox Msg$
 BillTo3.Text = Left$(BillTo3.Text,

   30)
 BillTo3.SelStart = 30
End If
End Sub
Sub BillTo3¯KeyPress (KeyAscii As Integer)
 If KeyAscii = ENTER Then
 KeyAscii = 0
 Province.SetFocus   SUPENTR2.FRM -2   
 End If
End Sub
Sub BillToPostalCode KeyPress (KeyAscii As Integer)  
 If KeyAscii = ENTER Then
 KeyAscii = 0
 'Phonel.SetFocus
End If
End Sub
Sub Country¯Change ()
 If   Len(RTrimS(Country.Text))  >     15 Then
 KeyAscii = 0
 Beep
 Msg$ = "You have already reached the maximum number of characters alowde d."
 Msgbox Msg$
 Country.Text = Left$(Country.Text, 15)
 Country.SelStart = 15
End If
End Sub
Sub Country KeyPress (KeyAscii As Integer)
 If KeyAscii = ENTER Then
 KeyAscii = 0
 BillToPostalCode.SetFocus
End If
End Sub
Sub menu¯exit¯Click 0
 If Changes% = True Then
   Responce%    = MsgBox("Changes have been made.

  Do you wish to clear them."   292,    "Clear Entry")
 If Responce% = IDNO Then
 Exit Sub
 Elself Responce% = IDYES Then
 Form2.Hide    Form7.Show   
 End If
Else
 Form2.Hide
 Form7.Show
End If
End Sub
Sub Province Change ()
 If   Len(RTrimS(Province.Text))  >     2 Then
 KeyAscii = 0
 Beep
 Msg$ = "You have already reached the maximum number of characters alowde d."
 MsgBox Msg$
 Province.Text = Left$(Province.Text,

   2)
 Province.SelStart = 2
End If
End Sub  
SUPENTR2.FRM " 3
Sub Province¯KeyPress (KeyAscii As Integer)
 If KeyAscii = ENTER Then
 KeyAscii = 0
 Country.SetFocus
End If
End Sub
Sub Province¯LostFocus ()
 If Province.Text = "BC" Or Province.Text = "AB" Or Province.Text = "MB" Or P rovince.Text = "NB" Or Province.Text =   "NF"    Then
   Country.Text =    "Canada"
 BillToPostalCode.SetFocus
 End If
If Province.Text = "NT" Or Province.Text = "NS" Or Province.Text = "ON" Or P rovince.Text = "PE" Or Province.Text = "PQ" Then
   Country.Text =    "Canada"
 BillToPostalCode.SetFocus
 End If
 If Province.Text =   "SK"    Or Province.Text =   "YT'    Then
 Country.Text = "Canada"
 BillToPostalCode.SetFocus
 End If
End Sub
Sub   showvendor¯      Click 

   ()   
 Form2.Hide
 Form7.Show
End Sub   TEXT.FRM - I   
Option Explicit   GLOBAL.BAS - I   
Option Explicit
Global Success As Integer
Global ordersdir$
Global BaseTextDir$
Global OptiononeS
Global OptionTwoS
Global OptionThreeS
Global   OptionFourS   
Global UpdateFlag%
Global MYDB As Database
Global MyTable As Table
Global MyField(40) As Field
Dim CurrRec As Long  
 Global DBName As String
 Global RemoteOrdersDrive$
 Global OrdersDirectory$
 Dim Ska:

  :plt As Integer
 Dim CancelFlag As Integer
 Dim ABM As String
 Dim MyRec As Long
 Dim TotRec As Long
 Dim AlreadySet As Integer
 Dim SearchFlag As Integer
 Dim CallString As String
 Dim OkSize As Integer
 Global Changes%
 Global Const   IDNO =    7
 Global Const IDYES   =6   
 Global Const AddNewRecord%
 Global Const EditRecord% = 2
 Global EditMode%
 Global   PropPtr%   
 Global VendorWatch%
 Global FileName As String
 Global ErrorHolder%
 Global Const ENTER = 13
 Global msgtext(7) As String * 30
 Declare Function fwrite Lib "kernal" Alias "-lwrite" (ByVal   file,      Ipbuff As    Any
 ,ByVal wbytes)
 Declare Function fread Lib "kernal" Alias "-Iread" (ByVal hfile, IpbuffAs Any, 

   ByVal wbytes)   --    main structure for variables that need saving
Type SaveType
 StarfirstName As String *30
 StarlastName As String &num;30
 Age As String As String * 15
 starcity As String * 30
 Date As String * 20
 Spacerl As String * 30
 Spacer2 As String * 30
 GuestlName As String * 30
 GLOBAL.BAS - 2
 Guest2Name As String * 30
 messagel As String * 30
 message2 As String * 30
 message3 As String * 30
 message4 As String * 30
 message5 As String * 30  
 distributor As String * 2
 storenumber As String * 5
 ClaimCheckNumber As String * 20
 suppliername As String * 20
 BoxNumber As String * 25
 billtol As String * 20
 billto2 As String * 20
 billto3 As String * 20
 billtopostalcode As String * 10
 country As String * 20
 province As String * 4
 phonel As String   *    12
 mailinglist As String * 3
 promo As String * I
 story As String 

   * 5
 giftdate As String * 25
 End Type
Global save As SaveType
Type AnArray
 StarName As String * 30
 Age As String * 2
 Where As String * 30
 Date As String * 20
 Spacerl As String   *    30
 message As String * 64
 Spacer2 As String   *    30
 StarNamel As String * 30
 GuestlName As String * 30
 Guest2Name As String * 30
 linel As String * 35
 line2 As String   *    35
 line3 As String * 35
 line4 As String * 35
 lineS As String * 35
 Line6 As String * 35
 Line7 As String * 35
 Line8 As String * 35
 Line9 As String * 35
 LinelO As String   *    35
 StarName2 As String * 30
 End Type   name    can be composed of multiple files    Type nametype   
 name As String * 20 'working name
 textname As String   *    20 'printed name in story
 filel 

   As String * 12 'sound filel
 file2 As String * 12 'sound file2     GLOBAL.BAS -3   
 file3 As String * 12 'sound file3
End Type
Global Const SCROLL¯BARS =  & 80000000 'Scroll-bars gray area.



  Global Const DESKTOP =  & 80000001 'Desktop.



  Global Const ACTIVE¯TITLE¯BAR =  & 80000002 'Active window caption.



  Global Const INACTIVE¯TITLE¯BAR =  & 80000003 'Inactive window caption.



  Global Const MENU¯BAR =  & 80000004 ' Menu background.



  Global Const WINDOW¯BACKGROUND =  & 80000005 'Window background.



  Global Const WINDOW¯FRAME =  & 80000006 ' Window frame.



  Global Const MENU¯TEXT =  & 80000007 'Text in menus.



  Global Const WINDOW¯TEXT =  & 80000008 'Text in windows.



  Global Const TITLE¯BAR¯TEXT =  & 80000009 'Text in caption, size box, scr oll-bar arrow box..



  Global Const ACTIVE¯BORDER  & 8000000A ' Active window border.



  Global Const INACTIVE BORDER=  & 8000000B ' Inactive window border.



  Global Const APPLICATION¯WORKSPACE =  & 8000000C 'Background color of multiple d ocument interface (MDI) applications.



  Global Const HIGHLIGHT =  & 8000000D ' Items selected item in a contr ol.



  Global Const HIGHLIGHT¯TEXT =  & 8000000E 'Text of item selected in a con trol.



  Global Const BUTTON FACE =    & 800000OF    ' Face shading on command button s.



  Global Const BUTTON¯SHADOW =  & 80000010 ' Edge shading on command button s.



  Global Const   GRAY¯TEXT    =  & 80000011 'Grayed (disabled) text. This color is set to   0    if the current display driver does not support a solid gray co lor.



  Global Const BUTTON¯TEXT=  & 80000012 'Text on push buttons.



  Global Const HELP¯CONTEXT =    & I    'Display topic identified by number in Data
Global Const HELPQUIT =  & 2 'Terminate help
Global Const   HELP¯INDEX    =  & 3 ' Display index
Global Const HELP¯ HELPONHELP =  & 4 'Display help on using help
Global Const HELP¯SETINDEX   =       & S    'Set an altemate Index for help file with more than one   incfex   
Global Const HELP¯ KEY =    & IOI    'Display topic for keyword in Data   Global Const HELP¯MULTIKEY =  & 2O ' Lockup keyword in alternate table and disp    lay topic
Declare Function mciSendString & Lib "MMSYSTEM.DLL" (ByVal IpstrCommandS, ByVal
 I pstrReturnString$,

   ByVal   uRetumLength%,    ByVal hwndcallback%)
Declare Function mciSendStringAny & Lib "MMSYSTEM.DLL" Alias "mciSendString" (ByV al lpstrCommand$, ByVal   IpstrReturnString    As Any, ByVal   uReturnLength%,    ByVal hw ndcallback%)
Declare Function mciGetErrorString% Lib "MMSYSTEM.DLL" (ByVal wError &  ByVal Ips trbuffer$, ByVal   uLength%)   
Global orderdir As String
Global orderdrive As String  
 Global currentorder As String
 reference star names by number
 Global Const star =
 Global Const   guestl    = 2
 Global Const guest3 = 3
 GLOBAL.BAS - 4
 Global actor(5) As nametype
 Global currentname As Integer
 Global namedirS
 Declare Function GetPrivateProfileString Lib "Kernel" (ByVal IpApplicationName A
 s String, ByVal IpKeyName As String,

   ByVal   Ipdefault    As String, ByVal IpRetumed
 String As String, ByVal nSize As Integer, ByVal IpFileName As String) As Integer
 Function addname (who%, namefileS)
 If actor(who%).filel = Space(12) Then
   actor(who%).filel    = namefileS
 actor(who%).name = Left$(actor(who%) filel, Len(Trim(actor(who%).filel))
 -4)
 Elself   actor(who%).file2    =   Space(12)    Then
 actor(who%).file2 = namefile$
 actor(who%).name Trim(actor(who%).name) + " " +   LeftS(actor(who%).file   
 2, Len(Trim(actor(who%).file2)) - 4)
 Elselfactor(who%).file3 =   Space(12)    Then
 actor(who%).file3 = namefile$
 actor(who%).name Trim(actor(who%).name) + " " +   Left$(actor(who%).file   
 3,

   Len(Trim(actor(who%).file3)) - 4)
 Else
 MsgBox ("maximum of 3 name parts")
 End If
 End Function
 Function PlayWav$ (wavename$)
 Dim ES, e2$
 ES = SendMMStringS("Open" + wavename S)
 If   E$ # " "    Then
 Play Wav$ = E$
 Exit Function
 End If
 E$ = SendMMString$("Play + wavename$ + "wait")
   e2S    =   SendMMStringS("Close "    + wavenameS)
   PIayWavS    = ES  & e2$
End Function
Function SendMMString$ (cmdstring$)
 Dim res%  
 Dim errstring As String * 128
 res% = mciSendStringAny & cmdstring$, 0 &  0, 0)
 Ifres% =   0    Then
 SendMMStringS = " "
 Exit Function
 End If
 res% = mciGetErrorString(res%, errstring.

  Len(errstring) -   I )   
 If res% o   0    Then
 SendMMString$ = errstring
 Else
 SendMMStringS = "Unkown Error"
 End If
GLOBAL.BAS - 5
End Function  
APPENDIX II
OptClearState();
OptToFrame(1.0);   II ---    paste c2 in doorway   LoadCel("c2-hd 100.cel");   
OptClearState();
CelShrink(22);
OptMove(11,-127);
OptContinue();
OptClearPos();   OptToAII();      1/---    replace door where needed
LoadCel("\\fkf\\base3\\a-drovr.cel");
OptClearState();
OptClearPos();
OptToSegment(0,4); //- c3 falling into chair
LoadCel("C3¯hd100.cle");
OptClearState();
SwapClip();
SwapTrade();
Clear();
CelShrink(36);
OptToFrame(1.0);
CelGet(210,160,149,145);
SwapTrade();   CelMove(-128,-282);   
OptClearState();
LoadPath("\\fkf\\base3\\a¯c3fall.ply"); 

  ;
OptToSegment(12,35);
LoadCel("cl¯hd 100.cel");   1/was    121   t/SetColor(15);   
SetKeyColor(15);
OptClearState(); //OptToSegment(54,107);
OptToSegment(188,241);   1/---    for be
SaveFlic("bc¯work.flc");   1/--    now do c¯work2 - >  kids in front of window
LoadFlic("\\fkf\base3\\c¯base2.flc");   /1-    paste text
LoadCel("c¯txwrk2.cel");
OptClearState();
OptToSegment(0, 19);
LoadCel("c2¯gab.cel");
SetColor (121);
SetKeyColor(121);   II    set element to cel
OptSetElement(1); // set up cel to 60% of size
OptClearState();
CelShrink(60);
OptMove(-   54,-51);   
OptContinue()
OptClearPos();   OptToAII();   
SaveFlic("a work.flc");
PocoChain To("\\fkf\\poco\\bc¯work.poc");   //======= d¯work.poc &num;

  ;include  < optics.h >  void CelShrink(int); void OptMove(int,int); void Mirror(void); main()
LoadFlic("\\fkf\\base13\\d-base1.flc");   SetMultiFrame(0);    // was 121
SetColor(255);
SetKeyColor(255);
LoadCel("cl¯std.cel");   1/    set element to cel
OptSetElement(1);   ii    standing in doorway
OptClearState();
CeiShrink(   19);    //Opt.Move(-101,-64);
OptMove(-88,47);
OptContinue();
OptClearPos();
OptToSegment(56,65);   II    growing in doorway
OptContinue();
OptClearPos();
CelShrink(188);
OptMove(26,-281);
OptToSegment(66,78);
LoadCel("\\fkf\\base13\\plandoor.cel");
OptClearState();
OptToSegment(56,78); //---jump and slide down dino
LoadCel("cl¯hd100.cel");
OptClearState();
SwapClip();
SwapTrade();
Clear();
CelShrink(20);   OptToFrame( 1.0);

  ;   
CelGet(243, 193,83,81);
SwapTrade();
OptClearState();   CelMoveTo(99,89);   
OptClearState();
LoadPath("\\fkf\\base 13\\d¯slide.ply");
OptToSegment(79,93);
SaveFlic("d workl.flc");
LoadFlic("\\fkf\\base13\\d¯base2.flc");
CelMoveTo(466,243);
OptClearState();
LoadPath("\\fkf\\base13\\d¯dance.ply");
OptToAII();
SaveFlic("d work2.flc");
PocoChain To("\\fkf\\poco\\f¯work.poc");   //======= f¯work.poc &num;include  < optics.h >  void CelShrink(int); void OptMove(int,int); void Mirror(void); void Mirrscale(int);

   main()   //    set element to cel
OptSetElement(1);
LoadFlic("\\fkf\base3\\f3¯base2.fic");
Swapclip();
SwapTrade();
Clear(); //Fill(10,10); // set up cels
LoadCel("cl¯hd100.cel");
OptClearState();
CelShrink(25);
OptMove(138,9);
OptToFrame( 1.0);   LoadCel("c2 hd100.cel");   
OptClearState();
CelShrink(25);
OptMove(1,20);   OptToFrame( 1.0);   
LoadCel("c3¯hd100.cel");
OptClearState();
CelShrink(25);
OptMove(- 120,34);   OptToFrame( 1.0);   
CelGet(112,191,361,128);
SwapTrade();
CelMoveTo(115,24 1);
OptClearState();
LoadPath("\\fkf\\base3\\f3¯hds.ply");   
OptToAII();
SaveFlic("f¯work2.flc");   
PocoChainTo("\\fkf\\poco\\g¯york.poc");   //===g¯work.poc=== &num;include  < optics. h >  void CelShrink(int); void OptMove(int,int); void Mirror(void);

   main() //was 121 //SetColor(255);   //SetKeyColor(255);   
LoadFlic("\\fkf\\base3\\g3¯base.flc"); //=== character three
LoadCel("c3¯hd100.cel");
OptClearState();
SwapClip();
SwapTrade();
Clear();
CelShrink(22);
OptToFrame(1.0);
CelGet(239,189,91,90);
SwapTrade();
CelMoveTo(270,192);
OptClearState();
LoadPath("\\fkf\\base3\\g3¯c3hed.ply");   OptToAII();      /1=    character two
LoadCel("c2¯hd100.cel");
OptClearState();
SwapClip();
SwapTrade();
Clear();
CelShrink(22);
OptToFrame(1.0);
CelGet(239,189,91,90);
SwapTrade();   CetMoveTo(23 1,238);   
OptClearState();
LoadPath("\\fkf\\base3\\g3¯c2hed.ply");
OptToAII();   /1= character one   
LoadCel("cl¯hd100.cel");
OptClearState();
SwapClip();
SwapTrade();
Clear();
CelShrink(30);
OptToFrame(1.0);
CelGet(222,173,124,121);
SwapTrade();

  ;
CelMoveTo(382,270);
OptClearState();
LoadPath("\\fkf\\base3\\g3¯clhed.ply");
OptToSegment(0,21);
LoadCel("\\fkf\\base13\\g¯txtl.cel");
OptClearState();
OptToSegment(17,21);
LoadCel("\\fkf\\base13\\g¯txt2.cel");
OptClearState();
OptToSegment(40,44);
LoadCel("\\fkf\\base13\\g¯fgrnd.cel");
OptClearState();
OptToSegment(0,29);
SaveFlic("g¯work.flc");
PocoChainTo("\\fkf\\poco\\h¯work.poc");   //===H¯work.poc   -----    updated may 4/94 for spring 94 fkf revision &num;include  < optics. h >  void CelShrink(int); void OptMove(int,int); void Mirror(void); void Mirrscale(int);

   main() // set element to cel
OptSetElement(l);
LoadFlic("\\fkf\\base3\\h3¯base.flc"); //======== character one (star) ===
LoadCcl("cl¯hd100.cel");
OptClearState();
Mirrscalc(30);
SwapClip();
SwapTrade();
Clear();
OptToFrame(1.0);
CelGet(222,173,124,12 1)
SwapTrade();
SetFrame(74);   -----    frame 75 (ani) 74 (poco)
CelMoveTo(597,62);   CelTumTo(60*5.625);   
CelPaste();
NextFrame(); //-- frame 76 (ani) 75 (poco)
CelMoveTo(507,40);
CelTurnTo(39*5.625);
Celpaste();
NextFrame();   N ---    frame 77 (ani) 76 (poco)
CelMoveTo(359,84);
CelTurnTo(0);
CelPaste();
NextFrame(); // --- frame 78 (ani) 77 (poco)
CelPaste();
NextFrame();   --      --   frame 79 (ani) 78 (poco)
CelMoveTo(369,65);
CelPaste();
NextFrame(); // --- frame 80-90 (ani) 79-89 (poco)
CelMoveTo(376,63);
OptClearState();

  ;
OptToSegment(79,89);   N ---    frame 91 (ani) 90 (poco)
SetFrame(90);
CelMoveTo(440,88);
CelTurnTo(23*5.625);
CelPaste();
NextFrame(); //--- frame 92-129   (ani) 91-128    (poco)   CelMoveTo(462, 122);   
OptClearState();
OptToSegment(91,128);   II === character    two
LoadCel("c2¯hd100.cel");
OptClearState();
CelShrink(30);
SwapClip();
SwapTrade();
Clear();
OptToFrame(1.0);
CelGet(222,173,124,12 1)
SwapTrade();   --      -    frame 35-52 (ani) 34-51 (poco)
CelMoveTo(- 1, 158);
OptClearState();
LoadPath("\\fkf\\base3\\h¯c2.ply");
OptToSegment(34,51);   II-- paste    character two and three at once for rest of frames   II --- frame    54-129 (ani) 53-128 (poco)
CelMoveTo(89,226);

  ; //--- store for later pasting in swap screen
SwapTrade();   Clear();   
CelPaste(); //OptClearState(); //OptToSegment(53,128); //CelPaste();   //NextFrame();      II == character    three
LoadCel("c3¯hd100.cel");
OptClearState();
Mirrscale(30);
OptMove(226,7);  
OptToFrame(1.0);
CelGet(449,180,124,12 1);
SwapTrade();   -----    frame 37 (ani) 36 (poco)
SetFrame(36);
CelMoveTo(625,154);
CelPaste();
NextFrame();   /1---    frame 38 (ani) 37 (poco)
CelMoveTo(595,138);
CelPaste();
NextFrame();   --    frame 39 (ani) 38 (poco)
CelMoveTo(557,113);   Cel Paste();   
NextFrame();

   frame 40 (ani) 39 (poco)
CelMoveTo(543,135);
CelPaste();
NextFrame(); // --- frame 41 (ani) 40 (poco)
CelMoveTo(498,168);
CelPaste0;
NextFrame0;   --      -   frame 42 (ani) 41 (poco)
CelMoveTo(469,14 1);
CelPaste();
NextFrameO;
   frame    43 (ani) 42 (poco)
CelMoveTo(408,138);
CelPaste();
NextFrame();   N ---    frame 44 (ani) 43 (poco)
CelMoveTo(354, 165);
CelPaste();
NextFrame();   
N --- frame 45 (ani) 44 (poco)   
CelMoveTo(349, 155);
CelPaste();
NextFrame();   --      -   frame 46 (ani) 45 (poco)
CelMoveTo(382,160);
CelPasteO;
NextFrame();   --      -   frame 47 (ani) 46 (poco)
CelMoveTo(488,191);
CelTurnTo(34*5.635);
CelPaste();
NextFrame();

  ;    -- - - frame 48 (ani) 47 (poco)   
CelMoveTo(599,283);
CelTurnTo(55*5.635);
CelPaste();
NextFrame(); // -- frame 49 (ani) 48 (poco)
CelMoveTo(641,357);
CelTumTo(60*5.635);
CelPaste();
NextFrame();   N ---    frame 50 (ani) 49 (ppco)   CelMoveTo(567,2 17);
CelTumTo(20*5.635);   
CelPaste();
NextFrame();   --      -   frame 51 (ani) 50 (poco)
CelMoveTo(537,227);
CelTurnTo(8*5.635);
CelPaste();
NextFrame();
N --- frame 52 (ani) 51 (poco)   CelMoveTo(5 11,240)   
CelTumTo(0);
CelPaste();    ---- paste    character two and three for remaining frames 53-129 (ani) 52-128 (poco)
SwapTrade();
CelClip();   SwapTrade#;   
OptClearState0;   OptToSegment(52, 128);   
SaveFlic("H work.flc"); 

  ;
PocoChain To("\\fkf\\poco\\i¯work.poc");   // ===== i¯work.poc &num;include  < optics.h >  void CelShrink(int); void OptMove(int,int); void Mirror(void); void Mirrscale(int); main() //was 121 //SetColor(255);   SetKeyColor(15);   
LoadFlic("\\fkf\\basel\\il¯basel.flc");
LoadCel("c   l¯hd 100.cel");   
OptClearState();
SwapClip();
SwapTrade();
Clear();
M irrscale(36);
OptToFrame(1.0);
CelGet(210,160,149,145);
SwapTrade();
CelMoveTo(672,110);
OptClearState();
LoadPath("\\fkf\\base\\i¯cl.ply");
OptToSegment(94,101);
SaveFlic("   i¯work l .flc");   
LoadFlic("\\fkf\\basel\\il¯base2.flc");
CelMoveTo(485,117);
OptClearState();   OptToAII();   
SaveFlic("i work2.flc");
PocoChainTo("\\fkf\\poco\\L¯work.poc");

  ;     --    L¯work.poc   --      -   updated may 4/94 for spring 94 fkf revision &num;include  < optics. h >  void CelShrink(int); void OptMove(int,int); void Mirror(void); main()
LoadFlic("\\fkf\\basel\\ll¯base.flc"); // --- add name text
LoadCel("1¯txwork.cel");
OptClearState();
OptToSegment(0,21);
LoadCel("cl¯hd100.cel");   //    set element to cel
OptSetElement(l);
OptClearState();
CelShrink(28);
SwapClipO;
SwapTrade();
Clear();   OptToFrame( 1.0);   
CelGet(225,176,118,115)
SwapTrade();
SetFrame(6);   /1--    frame 7 (ani) 6 (poco)
CelMoveTo(- 12,136);
CelPaste();
NextFrame(); // --- frame 8 (ani) 7 (poco)   CelMoveTo(3,1 18);   
CelPaste();   NextFmme();    // --- frame 9 (ani) 8 (poco)
CelMoveTo(35,102);
CelPaste();

  ;
NextFrame();   1/      -   frame 10 (ani) 9 (poco)
CelMoveTo(57,118);
CelPaste();
NextFrame();   - frame    11 (ani) 10 (poco)
CelMoveTo(112,142);
CelPaste();
NextFrame(); // - frame 12 (ani) 11 (poco)
CelMoveTo(138,129);
CelPaste();
NextFrame();   /1---    frame 13 (ani) 12 (poco)
CelMoveTo(167,105);
CelPaste();
NextFrame();   /1--frame    14 (ani) 13 (poco)
CelMoveTo(178,123);
CelPaste();
NextFrame();   frame    frame 15 (ani) 14 (poco)
CelMoveTo(133,217);
CelTurnTo(45*5.625);
CelPaste();
NextFrame(); // --- frame 16 (ani) 15 (poco)
CelMoveTo(271,335);
CelTurn To(-112*5.625);
CelPaste();
NextFrame(); // --- frame 17 (ani) 16 (poco)
CelMoveTo(391,191);
CelTurn To(162*5.625);   CelPaste#;   
NextFrame();

  ; // --- frame 18 (ani) 17 (poco)
CelMoveTo(142,63),
CelTurnTo(-41   *5.625);   
CelPaste();
NextFrame(); // --- frame 19 (ani) 18 (poco)
CelMoveTo(274, 195);   CeITumTo(l 88*5.635);   
CelPaste();
NextFrame(); // --- frame 20 (ani) 19 (poco)
CelMoveTo(336,93);   CelTurnTo( 129*5.635);   
CelPaste();
NextFrame(); // --- frame 21 (ani) 20 (poco)   CelMoveTo( 176,29);   
CelTurnTo(-19*5.635);
CelPaste();
NextFrame();   // --- frame    22 (ani) 21 (poco)
CelMoveTo(154,102);
CelTurnTo(-13*5.635);
CelPaste();
NextFrame();   // --- frame    23 (ani) 22 (poco)
CelMoveTo(109,263);  
CelTurnTo(-37*5.635);
CelPaste();
NextFrame();

   1/ --- frame 24 (ani) 23 (poco)
CelMoveTo(69,308);
CelTurnTo(-79*5.635);
CelPaste();
NextFrame();
LoadCel("cl¯hd100.cel");   OptC learState();   
CelShrink(33);
SwapClip();
SwapTrade();
Clear();
OptToFrame(1.0);
CelGet(214,166,140,135);
SwapTrade();   /1---    frame 25 (ani) 24 (poco)
CelMoveTo(166,156); //CelTurnTo(*5.635);
CelPaste();
NextFrame(); // --- frame 26 (ani) 25 (poco)
CelMoveTo(184,181); //CelTurnTo(*5.635);
CelPaste();
NextFrame(); // --- frame 27 (ani) 26 (poco)
CelMoveTo(193,180); //CelTurnTo(*5.635);
OptClearState();   OptToSegment(26,59); * * * * * * need to save I work here   
SaveFlic("l¯work.flc");   -----    insert frames at end for map fade effect
SetFrame(0);
DeleteFrames(59);
InsertFrames(35);
LoadCel("\\fkf\\base13\\mapfade.cel");
OptClearState();
OptToAll();

  ;
SaveFlic(" I¯to¯m.flc");
PocoChain To("\\fkf\\poco\\m¯work.poc");   // === m¯work.poc &num;include  < optics.h >  void CelShrink(int); void OptMove(int,int); void Mirror(void); main()
SetColor(121);
SetKeyColor(121);
LoadFlic("\\fkf\\base13\\m¯base.flc");   add    --- add name text
LoadCel("m¯txwork.cel);
OptClearState();
OptToSegment(0,29);
LoadCel("c3¯gab.cel"); // set element to cel
OptSetElement( 1);
OptClearState();   CelShrink(39);   
OptMove(-185,97);
OptContinue();
OptClearPos(); //OptToSegment(6,85);
OptToSegment(0,85); // === split the flic in two pieces to sync with sound better   1/ ---    save whole flic temporarily
SaveFlic("m¯work.flc");   --    nuke beginning and save as second part
SetFrame(0);
DeleteFrames(30);
SaveFlic("m work2.flc");

  ; // --- reload and nuke end and save as first part
LoadFlic("m¯work1.flc");
SetFrame(29);
DeleteFrames(91);
SaveFlic("m¯work1.flc");
PocoChainTo("\\fkf\\poco\\p¯work.poc"); // === p¯work.poc &num;include    < optics.h >     void CelShrink(int); void OptMove(int,int); void Mirror(void); main()
SetColor(121);
SetKeyColor(121);
LoadFlic("\\fkf\\base 13\\nop¯base.flc");   --      -   add name text
LoadCel("p¯txwork.cel");
OptClearState();
OptToSegment(304,331);
SaveFlic("nop¯work.flc");
PoceChainTo("\\fkf\\poco\\q¯work.poc");   // ==== q¯ work.poc &num;include  < optics.h >  void CelShrink(int); void OptMove(int,int); void Mirror(void);

   main()
LoadFlic("\\fkf\\base3\\q¯base.flc");   SetColor(121);   
SetKeyColor(121); // set element to cel
OptSetElement(1);
SwapClip();
SwapTrade();
Clear(); // cl
LoadCel("cl¯hd100.cel");
OptClearState();
CelShrink(32);
OptMove(-174,-79);
OptToFrame(   1.0);    //c3
LoadCel("c3¯hd100.cel");
OptClearState();
CelShrink(30);
M irror();
OptMove(249,-89);   OptToFrame( 1.0);    //c2
LoadCel("c2¯hd   1 00.cel");   
OptClearState();   CelShrink(32);   
Mirror();
OptMove(170,-52);   OptToFrame( 1.0);   
CelClip();
SwapTrade();
OptClearState();
OptToSegment(0,29);   OptToSegment(60, 119);   
SaveFlic("q¯work.flc");
SavePic("q¯check.gif
PocoChain To("\\fkf\\poco\\s¯work.poc"); }   // ==== s¯work.poc &num;include  < optics.h >  void CelShrink(int);

   void OptMove(int,int); void Mirror(void); main() //was 121
SetColor(255);
SetKeyColor(255);
LoadFlic("\\fkf\\base1\\sl¯base.flc");
LoadCel("cl¯hd100.cel");
OptClearState();
SwapClip();
SwapTrade();
Clear();   CelShrink( 19);   
OptToFrame(1.0);
CelGet(245,195,79,77);
SwapTrade();
CelMove(28,-99);
OptClearState();
LoadPath("\\fkf\\base1\\sl¯ride.ply");
OptToAll(); // ****** save flic to s¯run.flc for overlay on s¯bkd
SaveFlic("s¯run.flc");
LoadFlic("\\fkf\\base13\\s¯bkd.flc");   LoadCel("srun.flc");   
OptClearState();
OptToAll(); // --- last part of sequence
SaveFlic("s¯work¯c.flc");
LoadCel("\\fkf\\base13\\s¯over¯b.cel");
OptClearState();
OptToAII(); // --- mid part of sequence
SaveFI   ic("sworkb.flc");    // overlay book with s page
LoadCel("\\fkf\\base13\\s¯book.cel");
OptClearState();
OptToSegment(0, 18); 

  ;   II --- first    part of sequence - with book
SaveFlic("s¯work¯a.flc");
PocoChain To("\\fkf\\poco\\t¯work.poc");   // ==== t¯work.poc &num;include  < optics.h >  void CelShrink(int); void OptMove(int,int); void Mirror(void); main()
LoadFlic("\\fkf\\base3\\t¯base.flc");
LoadCel("cl¯hd100.cel");
SetColor(121);
SetKeyColor(121);   1/    set element to cel
OptSetElement(1); // --- set up heads in swap screen
SwapClip();
SwapTrade();   Clear();
Ncl   
OptClearState();
CelShrink(36);
OptMove(-   172,- 108);   
OptToFrame(1.0);   //c2   
LoadCel("c2¯hd 100.cel");
OptClearState();
CelShrink(28);
OptMove(249,- 154);
Mirror();   OptToFrame( 1.0);    // c3
LoadCel("c3¯hd   1 00.cel");   
OptClearState();
CelShrink(28);
OptMove(81,-156);

  ;
OptToFrame(1.0);
CelClip();
SwapTrade();
OptClearState();   OptToAII();   
SaveFlic("t¯work.flc");
PocoChain To("\\fkf\\poco\\u¯work2.poc");   // ====u¯work2.poc ==== &num;include  < optics.h >  void CelShrink(int); void OptMove(int,int); void Mirror(void); main() {
LoadFlic("\\fkf\\base13\\u¯base2.flc");
LoadCel("c   1ab.cel");      set    element to cel
OptSetElement(1);
OptClearState();
CelShrink(88);
OptMove(37,-34);
OptContinue();
OptClearPos();
LoadPath("\\fkf\\base13\\u¯work2.ply");   OptToAII();   
SaveFlic("u¯work2a.flc");   add    --- add second line of text and save again
LoadCel("\\fkf\\base13\\u¯work2b.cel");
OptClearState();
OptToAll();
SaveFlic("u¯work2b.flc");
PocoChain To("\\fkf\\poco\\v¯work2.poc"); // ==== vwork2.poc &num;

  ;include  < optics.h >  void CelShrink(int); void OptMove(int,int); void Mirror(void); main()
LoadFlic("\\fkf\\base13\\v¯base2.flc");
LoadCel("s¯run.flc"); // set element to cel
OptSetElement( 1);   --    set up rhino at correct position and cel frame 5
OptClearState();
CelTurn(-49*5.625);   OptMove(-2 13,106);   
CelShrink(47);
CelNextFrame();
CelNextFrame();
CelNextFrame();
CelNextFrame();
OptContinue();
OptClearPos();
LoadPath("\\fkf\\base13\\v¯work2.ply");   OptToAII();   
SavcFlic("v¯work2.flc");
PocoChain To("\\fkf\\poco\\v¯work3.poc");   // ==== v¯work3.poc &num;include  < optics.h >  void CelShrink(int); void OptMove(int,int); void Mirror(void);

   main()
LoadFlic("\\fkf\\base13\\v¯base3.flc");
LoadCle("v¯txwork.cel");
CelPaste();
LoadCel("c   I Sab.cel");   
SetColor(121);
SetKeyColor(121);   //    set element to cel
OptSetElement( 1);
OptClearState();   II --- paste    head
CelShrink(71);
OptMove(-84,-38);
OptContinue();
OptClearPos();   OptToAII();      II ---    paste finger
LoadCel("\\fkf\\base13\\v3¯ovl.cel");
OptClearState();
OptToAll();   --      -   add some frames to the end   SetFrame(14);   
InsertFrames(8); // --- store first frame to swap screen   SetFrame(0);   
SwapClip();
DeleteFrames(1);
SaveFlic("v¯work3b.flc"); // --- expand first frame into flic
SetFrame(0);
DeleteFrames(21);
SwapTrade();
InsertFrames(8);

  ;
SaveFlic("v¯work3a.flc");
PocoChain To("\\fkf\\poco\\x¯work.poc");   // ==== x¯work.poc &num;include  < optics.h >  void CelShrink(int); void OptMove(int,int); void Mirror(void); main()
LoadFlic("\\fkf\\base3\\x¯base.flc");
LoadCel("c2¯hd100.cel");
SetKeyColor(15);   //    set element to cel
OptSetElement(1);   II c2 head   
OptClearState();
CelShrink(25);   OptMove(- 1 92,-37);   
SwapClip();
SwapTradeO;
Clear();   OptToFrame( 1.0);   
CelClip();
SwapTrade();
OptClearState();
LoadPath("\\fkf\\base3\\x¯c2.ply");
OptToAIl(); // --- c3 dancing
LoadCel("c3¯dance.cel");
OptClearState();
CelShrink(60);
OptMove(- 117,5);
OptContinue();
OptClearPos();
LoadPath("\\fkf\\base3\\x¯c3.ply")   OptToAl l();    // --- cl talking
LoadCel("c   1¯talk.cel");   
OptClearState();

  ;
CelShrink(61);
OptMove(-228,37);
OptContinue();
OptClearPos();
SetFrame(0);
OptToFrame(1.0);   
NextFraaie(0);
OptToFrame( 1.0);   
NextFrame();
OptToFrame(1.0);
NextFrame();
OptToFrame(1.0);
NextFrame();
OptToFrame(l.0);
NextFrame();   OptToFrame(l.0)   
NextFrame();
OptToFrame(1.0);
NextFrame();
CelNextFrame();
OptToFrame(1.0);
NextFrame();
OptToFrame(1.0);
NextFrame();   OptToFrame( 1.0);   
NextFrame();   OptToFrame( 1.0);   
NextFrame();
OptToFrame(1.0);
NextFrame();
OptToFrame(1.0);
NextFrarne();
OptToFrame(1.0);
NextFrame0;
OptToFrame(1.0);   II ---    same as b but without book
SaveFlic("x¯work¯b.flc");   --      --   overlay book - book has same &num;

   of frames
LoadCel("\\fkf\\base13\\x¯book.cel");
OptClearState();   OptToAII();    // --- with book
SaveFlic("x¯work¯a.flc");
LoadFlic("x¯work¯b.flc");
LoadCel("\\fkf\\base3\\x¯over¯b.cel");
OptClearState();   OptToAl I();   
SaveFlic("x¯work¯c.flc");
LoadCel("\\fkf\\base13\\x¯over¯c.cel");
OptClearState();   OptToAII();
SaveFlic("x¯work¯d.flc");   
PocoChain To("\\fkf\\poco\\z¯work.poc");     z    === z work.poc &num;include  < optics.h >  void CelShrink(int); void OptMove(int,int); void Mirror(void);

   main()
LoadFlic("\\fkf\\base3\\z3¯basel.flc");
LoadCel("hds¯59.cel");
SetColor(121); //SetKeyColor(121);
SetKeyColor(13);   //    set element to cel
OptSetElement(1); //---doc2 & 3 up to frame 27
OptClearState();
SwapClip();
SwapTrade();
Clear();
CelNextFrame();   II---    c2
CelShrink(43);
OptMove(30,40);
OptToFrame(1.0);
CelNextFrame(); // --- c3
Mirror();   OptMove(197,40);   
OptToFrame(1.0);
CelClip();
SwapTrade();
OptClearState();
OptToSegment(0, 18);

  H render c2  & c3 heads in zeppelin   II ---    cover up c2 head with   c I    body
LoadCel("\\fkf\\base3\\z¯cl¯bod.cel");
OptClearState();
OptToSegment(10,13);   N ---    put   c I    in zeppelin position and make cel for running in
LoadCel("c   I¯hd 1 00.cel");   
OptClearState();   CelShrink(25);   
OptMove(-21,115);
SwapTrade();
OptToFrame(1.0);
CelGet(212,298,103, 101);
OptClearState();
CelMoveTo(270,153); 

   // === this will change when rick updates flic
CelPaste();
SwapTrade(); // --- c   l    walking in and jumping into zeppelin
CelMoveTo(-6,224);
OptClearState();
LoadPath("\\fkf\\base3\\z¯cljmp.ply");
OptToSegment(2, 17);   II ---    render heads flying up in zeppelin
SwapTrade();
CelGet(122,102,273,110);// --- get cel of all 3 heads
SwapTrade();
OptClearState();
OptToSegment(18,33);
LoadPath("\\fkf\\base3\\z¯hds.ply");
OptToSegment(33,50);
SaveFlic("z¯work.flc);
PocoChainTo("\\fkf\\poco\\end¯work.poc");   // === end¯work.poc === (1) &num;include  < optics.h >  void CelShrink(int); void OptMove(int,int); void Mirror(void);

   main()
LoadFlic("\\fkf\\base1\\end1base.flc");
LoadCel("cl¯gab.cel"); // set element to cel
OptSetElement(1); // cl - bandleader
OptClearState();
CelShrink(32);   -----    frame 6   (ani) S    (poco)
OptMove(-   14,-    8);
SetFrame(5);
CelSetFrame(6);   OptToFrame( 1.0);   
OptContinue();
OptClearPos0;   II ---    frame 7 (ani) 6 (poco)
NextFrame()
OptMove(-9,18);
OptToFrame(1.0);
OptClearPos();   -----    frame 8 (ani) 7 (poco)
NextFrame();   OptMove(42,23);   
OptToFrame(1.0);
OptClearPos(); // --- frame 9 (ani) 8 (poco)
NextFrame();
OptMove(-65,52);
CelSetFrame(O);
OptToFrame(1.0);
OptClearPos();   --      -   frame 10 (ani) 9 (poco)
NextFrame();
OptMove(- 19,64);
OptToFrame(1.0);
OptClearPos();

   frame I (ani) 0 (poco)
NextFrame();
Mirror();
OptMove(213,-8);
OptToFrame(1.0);
OptClearPos(); // --- frame 2 (ani) I (poco)
NextFrame();
Mirror();
OptMove(235,14);
CelSetFrame(6);
OptToFrame(1.0);
OptClearPos();   -----    frame 3 (ani) 2 (poco)
NextFrame();
Mirror();   OptMove(27 1,16);   
OptToFrame(1.0);
OptClearPos();   II --- frame    4 (ani) 3 (poco)
NextFrame();
Mirror();
OptMove(299,40);
OptToFrame(1.0);
OptClearPos();   -----    frame 5 (ani) 4 (poco)
NextFrame();
Mirror();
OptMove(251,74);
CelSetFrame(0);
OptToFrame( 1.0);
OptClearPos();
SaveFlic("end¯work.flc");
PoccoChain To("\\fkf\\poco\\tv¯work.poc");     --      =    tv¯work.poc - &num;include  < optics.h >  void CelShrink(int); void OptMove(int,int); void Mirror(void);

   main()
LoadFlic("\\fkf\\base13\\tv¯base.flc");
LoadCle("cl¯hd100.cel");
OptClearState(); // set element to cel   OptSetElemcnt( I);   
SetKeyColor(98);   11 ---    yellow in this flic - shd be gm eventually   CelShrink(42);   
Mirror();
SwapClip();
SwapTradeo;   Clear();
OptToFrame( 1.0);   
CelGet(198,149,173,169);
SwapTrade(); //CelMoveTo(825,94);
CclMoveTo(696,108);
OptClearState();
LoadPath("\\fkf\\base13\\tvn.ply");
OptToSegment(59,80);
OptClearState()
OptMove(-287,25);
 SwapTrade();
Clear();
OptToFrame(1.0);
CelClip();
SwapTrade();
OptClearState();
 OptToSegment(81,161);
 LoadCel("\\fkf\\base11\\tv¯ovl.cel");
 OptClearState();
 OptToSegment(122,134);
   --    add some frames at the end to stretch it out
 SaveFlic("tv¯work.flc");
 SetKeyColor(15);

  ;   -----    back to green on reg
 palette
 PocoChain To("\\fkf\\poco\\thankyou.poc"); // === thankyou.poc &num;include  < optics.h >  void CelShrink(int); void OptMove(int,int); void Mirror(void); main()
LoadFlic("\\fkf\\base 13\\ty¯.flc"); //set element to cel
OptSetElement( I);   -----    text section
FILE *filein; char title[80]; int count; filein = fopen("namemast.txt","r"); for (count = 0; count  <  10;

   count++) fgets(title, 80,   file);    fclose(filein); // --- do title
SetJustify(2);   11 -justify    center   
LoadFont("\\tkf\\base 1 3\"scrb20.fht");   
SetColor(12);   -----    purple
WordWrap(11,271,617,164,title);
NextFrame();
WordWrap(11,271,617,164,title);
NextFrame();
WordWrap(11,271,617,164,title);
NextFrame();
WordWrap(11,271,617,164,title);
NextFrame();
WordWrap(11,271,617,164,title);
NextFrame();
WordWrap(11,271,617,164,title);
NextFrame();
WordWrap(11,271,617,164,title);
NextFrame();
WordWrap(11,271,617,164,title);
NextFrame();
WordWrap(11,271,617,164,title);
NextFrame();
WordWrap(11,271,617,164,title);
NextFrame();
WordWrap(11,271,617,164,title);
NextFrame();
WordWrap(11,271,617,164,title);
NextFrame();
WordWrap(11,271,617,164,title);
NextFrame();
WordWrap(11,271,617,164,title);

  ;
SaveFlic( "thankyou.flc");
PocoChainTo("\\fkf\\poco\\Salute2.poc");   // ==== salute2.poc
 &num;include  < optics. h >  void CelShrink(int); void   OptMove(int,int);    void Mirror(void); main()
LoadFlic("\\fkf\\base13\\sal¯base.flc"); // set element to cel
OptSetElement(1);   -----    text section
FILE *filein; char title I [80]; char title2[80]; char title3 [80]; char title4[80]; char title5[80]; int count; filein = fopen("namemast.txt", "r"); for (count   =0;    count  <  5; count++)
 fgets(titlel, 80,   file);    fgets(title2, 80, filein); fgets(title3, 80,   file);    fgets(title4, 80, filein); fgets(title5, 80, filein); fclose(filein); //--- do title
SetJustify(2); // --- justify center
LoadFont("\\fkf\\base13\\serb14.fnt");
SetColor(12);

   //   --    black
SwapClip();
SwapTrade();
Clear();
WordWrap(0,50,640,60,title 1);
WordWrap(O, 125,640,60,title2);
WordWrap(0,200,640,60,title3);
WordWrap(0,275,640,60,title4);
WordWrap(0,350,640,60,title5);
CelClip();
SwapTrade();
OptClearState();
OptToAll();
SavcFI ic("salute2.flc");
SavePic("salute2.gif);
PocoChainTo("\\fkf\\poco\\kidsname.poc"); // === kidsname.poc
 &num;include  < optics.h >  void CelShrink(int); void OptMove(int,iiit); void Mirror(void); main()
LoadFlic("\\fkf\\base13\\kn¯base.flc");   //    set element to cel
 OptSetElement(1);   -----    text section
FILE *filein; char title 1 [80]; char tide2[80]; char tide3[80]; char title4[80]; int count; filein =   fopen("namemast.txt","r");    for (count = 0; count  <  1; count++)
   fgets(titlel,    80, filein); 

   fgets(title2, 80, filein); fgets(title3, 80,   file);    fgets(titlc4, 80,   file);    fclose(filein);   //-    do title   SetJustify(2);      II-    justify center
LoadFont("\\fkf\\base13\\serb08.fnt");
SctColor(2); // --- black
WordWrap(0,210,450,42,title 1);
WordWrap(0,245,450,42,title2);
WordWrap(0,280,450,42,title3);   WordWrnp(0,3 1 5,450,42,title4);
SaveFlic("kidsname.flc");   
SavePic("kidsname.gif ');
PocoChainTo("\\fkf\\poco\\star.poc");   // === star.poc &num;include  < optics.h >  void CelShrink(int); void OptMove(int,int); void Mirror(void);

   main() {
LoadFlic("\\fkf\\base13\\sm¯video.flc");
LoadCel("cl¯hd100.cel"); // set element to cel   OptSetElcment( 1);   
OptClearState();
CelShrink(72);
OptMove(39,2);
OptContinue();
OptClearPos();
OptToAll();
SaveFilic("star.flc"); exit(-425); // == functions common to all programs void Mirror(void)
 Optpos Opty;
 OptPos *OptyPtr;
 OptyPtr =  & pty;
 OptGetPos(OptyPtr);
 OptyPtr- > xp = - 100;
 OptSetPos(OptyPtr); void Mirrscale(int percent)   --      -   mirror and scale
 static OptPos Opty;
 OptPos *OptyPtr;
 Ooptyptr =  & pty;
 OptGetPos(OptyPtr);
 OptyPtr- > xp = - 100;
 OptyPtr- > yp = 100;
 OptyPtr- > bp=(OptyPtr- > bp* (long)percent) / 100L;
 OptSetPos(OptyPtr);

   void OptMove(int x, int y)
 optpos Opty;
 OptPos *OptyPtr;
 OptyPtr =  & pty;
 OptGetPos(OptyPtr);
   OptyPtr- > move.x    =
 OptyPtr- > move.y =
 OptSetPos(OptyPtr); void CelShrink(int percent)
 static OptPos Opty;
 OptPos   Optyptr;   
 OptyPtr =  & pty;
 OptGetPos(OptyPtr);
 OptyPtr- > xp = 100;
 OptyPtr- > yp = 100;
 OptyPtr- > bp =   (OptyPtr- > bp*      (long)percent) /    100L;
 OptSetPos(OptyPtr);     --    coloring book compositing programs =   ==    == mak   1    hd.poc   1/    coloring book head clipping program &num;include  < optics.h >  void CelShrink(int); void OptMove(int,int); void Mirror(void);

   main() int   color map[256*3];   
CelGet(10,10,10,10);
OptSetElement( 1); //SetKeyMode(0); //--- turn key mode off   ****** jun2S/93--    convert color gifs to bw on green key bkd ***** // **** nov5/93 -- convert to standard book palette first   //    note:

   this needs to have "gif active as the picture format
LoadPic("bookpal.gif");
GetScreenColorMap(GetPicScreen(),color¯map)
LoadPic("c I   book.gif');    //FitScreenToColorMap(GetPicScreen(),color¯m ap,0);
SwapClip();
SwapTrade();
LoadPic("bookcols.gif');
GetScreenColorMap(GetPicScreen(),color¯map)
SwapTrade();   
FitScreenToColorMap(GetPicScreen(),color    p,O); //LoadPic("bookcols.gif"); /ALoadCel("cl   book.gif');    //CelPaste();
SavePic("cl¯book.gif");
LoadFlic("bookhead.flc");
SwapClip();
SetKeyColor(255);   load    load up main bic pics   LoadCelC'cLbook.gif');   
CelPaste();
SetKeyMode(l);

   // turn key mode back on
SetKeyColor(255);   .11    bright green
CelGet(77,32,414,402);   
SaveCel("cl hdl00.cel");
NewFlic();
Reset();    exit(-425); //PocoChainTo("clrbk   I poc");    // ======== clrbkl.poc
N ---- render I person coloring book // ---- june 7/93 &num;include  < optics.h >  void CelShrink(int); void   OptMove(int,int);    void Mirror(void);

   void Mimcale(int);   mainO      II --- load    base flic for size and 'a' page
LoadFlic("bookflic.flc"); //=== cl ===
LoadCel("cl¯hd100.cel");
OptSetElement(1); // a page //SetFrame(0);
LoadPic("a¯pm¯bas.tif");
OptClearStateO;
CeiShrink(104);
OptMove(707,232);
OptToFrame(1.0);
SavePic("a¯pm¯wk.tif"); // e page
LoadPic("e¯pm¯bas.tif"); //SetFrame(1);
OptClearState();
CelShrink(120);
OptMove(80,183);
OptToFrame(1.0);
SavePic("e¯pm¯wk.tif"); // g page
LoadPic("g¯pm¯bas.tif");
SetFrame(2);
OptClearState();
CelShrink(121);  
OptMove(784,459);   OptToFrame( 1.0);    (coloring book printing progs continued)
SavePic("g¯pm¯wk.tif"); // v page
LoadPic("v¯pm-bas.tif);
SetFrame(3);
OptClearState();
CelShrink(220);
OptMove(255,439);
OptToFrame(1.0);
SavePic("v¯pm¯wk.tif);   Nipage   
LoadPic("i¯pm¯bas.tif");

  ; //SetFrame(4);
OptClearState();
CelShrink(129);
OptMove(128,158);
OptToFrame(1.0);
SavePic("i¯pm¯wk.tif"); // frame   I- >     end page
LoadPic("st¯p¯bas.tif"); //SetFrame(5);
OptClearState0;
CelShrink(72);
OptMove(720,561);
OptToFrame(1.0);
SavePic("st¯pm¯wk.tif"); // ---- following stuff is one person specific pics // --- c page
LoadPic("cl¯p¯bas.tif"); // --- cl
LoadCel("cl¯hd100.cel");
OptClearState();   CelShrink(134);
OptMove(4 10,524);   
OptToFrame(1.0);
SavePic("cl¯p¯wk.tif");   //---qpage   
LoadPic("q1¯p¯bas.tif"); // --- cl
LoadCel("cl¯hd100.cel");
OptClearState(); //CelShrink(80);
OptMove(90,314);
OptToFrame(1.0);
 SavePic("q1¯pm¯wk.tif");
 // --- s page
   LoadPic("s   1 bas.tif');   // -cI   
 LoadCel("cl¯hd100.cel");
OptClearState();
CelShrink(77);
OptMove(669, 14); 

  ;
OptToFrame(1.0);
SavePic("s1¯pm¯wk.tif");   x    --- x page -   diff position    than 3 person version
LoadPic("x1¯p¯bas.tif); // --- cl
LoadCel("c1¯hd100.cel");
OptClearState();
CelShrink(80);
OptMove(305,452);
OptToFrame(1.0);
SavePic("x1¯pm¯wk.tif");   //--zpage   
LoadPic("z1¯p¯bas.tif"); // --- cl
LoadCel("c1-hd100.cel");
OptClearState();
CelShrink(92);
OptMove(361,372);
OptToFrame(1.0);
SavePic("z1¯pm¯wk.tif"); // --- L page
LoadPic("111¯p¯bas.tif"); // --- cl
LoadCel("c1¯hd100.cel");
OptClearState();
CelShrink(105);
OptMove(144,142);
OptToFrame(1.0);
SavePic("11¯pm¯wk.tif"); // --- m page
LoadPic("m¯pm¯bas.tif"); // --- cl
LoadCel("cl¯hd100.cel");
OptClearState();   CelShrink(46);   
OptMove(455,731);
OptToFrame(1.0);
SavePic("m¯pm¯wk. tif"); //NewFlic();
Reset(); exit(-425); 

Patent Citations
Cited PatentFiling datePublication dateApplicantTitle
EP0390701A2 *30 Mar 19903 Oct 1990Sony CorporationMotion information generating apparatus
GB2250405A * Title not available
Non-Patent Citations
Reference
1 *MORISHIMA E.A.: "a facial motion synthesis for intelligent man-machine interface", SYSTEMS & COMPUTERS IN JAPAN, vol. 22, no. 5, NEW YORK US, pages 50 - 59, XP000240754
Referenced by
Citing PatentFiling datePublication dateApplicantTitle
US7593015 *14 Nov 200322 Sep 2009Kyocera Wireless Corp.System and method for sequencing media objects
US84375142 Oct 20077 May 2013Microsoft CorporationCartoon face generation
US883137928 Aug 20089 Sep 2014Microsoft CorporationCartoon personalization
Classifications
International ClassificationG06T13/40, G06T13/80
Cooperative ClassificationG06T13/40, G06T13/80
European ClassificationG06T13/80, G06T13/40
Legal Events
DateCodeEventDescription
1 Feb 1996AKDesignated states
Kind code of ref document: A1
Designated state(s): AM AT AU BB BG BR BY CA CH CN CZ DE DK EE ES FI GB GE HU IS JP KE KG KP KR KZ LK LR LT LU LV MD MG MN MW MX NO NZ PL PT RO RU SD SE SG SI SK TJ TM TT UA UG US UZ VN
1 Feb 1996ALDesignated countries for regional patents
Kind code of ref document: A1
Designated state(s): KE MW SD SZ UG AT BE CH DE DK ES FR GB GR IE IT LU MC NL PT SE BF BJ CF CG CI CM GA GN ML MR NE SN TD TG
4 Apr 1996DFPERequest for preliminary examination filed prior to expiration of 19th month from priority date (pct application filed before 20040101)
8 May 1996121Ep: the epo has been informed by wipo that ep was designated in this application
7 May 1997REGReference to national code
Ref country code: DE
Ref legal event code: 8642
7 Jan 1998122Ep: pct application non-entry in european phase