# by Kris Kowal # 2002-11-17-1547 PST package asciipet; sub new { return bless {}; } sub load { my $self = shift; my $file = shift; $self->{'file'} = $file; open FILE, "$file" or die; foreach my $line ( ) { chomp $line; next if $line eq ''; my @tags = split "\t", $line; if ( $tags[0] eq 'rank' ) { $self->{'ranks'}{$tags[1]} = $tag[2]; } else { $self->{$tags[0]} = $tags[1]; } } close FILE; } sub save { my $self = shift; my $file = shift; $file = $self->{'file'} if $file eq ''; open FILE, ">$file" or die; foreach my $key ( keys %$self ) { if ( $key eq 'ranks' ) { foreach my $rank ( keys %{$self->{'ranks'}} ) { print FILE "rank\t$rank\t$self->{'ranks'}{$rank}\n"; } } else { print FILE "$key\t$self->{$key}\n"; } } } sub update { my $self = shift; my $ticks = time - $self->{'time'}; $self->{'time'} = time; my $status = ''; my $mood = 0; # love $self->{'love'} -= $ticks; if ( $self->{'love'} < -259200 ) { $self->{'love'} = -259200; } elsif ( $self->{'love'} > 259200 ) { $self->{'love'} = 259200; } $mood += $self->{'love'}; # feeding if ( $self->{'eating'} > 0 ) { if ( $ticks > $self->{'eating'} ) { $self->{'energy'} += $self->{'eating'} * 1440; $self->{'eating'} = 0; } else { $self->{'energy'} += $ticks * 1440; $self->{'eating'} -= $ticks; $status = 'eating'; } } # energy $self->{'energy'} -= $ticks; if ( $self->{'energy'} < -259200 ) { $self->{'energy'} = -259200; } elsif ( $self->{'energy'} > 259200 ) { $self->{'energy'} = 259200; } $mood += $self->{'energy'}; # sleep cycle $self->{'tired'} += $ticks % 86400; $self->{'sleeping'} -= $ticks % 86400; $self->{'force_awake'} -= $ticks; if ( $self->{'tired'} > 57600 ) { $self->{'sleeping'} = $self->{'tired'} / 3; $self->{'tired'} = 0; } if ( $self->{'force_awake'} < 0 ) { $self->{'force_awake'} = 0; } if ( $self->{'force_awake'} == 0 ) { if ( $self->{'sleeping'} > 0 ) { $status = 'sleeping'; } } else { $mood -= $self->{'force_awake'}; } # set the mood if ( $status eq 'sleeping' ) { $self->{'mood_image'} = "status_sleep.txt"; $self->{'mood'} = "$self->{'name'} is sleeping."; } elsif ( $status eq 'eating' ) { if ( $self->{'energy'} <= 0 ) { $self->{'mood_image'} = "status_eating_hungry.txt"; $self->{'mood'} = "$self->{'name'} is eating."; } elsif ( $mood >= 0 ) { if ( rand() > .5 ) { $self->{'mood_image'} = "status_eating_ok1.txt"; $self->{'mood'} = "$self->{'name'} is eating."; } else { $self->{'mood_image'} = "status_eating_ok2.txt"; $self->{'mood'} = "$self->{'name'} is eating."; } } else { $self->{'mood_image'} = "status_eating_ok.txt"; $self->{'mood'} = "$self->{'name'} is eating."; } } elsif ( $self->{'energy'} <= 0 ) { $self->{'mood_image'} = "status_want_food.txt"; $self->{'mood'} = "$self->{'name'} is hungry."; if ( $mood >= 0 ) { if ( rand() < .3 ) { $self->{'mood_image'} = "status_want_food.txt"; $self->{'mood'} = "$self->{'name'} is hungry."; } if ( rand() < .5 ) { $self->{'mood_image'} = "status_want_food1.txt"; $self->{'mood'} = "$self->{'name'} is hungry."; } else { $self->{'mood_image'} = "status_want_food2.txt"; $self->{'mood'} = "$self->{'name'} is hungry."; } } else { $self->{'mood_image'} = "status_want_food0.txt"; $self->{'mood'} = "$self->{'name'} is hungry."; } } elsif ( $self->{'force_awake'} > 0 ) { $self->{'mood_image'} = "status_mood_angry.txt"; $self->{'mood'} = "$self->{'name'} is grouchy."; } elsif ( $self->{'tired'} > 46080 ) { $self->{'mood_image'} = "status_want_sleep.txt"; $self->{'mood'} = "$self->{'name'} is tired."; } else { if ( $mood > 172800 ) { $self->{'mood_image'} = "status_mood_happy.txt"; $self->{'mood'} = "$self->{'name'} feels great!"; } elsif ( $mood > 86400 ) { if ( rand() > .5 ) { $self->{'mood_image'} = "status_ok1.txt"; $self->{'mood'} = "$self->{'name'} feels spiffy."; } else { $self->{'mood_image'} = "status_ok2.txt"; $self->{'mood'} = "$self->{'name'} feels nifty."; } } elsif ( $mood < 172800 ) { if ( rand() < .3 ) { $self->{'mood_image'} = "status_crying.txt"; $self->{'mood'} = "$self->{'name'} is crying."; } elsif ( rand() < .5 ) { $self->{'mood_image'} = "status_crying1.txt"; $self->{'mood'} = "$self->{'name'} is crying."; } else { $self->{'mood_image'} = "status_crying2.txt"; $self->{'mood'} = "$self->{'name'} is crying."; } } elsif ( $mood < 86400 ) { $self->{'mood_image'} = "status_want_hug.txt"; $self->{'mood'} = "$self->{'name'} wants a hug."; } else { $self->{'mood_image'} = "status_ok.txt"; $self->{'mood'} = "$self->{'name'} feels fine."; } } } sub feed { my $self = shift; my $blame = shift; if ( $self->{'force_awake'} == 0 and $self->{'sleeping'} > 0 ) { $self->{'mood_image'} = "status_mood_angry.txt"; $self->{'mood'} = "You disturbed $self->{'name'}'s sleep!"; $self->{'force_awake'} += rand() * 300; $self->{'love'} -= $self->{'force_awake'}; $self->{'ranks'}{$blame} -= $self->{'sleeping'}; } else { if ( $self->{'eating'} > 0 ) { $self->{'mood_image'} = "status_eating_ok.txt"; $self->{'mood'} = "$self->{'name'} is already eating."; $self->{'ranks'}{$blame} += 60 * 1440; } else { if ( $self->{'force_awake'} > 0 ) { if ( $self->{'energy'} <= 0 ) { $self->{'eating'} = 60; $self->{'ranks'}{$blame} += 60 * 1440; $self->{'mood_image'} = "status_mood_eating_angry.txt"; $self->{'mood'} = "$self->{'name'} accepts your e-food moodily."; } else { $self->{'mood_image'} = "status_mood_angry.txt"; $self->{'mood'} = "$self->{'name'} isn't hungry and wants to go to sleep."; } } else { if ( $self->{'energy'} <= 0 ) { $self->{'eating'} = 60; $self->{'ranks'}{$blame} += 60 * 1440; $self->{'mood_image'} = "status_eating_ok.txt"; $self->{'mood'} = "$self->{'name'} accepts your e-food happily."; } else { $self->{'mood_image'} = "status_want.txt"; $self->{'mood'} = "$self->{'name'} isn't hungry."; } } } } } sub hug { my $self = shift; my $blame = shift; if ( $self->{'force_awake'} == 0 and $self->{'sleeping'} > 0 ) { $self->{'mood'} = "$self->{'name'} purs."; $self->{'love'} += 14400; } elsif ( $self->{'force_awake'} > 0 ) { $self->{'mood'} = "$self->{'name'} zaps you."; } else { $self->{'mood_image'} = "status_want_hug.txt"; $self->{'mood'} = "$self->{'name'} hugs you back."; $self->{'ranks'}{$blame} += 28800; $self->{'love'} += 28800; } } sub slap { my $self = shift; my $blame = shift; } sub draw { my $self = shift; open FILE, "$self->{'mood_image'}"; my @lines = ; close FILE; return join "", @lines; } sub mood { my $self = shift; return $self->{'mood'}; } 1;