/*

NOTE: AS OF MilkDrop v1.04, the functionality of the 'burn' variable 
  has changed.  See below.

NOTES/TIPS
    -sprites range from 00-99
    -'img=' line is mandatory.  File types currently supported (as of v1.04):
        JPG
        PNG
        BMP
        TGA
        DDS
        PPM
        DIB
    -valid filenames are:
        relative:  img=billy.jpg    (loads winamp\plugins\milkdrop2\billy.jpg)
                   img=..\billy.jpg (loads winamp\plugins\billy.jpg)
                   img=images\billy.jpg  (loads winamp\plugins\milkdrop2\images\billy.jpg)
        absolute:  img=c:\blah\billy.jpg
          NOT ok:  img=c:billy.jpg   -must specify path
          NOT ok:  img=\billy.jpg    -must specify drive                  
    -textures can be as large as 2048x2048 and do not have to be square.
    -texture dims in memory will be next power of 2 higher for w, h.
       ex: 500x60 texture will be stored in memory as a 512x64 texture.
    -big textures can take up a lot of video memory and seriously
        drop the frame rate; recommend sprites be no larger than 512x512.
        256x256 is even more preferable.  
    -if there isn't enough video memory for the texture, it will downsample
        the texture (to as low as 16x16 pixels) trying to fit it into video
        memory.
    -IMPORTANT: to terminate a sprite from within its own code, set the 
        'done' variable to a nonzero value (such as 1).  For example, 
        "done=above(frame,500);" would make the sprite auto-self-terminate 
        after 500 frames.  To make this framerate-independent, based it on
        'time' or 'frame/fps' (they are equivalent).
    -there is currently a maximum of 16 sprites that can be on the screen 
        at one time.
    -the sprite manager supports instancing, so if you load two sprites 
        that access the same image on disk, only one texture will exist 
        in video memory.
    -the sprite manager frees textures immediately when all the sprites
        using that texture (all instances) expire or finish.
    -all of the mathematical functions available for milkdrop's per-frame
        and per-pixel equations are available here for doing funky things
        with the sprites; see milkdrop_preset_authoring.html for a complete
        list of all the functions available.
    -you can define your own variables in the init_ code just by setting
        them to some value (like in the per-frame or per-pixel code of a 
        milkdrop preset).  You can then access this value later in the 
        per-frame (regular) sprite code.  If you change its value, the
        change will be remembered from frame to frame.  Also, if you 
        change the value of a built-in (read/write) variable, this change
        will also be remembered from frame to frame.


    READ-ONLY VARIABLES
    -------------------
    time 
        the amount of time that has elapsed since the sprite 
        was launched (in seconds).
    frame
        the # of frames that have elapsed since the sprite
        was launched.
    fps 
        the current fps (frames-per-second) the MilkDrop is running at.
    progress
        the progress (0=start .. 1=end) through the current MilkDrop preset.
    bass, mid, treb
        the relative amount of each audio band being heard this frame.  
        1 is normal; a number less than one (say, 0.5 .. 1) means 
        the band is quiet; and a number greater than one (say, 1..2)
        means the band is loud.
    bass_att, mid_att, treb_att 
        the same, but attenuated to be relative to the average band levels 
        over a longer period of time (i.e. more heavily attenuated/damped).
    
    READ/WRITE VARIABLES
    --------------------
    x,y 
        the x and y position of the sprite's center on the screen.
        x is 0 at the left, 1 at the right; y is 0 at the top, 1 at the bottom.
    r,g,b 
        the red, green, and blue color brightness of the sprite.  0..1.
    a 
        the opacity (alpha) of the sprite.  0=transparent, 1=opaque.
        note that the effect of this variable depends on the blendmode
        (see below), and that sometimes, due to the blendmode, the value
        of 'a' has no effect.
    sx, sy
        the size (stretching) of the sprite, in the X and Y directions.
        if these are both 1, then the image will be scaled up just large
        enough so that no part of it goes off the screen.  If these are
        both 0.5, the image will be half that size; 2, and it's doubled.
        If sx and sy are not equal, the image will be stretched 
        appropriately.
    rot
        the angle of rotation, in radians, of the sprite.  The unit circle
        goes from 0 to PI*2 (6.28) radians.  At zero radians there is no
        rotation; PI/2 is like a 90-degree counter-clockwise rotation;
        PI, 180 degrees; PI*3/2, 270 degrees; and PI*2 radians (the same 
        as zero radians): 0 degrees.
    blendmode
        determines the manner in which the sprite image is blended onto
        the screen.
        0=blend: the image is multiplied by (r,g,b) and then blended,
                 where 'a' decides the amount to blend.
        1=decal: the image is multiplied by (r*a,g*a,b*a) and then pasted
                 onto the background, with no transparency.  'a' values
                 below 1 will modulate the color of the sprite, making 
                 it darker.
        2=additive: the image is multipled by (r*a,g*a,b*a) and then added
                 onto the background, making it brighter.  Again, 'a' values
                 below 1 will make the sprite darker.
        3=srccolor: the amount to blend each pixel with the background
                 is equal to the inverse of the pixel's color.  White texels
                 in the sprite will be fully drawn, while black texels will 
                 be transparent; in-between texels will be blended partially
                 based on their brightness.  Requires hardware support.
                 The alpha value ('a') has no effect when this blendmode
                 is set; the alpha value is taken from the R,G,B color in 
                 the image at evert point.
        4=colorkey: 
                 pixels that match the color specified in the colorkey are 
                 drawn transparently, and all other pixels are drawn opaquely, 
                 much like a television bluescreen.  When using this blendmode, 
                 a line like the following is required to be present in the 
                 sprite:
                    colorkey=0x000000
                 where the value is some 24-bit hexadecimal color.  The first
                 two digits are 00 through FF hexadecimal (0-255 decimal)
                 and are the red value; the third and fourth digits are the
                 green value; and the last two digits are the blue value.
                 So, 0x000000 makes black the see-through color; 0xFFFFFF 
                 makes white pixels transparent; 0x0000FF makes blue pixels 
                 transparent; and so on.

                 When the blendmode is not 4, the colorkey setting will have 
                 no effect.

                 When blendmode is 4, the alpha value ('a') still works, too;
                 it simply modulates the overall opacity of the sprite.

                 NOTE that this effect does not work on all video cards, and
                 also tends to hiccup when running in 16-bit color.  Try it
                 in 32-bit color for best chances for it to work.

                 NOTE that prior to MilkDrop v1.04, this feature worked
                 slightly differently; there was a range of color key values
                 (and you specified 'colorkey_lo' and 'colorkey_hi') 
                 instead of just one single colorkey value ('colorkey').
                 My apologies for any confusion this change might cause.
    flipx
        if nonzero, the sprite will be flipped horizontally.
    flipy
        if nonzero, the sprite will be flipped vertically.
    repeatx
        the number of times to repeat the texture over the surface of the 
        sprite, in the x direction.  A value of 1 is the default; a value of
        2 will cause the texture to tile twice in the x direction; and so on.
        
        **NOTE that if the width or height of the source image is not a 
        power of two (16,32,64,128,256,512,1024,2048) then repeating the
        image could cause strange bands to appear (on some poorly-written
        display drivers or older video cards).  If using repeating, pre-
        stretch the source image to be a power of 2 to alleviate this 
        problem.**
    repeaty
        like repeatx, but in the y-direction.
    done
        set this to some nonzero value to make the sprite self-terminate.
        frees up resources associated with the sprite.
    burn
        if set to a nonzero value, then the sprite will burn into MilkDrop's 
        background and become part of the animation.  If set to zero, there 
        will be no burn-in.  You can set this to 1 for a long time to make 
        cool trails of the sprite, or you can set it to 1 just on the last frame
        (at the same time that you set 'done' to 1), to make the sprite burn into 
        the background and die off, much like song titles and custom messages do.
        ( NOTE: prior to v1.04, 'burn' only worked on the last frame, when done
          was set to 1.  With v1.04 and later, 'burn' works on any frame. )



    /end of critical info


*/

[img00]
// testing color keying... this is probably best with TGA's (exact colors), not JPG's.
img=textures\kaite.jpg
colorkey=0xFFFFFF
init_1=blendmode = 4; 
code_1=rot = time*0.27;                           
code_2=new_scale = 0.75 + 0.1*sin(time*0.6);      
code_3=sx = new_scale;                            
code_4=sy = new_scale;                            
code_5=r=0.5+sin(time*0.9);
code_6=a=0.5+sin(time*1.3);

[img01]
// this tests the 'done' function, and burns into the screen @ the end
img=textures\heart.jpg
init_1=blendmode = 3;
init_2=x = 1;
init_3=orig_y = 0.5;
code_1=time_to_reset = below(x,-0.5);
code_2=x = x*(1-time_to_reset) + time_to_reset*(1.5 + 0.01*rand(100) + 1);
code_3=orig_y = orig_y*(1-time_to_reset) + time_to_reset*(0.3 + 0.4*0.01*rand(100));
code_4=sx = sx*(1-time_to_reset) + time_to_reset*(0.25 + 0.4*0.01*rand(100));
code_5=sy = sx;
code_6=x = x - 0.008 + 0.0033*sin(time*1.371);
code_7=y = orig_y + 0.12*sin(time*1.9);
code_8=done=above(frame,80);
code_9=burn=done;     // burn into screen @ end

[img02]
// this burns into the screen *every frame*
img=textures\cells.jpg
init_1=blendmode = 3;
init_2=x = 1;
init_3=orig_y = 0.5;
code_1=time_to_reset = below(x,-0.5);
code_2=x = x*(1-time_to_reset) + time_to_reset*(1.5 + 0.01*rand(100) + 1);
code_3=orig_y = orig_y*(1-time_to_reset) + time_to_reset*(0.3 + 0.4*0.01*rand(100));
code_4=sx = sx*(1-time_to_reset) + time_to_reset*(0.25 + 0.4*0.01*rand(100));
code_5=sy = sx;
code_6=x = x - 0.008 + 0.0033*sin(time*1.371);
code_7=y = orig_y + 0.12*sin(time*1.9);
code_8=done=above(frame,80);
code_9=burn=1;      // burn into screen every frame

[img03]
// for testing: show a large (nova2) or large+skinny (nova3) texture
img=textures\smalltiled_lizard_scales.jpg
init_1=blendmode = 2;
code_1=rot = time*0.27;                           
code_2=new_scale = 1.0 + 0.1*sin(time*0.6);      
code_3=sx = new_scale;                            
code_4=sy = new_scale;                            
code_5=new_alpha = min(0.9,max(0.2,  2*max(bass-.05,bass_att)-1.1  ));
code_6=a = a*0.83 + 0.17*new_alpha;

[img04]
desc="cool: an 'osapien' drifts across the screen every so often."
img=textures\smalltiled_electric_nebula.jpg
init_1=blendmode = 3;
init_2=x = -100;
init_3=orig_y = 0.5;
code_1=time_to_reset = below(x,-0.5);
code_2=x = x*(1-time_to_reset) + time_to_reset*(1.5 + 0.01*rand(100) + 3);
code_3=orig_y = orig_y*(1-time_to_reset) + time_to_reset*(0.3 + 0.4*0.01*rand(100));
code_4=sx = sx*(1-time_to_reset) + time_to_reset*(0.25 + 0.4*0.01*rand(100));
code_5=sy = sx;
code_6=x = x - 0.008 + 0.0033*sin(time*1.371);
code_7=y = orig_y + 0.12*sin(time*1.9);

[img10]
img=textures\manyfish.jpg
init_1=blendmode = 3;
code_1=rot = time*0.27;                           
code_2=new_scale = 0.9 + 0.2*sin(time*0.6);      
code_3=sx = new_scale;                            
code_4=sy = new_scale;                            
code_5=new_alpha = min(0.9,max(0.2,  2*max(bass-.05,bass_att)-1.1  ));
code_6=a = 1;//a*0.9 + 0.1*new_alpha;

[img11]
img=textures\onefish.jpg
init_1=blendmode = 3;
code_1=rot = -time*0.2;                           
code_2=new_scale = 0.7 + 0.2*sin(time*0.6);      
code_3=sx = new_scale;                            
code_4=sy = new_scale;                            
code_5=new_alpha = .4*min(0.9,max(0.2,  2*max(treb-.05,treb_att)-1.1  ));
code_6=a = a*0.03 + 0.10*new_alpha;