From d354c616438dbd542fdd6edbe0989ecd6e5d74fc Mon Sep 17 00:00:00 2001 From: "Martin T. H. Sandsmark" Date: Tue, 4 Aug 2020 17:22:33 +0200 Subject: [PATCH] add submarine from https://github.com/cmatsuoka/asciiquarium/pull/6 --- asciiquarium | 314 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 314 insertions(+) diff --git a/asciiquarium b/asciiquarium index 60811b1..b47c50a 100755 --- a/asciiquarium +++ b/asciiquarium @@ -1766,6 +1766,319 @@ yy ); } +sub submarine_callback { + my ($entity, $anim) = @_; + + my @delta = $entity->callback_args(); + my @pos = $entity->position(); + + my $x = $pos[0]; + my $y = $pos[1]; + my $z = $pos[2]; + my $frame = $delta[0][3]; + my $delay = $delta[0][4]; + my @frame_delay = @{[ 1, 4, 4, 9, 9, 9, 4, 4, 1 ]}; + + my $maxFrame = scalar(@frame_delay); + + # Move if not in center or skipping over the center + if(not (($x < $anim->width()/2-20 and $x + $delta[0][0] > $anim->width()/2-20) or + ($x > $anim->width()/2-20 and $x + $delta[0][0] < $anim->width()/2-20)) + and $x != $anim->width()/2-20) { + $x += $delta[0][0]; + } + else { + if($frame < $maxFrame - 1) { + if($delay < $frame_delay[$frame]) { + $delay += 1; + } + else { + $delay = 0; + $frame += 1; + } + } + else{ + $x += $delta[0][0]; + } + } + + my @args =[$delta[0][0],$delta[0][1],$delta[0][2],$frame,$delay]; + $entity->callback_args(@args); + return ($x, $y, $z, $frame); +} + +sub add_submarine { + my ($old_ent, $anim) = @_; + my @submarine_image = ( + [ +q{ + + + + __ + _|_ + / | + _ ? _______________/____|_______________ +( )?/ / + (=< O O O / +(_)?\_________________________________/ +} +,q{ + + + __ + | + _|_ + / | + _ ? _______________/____|_______________ +( )?/ / + (=< O O O / +(_)?\_________________________________/ +} +,q{ + + __ + | + | + _|_ + / | + _ ? _______________/____|_______________ +( )?/ / + (=< O O O / +(_)?\_________________________________/ +} +,q{ + __ + | + | + | + _|_ + / | + _ ? _______________/____|_______________ +( )?/ / + (=< O O O / +(_)?\_________________________________/ +} +,q{ + __ + | + | + | + _|_ + / | + _ ? _______________/____|_______________ +( )?/ / + (=< O O O / +(_)?\_________________________________/ +} +,q{ + __ + | + | + | + _|_ + / | + _ ? _______________/____|_______________ +( )?/ / + (=< O O O / +(_)?\_________________________________/ +} +,q{ + + __ + | + | + _|_ + / | + _ ? _______________/____|_______________ +( )?/ / + (=< O O O / +(_)?\_________________________________/ +} +,q{ + + + __ + | + _|_ + / | + _ ? _______________/____|_______________ +( )?/ / + (=< O O O / +(_)?\_________________________________/ +} +,q{ + + + + __ + _|_ + / | + _ ? _______________/____|_______________ +( )?/ / + (=< O O O / +(_)?\_________________________________/ +} + ],[ +q{ + + + + __ + _|_ + | \ +______________|____\_______________ ? _ +\ \?( ) + \ O O O >=) + \________________________________/?(_) +} +,q{ + + + __ + | + _|_ + | \ +______________|____\_______________ ? _ +\ \?( ) + \ O O O >=) + \________________________________/?(_) +} +,q{ + + __ + | + | + _|_ + | \ +______________|____\_______________ ? _ +\ \?( ) + \ O O O >=) + \________________________________/?(_) +} +,q{ + __ + | + | + | + _|_ + | \ +______________|____\_______________ ? _ +\ \?( ) + \ O O O >=) + \________________________________/?(_) +} +,q{ + __ + | + | + | + _|_ + | \ +______________|____\_______________ ? _ +\ \?( ) + \ O O O >=) + \________________________________/?(_) +} +,q{ + __ + | + | + | + _|_ + | \ +______________|____\_______________ ? _ +\ \?( ) + \ O O O >=) + \________________________________/?(_) +} +,q{ + + __ + | + | + _|_ + | \ +______________|____\_______________ ? _ +\ \?( ) + \ O O O >=) + \________________________________/?(_) +} +,q{ + + + __ + | + _|_ + | \ +______________|____\_______________ ? _ +\ \?( ) + \ O O O >=) + \________________________________/?(_) +} +,q{ + + + + __ + _|_ + | \ +______________|____\_______________ ? _ +\ \?( ) + \ O O O >=) + \________________________________/?(_) +} + ] + ); + + my @submarine_mask = ( +q{ + www + ww + ww + ww + w + + w +w w + www w w w +www +},q{ + www + ww + ww + ww + w + + w + w w + w w w www + www +}); + + my $dir = int(rand(2)); + my $x; + my $speed = 1; + if($dir) { + $speed *= -1; + $x = $anim->width()-2; + } else { + $x = -40 + } + + $anim->new_entity( + shape => $submarine_image[$dir], + auto_trans => 1, + color => $submarine_mask[$dir], + position => [ $x, 6, $depth{'water_gap3'} ], + callback_args => [ $speed, 0, 0, 0, 0 ], + callback => \&submarine_callback, + death_cb => \&random_object, + die_offscreen => 1, + default_color => 'YELLOW', + ); +} + sub init_random_objects { return ( \&add_ship, @@ -1777,6 +2090,7 @@ sub init_random_objects { \&add_swan, \&add_ducks, \&add_dolphins, + \&add_submarine, ); }