Oh man, sorry for the long delay. After I made the general thing, I was thinking I could easily finish it within a week, but never got to it. But, here it is. I'm sure there's errors. Tell me if you see any, and I'll get to them asap.
To run, type /animator or right click the channel or status and click "Animator." Draw using the mouse. I hope you enjoy. :)
Oh, and http://bluethen.the-brotherhood.org/Animator/Animator.htm Updates: 1.0.2 (August 18, 2008) Fixed the "New" bug. Fixed bug where you can't delete last frame. 1.0.1 (August 18, 2008) Fixed the load feature. ```mirc ;Animator 1.0.2 ;Made by BlueThen on July 28, 2008 ;to run, type /animator or right click the channel or status and click "Animator." ;draw using the mouse. I hope you enjoy. :) menu channel,status { Animator: animator } dialog Anim { title "Animator Options" size -1 -1 332 464 option pixels notheme box "Frames:", 2, 11 2 144 357 list 1, 21 28 129 317, vsbar size box "Frame:", 3, 169 2 150 115 button "New Blank", 4, 212 20 65 25 button "Duplicate", 5, 212 51 65 25 box "Tools:", 6, 169 123 150 115 radio "Pencil", 7, 209 141 70 17 radio "Line", 8, 209 164 70 17 radio "Fill", 9, 209 187 70 17 box "Size: 10", 10, 171 244 150 115 scroll "", 11, 180 334 130 16, horizontal top range 1 500 icon 12, 214 261 65 65 check "Erase", 21, 209 210 70 17 box "PlayBack", 22, 11 367 310 91 button "Play", 23, 23 386 65 25 button "Stop", 25, 245 385 65 25 scroll "", 26, 23 436 287 16, horizontal top range 1 60 text "Speed: 15 FPS", 27, 23 416 100 17 button "Delete", 28, 212 82 65 25 menu "File", 13 item "New", 24, 13 item "Save", 15, 13 item "Load", 16, 13 menu "Edit", 14 item "Undo", 17, 14 item "Redo", 18, 14 menu "Other", 19 item "Visit BlueThen.com", 20, 19 } on *:dialog:anim:scroll:*: { if ($did == 11) { did -ra Anim 10 Size: $did(11).sel | clear @size drawfill -r @size 16777215 16777215 1 1 | drawdot @size 1 $calc($did(11).sel + 1) 35 35 drawdot @size 0 $calc($did(11).sel - 1) 35 35 | drawsave @size size.bmp did -g anim 12 size.bmp | set %anim.size $did(11).sel } if ($did == 26) { did -ra Anim 27 Speed: $did(26).sel | set %anim.speed $did(26).sel writeini -n anitemp.ini main speed $did(26).sel } } on *:dialog:anim:sclick:*: { if ($did == 28) { if ($did(1).lines != 1) { if ($window(@anim $+ %anim.frame $+ .buf2)) window -c @anim $+ %anim.frame $+ .buf2 remini anitemp.ini Frame. $+ %anim.frame | did -d anim 1 $did(anim,1).sel writeini -n AniTemp.ini frame. $+ %anim.frame Deleted Yes if (%anim.frames != %anim.frame) inc %anim.frame | else set %anim.frame 1 } else { if ($window(@anim $+ %anim.frame $+ .buf2)) clear @anim $+ %anim.frame $+ .buf2 remini anitemp.ini Frame. $+ %anim.frame | clear @anim1.buf drawfill -r @anim1.buf 16711422 16711422 1 1 remini anitemp.ini Frame. $+ %anim.frame if (%anim.frames != %anim.frame) inc %anim.frame | else set %anim.frame 1 } anim.obuffer anim.buffer } if ($did == 1) { set %anim.frame $gettok($did(anim,1).seltext,2,32) | anim.buffer } if ($did == 23) anim.play if ($did == 25) anim.stop if ($did == 7) set %anim.brush Pencil if ($did == 8) set %anim.brush Line if ($did == 9) set %anim.brush Fill if ($did == 21) { set %anim.brush.e $iif($did(21).state == 1, Yes, No) } if ($did == 4) { if ($window(@anim $+ %anim.frame $+ .buf2)) window -c @anim $+ %anim.frame $+ .buf2 inc %anim.frames | set %anim.frame %anim.frames writeini -n anitemp.ini Main Frames %anim.frame writeini -n anitemp.ini Frame. $+ %anim.frame Parameters 0 writeini -n AniTemp.ini frame. $+ %anim.frame Deleted No window -paozCdk0h +tnbL @Anim $+ %anim.frame $+ .buf -1 -1 800 800 drawfill -r @Anim $+ %anim.frame $+ .buf 16711422 16711422 1 1 did -a anim 1 Frame %anim.frame | did -c anim 1 $did(anim,1).lines | anim.buffer } if ($did == 5) { if ($window(@anim $+ %anim.frame $+ .buf2)) window -c @anim $+ %anim.frame $+ .buf2 inc %anim.frames | set %anim.frame %anim.frames set %anim.duphost $did(anim,1).sel window -paozCdk0h +tnbL @Anim $+ %anim.frame $+ .buf -1 -1 800 800 drawfill -r @Anim $+ %anim.frame $+ .buf 16711422 16711422 1 1 writeini -n anitemp.ini Main Frames %anim.frames writeini -n anitemp.ini Frame. $+ %anim.frame Parameters $readini(anitemp.ini, Frame. $+ %anim.duphost, Parameters) writeini -n AniTemp.ini frame. $+ %anim.frame Deleted No | %anim.l = 1 while (%anim.l <= $readini(anitemp.ini, Frame. $+ %anim.frame ,Parameters)) { %anim.tpar = $readini(anitemp.ini, Frame. $+ %anim.duphost, Par $+ %anim.l) writeini -n anitemp.ini Frame. $+ %anim.frame Par $+ %anim.l %anim.tpar draw $+ $gettok(%anim.tpar ,1,32) @anim $+ %anim.frame $+ .buf $iif($gettok(%anim.tpar,1,32) != Fill, $iif($gettok(%anim.tpar,2,32) == Yes, 0, 1), $str($iif($gettok(%anim.tpar,2,32) == Yes, 0, 1) $+ $chr(32) ,2)) $iif($gettok(%anim.tpar,1,32) == Fill, $null, $iif($gettok(%anim.tpar,1,32) == Dot, $gettok(%anim.tpar,3,32), $calc($gettok(%anim.tpar,3,32) *2))) $gettok(%anim.tpar,4-5,32) $iif($gettok(%anim.tpar,6-7,32) != $null, $v1, $v2) inc %anim.l } did -a anim 1 Frame %anim.frame did -c anim 1 $did(anim,1).lines | anim.buffer } } on *:dialog:anisave:sclick:5: { if ($did(3)) { set %anim.fn $did(3) | mkdir $qt($mircdir $+ \ $+ Animations) play -as anim.save anitemp.ini 1 | dialog -x anisave } else echo -s Enter a filename first. } alias -l anim.save write $qt($mircdir $+ Animations\ $+ %anim.fn $+ .blu) $3- on *:dialog:anim:menu:*: { if ($did == 24) { if ($window(@anim $+ %anim.frame $+ .buf2)) window -c @anim $+ %anim.frame $+ .buf2 window -c @anim.bufu | set %anim.x %anim.frames while (%anim.x) { window -c @anim $+ %anim.x $+ .buf | dec %anim.x } window -c @size | window -c @anim.bufo | window -c @anim.bufo2 | dialog -x Anim | unset %anim.* if ($window(@anim.bufr)) window -c @anim.bufr if ($window(@anim.bufu)) window -c @anim.bufu write -c anitemp.ini animator } if ($did == 20) run www.bluethen.com if ($did == 17) anim.undo if ($did == 18) anim.redo if ($did == 15) dialog -m anisave anisave if ($did == 16) anim.load } dialog anisave { title "Save Animation" size 30 70 244 56 option pixels notheme edit "My Animation", 3, 14 30 100 20, autohs text "Filename:", 4, 14 11 100 17 button "Save", 5, 166 25 65 25 } alias -l anim.load { write -c anitemp.ini | set %anim.x %anim.frames while (%anim.x) { window -c @anim $+ %anim.x $+ .buf | dec %anim.x } set %anim.file $qt($sfile($qt($mircdir $+ Animations $+ \))) play -as anim.load2 %anim.file 1 | did -r anim 1 | %anim.set = 1 while (%anim.set <= $readini(%anim.file, main, frames)) { did -a anim 1 Frame %anim.set window -paozCdk0h +tnbL @Anim $+ %anim.set $+ .buf -1 -1 800 800 drawfill -r @Anim $+ %anim.set $+ .buf 16711422 16711422 1 1 %anim.t = 1 while (%anim.t < $readini(%anim.file, frame. $+ %anim.set, Parameters)) { %anim.tpar = $readini(%anim.file, Frame. $+ %anim.set, Par $+ %anim.t) draw $+ $gettok( %anim.tpar ,1,32) @anim $+ %anim.set $+ .buf $iif($gettok(%anim.tpar,1,32) != Fill, $iif($gettok(%anim.tpar,2,32) == Yes, 0, 1), $str($iif($gettok(%anim.tpar,2,32) == Yes, 0, 1) $+ $chr(32) ,2)) $iif($gettok(%anim.tpar,1,32) == Fill, $null, $iif($gettok(%anim.tpar,1,32) == Dot, $gettok(%anim.tpar,3,32), $calc($gettok(%anim.tpar,3,32) *2))) $gettok(%anim.tpar,4-5,32) $iif($gettok(%anim.tpar,6-7,32) != $null, $v1, $v2) inc %anim.t } inc %anim.set } set %anim.frames $readini(%anim.file, main, frames) | set %anim.frame 1 } alias -l anim.load2 write $qt($mircdir $+ anitemp.ini) $3- alias -l anim.undo { if (!$window(@anim.bufr)) window -paozCdk0h +tnbL @Anim.bufr -1 -1 800 800 drawcopy @anim $+ %anim.frame $+ .buf 0 0 800 800 @anim.bufr 0 0 800 800 drawcopy @anim.bufu 0 0 800 800 @anim $+ %anim.frame $+ .buf 0 0 800 800 anim.obuffer | anim.buffer %anim.y = $calc(%anim.parstart + 1) %anim.xy = $calc((%anim.parend - %anim.parstart) + 1) writeini -n anirtemp.ini Frame. $+ %anim.frame parameters %anim.xy while (%anim.y <= %anim.parend) { writeini -n anirtemp.ini Frame. $+ %anim.frame Par $+ %anim.xy $readini(anitemp.ini, Frame. $+ %anim.frame, Par $+ %anim.y) remini anitemp.ini Frame. $+ %anim.frame Par $+ %anim.y | inc %anim.y | dec %anim.xy } writeini -n anitemp.ini Frame. $+ %anim.frame Parameters %anim.parstart } alias -l anim.redo { if ($readini(anirtemp.ini, Frame. $+ %anim.frame , parameters)) { if ($window(@anim.bufr)) drawcopy @anim.bufr 0 0 800 800 @anim $+ %anim.frame $+ .buf 0 0 800 800 anim.obuffer | anim.buffer %anim.z = $readini(anirtemp.ini, Frame. $+ %anim.frame ,Parameters) while (%anim.z > 1) { writeini -n anitemp.ini Frame. $+ %anim.frame Par $+ $calc(%anim.z + $readini(anitemp.ini, Frame. $+ %anim.frame , parameters)) $readini(anirtemp.ini, Frame. $+ %anim.frame , Par $+ %anim.z) remini anirtemp.ini Frame. $+ %anim.frame Par $+ %anim.z | dec %anim.z } writeini -n anitemp.ini Frame. $+ %anim.frame Parameters $calc($readini(anitemp.ini, Frame. $+ %anim.frame , parameters) + $readini(anirtemp.ini, Frame. $+ %anim.frame ,Parameters)) remini anirtemp.ini Frame. $+ %anim.frame Parameters } } alias Animator { dialog -m Anim Anim | dialog -s Anim 50 100 332 484 Anim.size.init | Anim.init } alias -l Anim.size.init { window -paozCdk0h +ndL @Size -1 -1 70 70 drawfill @Size 0 0 1 1 drawdot @size 1 11 35 35 drawdot @size 0 9 35 35 drawsave @size size.bmp did -g anim 12 size.bmp } alias -l Anim.init { did -a Anim 1 Frame 1 | did -c Anim 1 1 did -c Anim 26 15 | did -c Anim 11 10 | did -c Anim 7 window -paoCuzdk0 +tnbL @Animator -1 -1 400 400 window -paoCuzdk0h +tnbL @Anim.bufo -1 -1 800 800 window -paoCuzdk0h +tnbL @Anim.bufo2 -1 -1 800 800 window -paozCdk0h +tnbL @Anim1.buf -1 -1 800 800 window -paozCdk0h +tnbL @Anim.bufu -1 -1 800 800 writeini -n AniTemp.ini Main Frames 1 writeini -n AniTemp.ini frame. $+ %anim.frame Parameters 0 writeini -n AniTemp.ini frame. $+ %anim.frame Deleted No set %anim.brush pencil | set %anim.size 10 | set %anim.frame 1 | set %anim.frames 1 | set %anim.lframe 1 set %anim.brush.e No | drawfill -r $(@anim $+ %anim.frame $+ .buf) 16711422 16711422 1 1 anim.obuffer | anim.buffer } on *:close:@Animator: { if ($window(@anim $+ %anim.frame $+ .buf2)) window -c @anim $+ %anim.frame $+ .buf2 window -c @anim.bufu | set %anim.x %anim.frames while (%anim.x) { window -c @anim $+ %anim.x $+ .buf | dec %anim.x } window -c @size | window -c @anim.bufo | window -c @anim.bufo2 | dialog -x Anim | unset %anim.* if ($window(@anim.bufr)) window -c @anim.bufr if ($window(@anim.bufu)) window -c @anim.bufu write -c anitemp.ini } on *:dialog:anim:close:0: { if ($window(@anim $+ %anim.frame $+ .buf2)) window -c @anim $+ %anim.frame $+ .buf2 window -c @animator | set %anim.x %anim.frames while (%anim.x) { window -c @anim $+ %anim.x $+ .buf | dec %anim.x } window -c @size | window -c @anim.bufo | window -c @anim.bufo2 | unset %anim.* if ($window(@anim.bufr)) window -c @anim.bufr if ($window(@anim.bufu)) window -c @anim.bufu write -c anitemp.ini } menu @Animator { sclick: { set %anim.parstart $calc($readini(anitemp.ini, frame. $+ %anim.frame, parameters) +1) drawcopy -m @anim $+ %anim.frame $+ .buf 0 0 800 800 @anim.bufu 0 0 800 800 | set %anim.click y if (%anim.brush == Pencil) { drawdot @anim $+ %anim.frame $+ .buf $iif(%anim.brush.e == yes, 0, 1) %anim.size $calc($mouse.x *2) $calc($mouse.y *2) anim.buffer writeini -n anitemp.ini Frame. $+ %anim.frame Par $+ $calc($readini(anitemp.ini,frame. $+ %anim.frame, parameters) +1) Dot %anim.brush.e %anim.size $calc($mouse.x *2) $calc($mouse.y *2) writeini -n anitemp.ini Frame. $+ %anim.frame Parameters $calc($readini(anitemp.ini, frame. $+ %anim.frame, parameters) +1) } if (%anim.brush == Line) { set %anim.buf2 @anim $+ %anim.frame $+ .buf2 if ($window(%anim.buf2) == $null) window -paohzCdk0 +tnbL %anim.buf2 -1 -1 800 800 drawcopy @anim $+ %anim.frame $+ .buf 0 0 800 800 %anim.buf2 0 0 800 800 } if (%anim.brush == Fill) { drawfill @anim $+ %anim.frame $+ .buf $iif(%anim.brush.e == yes, 0, 1) $iif(%anim.brush.e == yes, 0, 1) $calc($mouse.x * 2) $calc($mouse.y * 2) anim.buffer writeini -n anitemp.ini Frame. $+ %anim.frame Par $+ $calc($readini(anitemp.ini,frame. $+ %anim.frame, parameters) +1) Fill %anim.brush.e 1 $calc($mouse.x *2) $calc($mouse.y *2) writeini -n anitemp.ini Frame. $+ %anim.frame Parameters $calc($readini(anitemp.ini, frame. $+ %anim.frame, parameters) +1) } set %anim.last.x $calc($mouse.x * 2) | set %anim.last.y $calc($mouse.y * 2) if ($window(@anim.bufr)) window -c @anim.bufr } mouse: { if (%anim.click == y) { if (%anim.size == $null) set %anim.size 10 if ((%anim.brush == $null) || (%anim.brush == pencil)) { drawline @anim $+ %anim.frame $+ .buf $iif(%anim.brush.e == yes, 0, 1) $calc(%anim.size *2) $calc($mouse.x * 2) $calc($mouse.y * 2) %anim.last.x %anim.last.y writeini -n anitemp.ini Frame. $+ %anim.frame Par $+ $calc($readini(anitemp.ini,frame. $+ %anim.frame, parameters) +1) Line %anim.brush.e %anim.size $calc($mouse.x *2) $calc($mouse.y *2) %anim.last.x %anim.last.y writeini -n anitemp.ini Frame. $+ %anim.frame Parameters $calc($readini(anitemp.ini, frame. $+ %anim.frame, parameters) +1) set %anim.last.x $calc($mouse.x * 2) | set %anim.last.y $calc($mouse.y * 2) | anim.buffer } if (%anim.brush == Line) { clear %anim.buf2 drawcopy @anim $+ %anim.frame $+ .buf 0 0 800 800 %anim.buf2 0 0 800 800 drawline %anim.buf2 $iif(%anim.brush.e == yes, 0, 1) $calc(%anim.size * 2) %anim.last.x %anim.last.y $calc($mouse.x * 2) $calc($mouse.y * 2) drawcopy -m %anim.buf2 0 0 800 800 @animator 0 0 400 400 } } } uclick: { if (%anim.brush == Line) { drawcopy %anim.buf2 0 0 800 800 @anim $+ %anim.frame $+ .buf 0 0 800 800 anim.obuffer | anim.buffer | window -c %anim.buf2 writeini -n anitemp.ini Frame. $+ %anim.frame Par $+ $calc($readini(anitemp.ini,frame. $+ %anim.frame, parameters) +1) Line %anim.brush.e %anim.size $calc($mouse.x *2) $calc($mouse.y *2) %anim.last.x %anim.last.y writeini -n anitemp.ini Frame. $+ %anim.frame Parameters $calc($readini(anitemp.ini, frame. $+ %anim.frame, parameters) +1) } unset %anim.click %anim.last.* set %anim.parend $readini(anitemp.ini, frame. $+ %anim.frame, parameters) } leave: { if (%anim.brush == Line) { drawcopy %anim.buf2 0 0 800 800 @anim $+ %anim.frame $+ .buf 0 0 800 800 | anim.obuffer | anim.buffer writeini -n anitemp.ini Frame. $+ %anim.frame Par $+ $calc($readini(anitemp.ini,frame. $+ %anim.frame, parameters) +1) Line %anim.brush.e %anim.size $calc($mouse.x *2) $calc($mouse.y *2) %anim.last.x %anim.last.y writeini -n anitemp.ini Frame. $+ %anim.frame Parameters $calc($readini(anitemp.ini, frame. $+ %anim.frame, parameters) +1) } unset %anim.click %anim.last.* set %anim.parend $readini(anitemp.ini, frame. $+ %anim.frame, parameters) } } alias anim.obuffer { clear @Anim.bufo2 | drawfill @anim.bufo2 0 0 1 1 if ($did(anim,1).sel > 2) { %anim.v = 1 while (%anim.v <= $readini(anitemp.ini, Frame. $+ $calc($gettok($did(anim,1).seltext,2,32) -2) ,Parameters)) { %anim.tpar = $readini(anitemp.ini, Frame. $+ $calc($gettok($did(anim,1).seltext,2,32) -2), Par $+ %anim.v) draw $+ $gettok(%anim.tpar ,1,32) @anim.bufo2 $iif($gettok(%anim.tpar,1,32) != Fill, $iif($gettok(%anim.tpar,2,32) == Yes, 0, 15), $str($iif($gettok(%anim.tpar,2,32) == Yes, 0, 1) $+ $chr(32) ,2)) $iif($gettok(%anim.tpar,1,32) == Fill, $null, $iif($gettok(%anim.tpar,1,32) == Dot, $gettok(%anim.tpar,3,32), $calc($gettok(%anim.tpar,3,32) *2))) $gettok(%anim.tpar,4-5,32) $iif($gettok(%anim.tpar,6-7,32) != $null, $v1, $v2) inc %anim.v } } if ($did(anim,1).sel > 1) { %anim.v = 1 while (%anim.v <= $readini(anitemp.ini, Frame. $+ $calc($gettok($did(anim,1).seltext,2,32) -1) ,Parameters)) { %anim.tpar = $readini(anitemp.ini, Frame. $+ $calc($gettok($did(anim,1).seltext,2,32) -1), Par $+ %anim.v) draw $+ $gettok(%anim.tpar ,1,32) @anim.bufo2 $iif($gettok(%anim.tpar,1,32) != Fill, $iif($gettok(%anim.tpar,2,32) == Yes, 0, 14), $str($iif($gettok(%anim.tpar,2,32) == Yes, 0, 1) $+ $chr(32) ,2)) $iif($gettok(%anim.tpar,1,32) == Fill, $null, $iif($gettok(%anim.tpar,1,32) == Dot, $gettok(%anim.tpar,3,32), $calc($gettok(%anim.tpar,3,32) *2))) $gettok(%anim.tpar,4-5,32) $iif($gettok(%anim.tpar,6-7,32) != $null, $v1, $v2) inc %anim.v } } drawcopy @anim.bufo2 0 0 800 800 @anim.bufo 0 0 800 800 set %anim.lframe $did(anim,1).sel } alias anim.buffer { if ($did(anim,1).sel != %anim.lframe) anim.obuffer drawcopy -mt @anim $+ %anim.frame $+ .buf 16711422 0 0 800 800 @anim.bufo 0 0 800 800 drawcopy -m @anim.bufo 0 0 800 800 @animator 0 0 400 400 } on *:keydown:@animator:*: { if ($keyval == 17) set %anim.ctrl y if (($keyval == 90) && (%anim.ctrl == y)) anim.undo if (($keyval == 89) && (%anim.ctrl == y)) anim.redo } on *:keyup:@animator:17: unset %anim.ctrl alias -l anim.stop { if (%anim.playing == y) { set %anim.playing n | anim.obuffer | .timer -h 1 1 anim.buffer } } alias -l anim.play { set %anim.playing y set %anim.speed $iif($readini(anitemp.ini,main,speed) != $null, $v1, $did(anim, 26).sel) set %anim.fx 0 | anim.frame } alias -l anim.frame { while ($readini(anitemp.ini, frame. $+ %anim.fx , Deleted) == yes) { if (%anim.fx == %anim.frames) set %anim.fx 1 else inc %anim.fx } if ($window(@anim $+ %anim.fx $+ .buf)) { drawcopy -m @anim $+ %anim.fx $+ .buf 0 0 800 800 @animator 0 0 400 400 } else { drawcopy -m @anim1.buf 0 0 800 800 @animator 0 0 400 400 | set %anim.fx 0 } inc %anim.fx if (%anim.playing != n) .timer -h 1 $calc(1000 / %anim.speed) anim.frame } ```I got a couple of errors, but that's not why I'm commenting.
You should definitely consider disabling the "Play" whilst playing and the same for "Stop" when stopped, else you could do what I tested:
I pressed "Play" many times in a row and the program sped up, and kept doing so until it crashed mIRC.
Everything worked ok for me cept for one thing, i could draw, playback the little animation, but when i saved it and tryed to reopen it It just came up with black on each window i drawed on. O.O, besides that excellent job BlueThen! :)
9/10 for me 10/10 once the save thing works :D unless its my computer/mirc lol
bout time >;[