#!/usr/bin/perl -w # copyright alex@slab.org, January 2004 # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. # the complete license may be found here: # http://www.gnu.org/copyleft/gpl.html # ** please note ** # This perl script requires the Curses and Time::Hires modules, both of # which are available from http://search.cpan.org/ . # alternatively, debian gnu/linux users can try running: # apt-get install libtime-hires-perl libcurses-perl # i'm sure that you could get it working under windows too fairly # easily, but i'm not sure how. use strict; use Curses; use Time::HiRes qw{ sleep }; use vars qw/ $bodyparts $current $speed @speeds /; @speeds = qw/ 0.4 0.01 0.025 0.05 0.075 0.1 0.15 0.2 0.25 0.3 /; $speed = $speeds[4]; $bodyparts = { head => {default => [['',' O ']], bob => [['',' O '], ['',' o '], ] }, body => { default => [['','',' Z ']], spin => [ ['','',' Z '], ['','',' z '], ['','',' Z '], ['','',' z '], ['','',' Z '], ['','',' Z '], ['','',' Z '], ['','',' Z '], ] }, arms => { default => [['', ' ', ' ./ \. ' ] ], flap => [ ['', ' ', ' ./ \. ' ], ['','.__ __. ', ], ], feelie => [ ['', ' ', ' ./ \. ' ], ['', ' ', ' ,/ \, ' ], ], curl => [ [' ', ' ', ' ./ \. ' ], [' ', '.__ ', ' \. ' ], [' . ', ' ( ', ' \. ' ], [' ', '.__ ', ' \. ' ], [' ', ' ', ' ./ \. ' ], ['', ' __.', ' ./ ' ], [' . ', ' ) ', ' ./ ' ], ['', ' __.', ' ./ ' ], ], wave => [ [' . ', '.__ ) ', ], [' . ', '.__ / ', ], [' . ', ' \ __.', ], [' . ', ' ( __.', ], [' . ', ' \ __.', ], [' . ', '.__ / ', ], ] }, legs => { default => [['','','',' / \ ']], wobble => [['','','',' / \ '], ['','','',' ( ) '], ['','','',' / \ '], ['','','',' ) ( '] ], strut => [ ['','','',' ( \ '], ['','','',' / ) '] ] } }; ## init(); dance(); ## sub place { my ($frame) = @_; my $y = 0; foreach my $line (@$frame) { my $x = 0; foreach my $char (split(//, $line)) { unless ($char eq ' ') { addstr($y, $x, $char ); } ++$x; } ++$y; } } ## sub init_curses { initscr; cbreak; noecho; keypad 1; nonl; nodelay 1; } ## sub init_parts { foreach my $part (keys %$bodyparts) { $current->{$part} = 'default'; } } ## sub init { init_curses(); init_parts(); addstr(0, 8, "| "); addstr(1, 8, "| hello"); addstr(2, 8, "| press SPACEBAR to change my dance"); addstr(3, 8, "| press a number key to change my dancing speed"); addstr(4, 8, "| for more options, add things to my sourcecode"); addstr(5, 8, "| please let alex\@slab.org know of your changes "); addstr(6, 8, "| "); } ## sub dance { my $step = 0; while (1) { while (my ($part, $position) = each %$current) { my $frames = $bodyparts->{$part}->{$position}; my $frame = $frames->[$step % @$frames]; place($frame); } ++$step; refresh(); sleep($speed); foreach my $y (0 .. 5) { addstr($y, 0, ' ' x 7); } while((my $ch = getch()) ne ERR) { $ch = 'space' if $ch eq ' '; $ch = 'left' if $ch eq KEY_LEFT; $ch = 'right' if $ch eq KEY_RIGHT; $ch = 'up' if $ch eq KEY_UP; $ch = 'down' if $ch eq KEY_DOWN; my $func = "key__$ch"; if (__PACKAGE__->can($func)) { __PACKAGE__->$func(); } } } } ## sub key__space { my $self = shift; while (my ($part, $positions) = each %$bodyparts) { my @names = keys %$positions; $current->{$part} = $names[rand @names]; } } sub key__1 { $speed = $speeds[1] } sub key__2 { $speed = $speeds[2] } sub key__3 { $speed = $speeds[3] } sub key__4 { $speed = $speeds[4] } sub key__5 { $speed = $speeds[5] } sub key__6 { $speed = $speeds[6] } sub key__7 { $speed = $speeds[7] } sub key__8 { $speed = $speeds[8] } sub key__9 { $speed = $speeds[9] } sub key__0 { $speed = $speeds[0] }