Game-PlatformsOfPeril
view release on metacpan or search on metacpan
lib/Game/PlatformsOfPeril.pm view on Meta::CPAN
sub restore_term {
ReadMode 'restore';
print term_norm, show_cursor, unalt_screen;
}
sub rotate_left {
my $lm;
for my $r ( 0 .. ROWS - 1 ) {
for my $c ( 0 .. COLS - 1 ) {
my $newr = COLS - 1 - $c;
$lm->[$newr][$r] = $LMap->[$r][$c];
$lm->[$newr][$r][WHERE] = [ $r, $newr ];
}
}
$LMap = $lm;
$Rotation = ( $Rotation + 1 ) % 4;
}
sub rotate_right {
my $lm;
for my $r ( 0 .. ROWS - 1 ) {
for my $c ( 0 .. COLS - 1 ) {
my $newc = ROWS - 1 - $r;
$lm->[$c][$newc] = $LMap->[$r][$c];
$lm->[$c][$newc][WHERE] = [ $newc, $c ];
}
}
$LMap = $lm;
$Rotation = ( $Rotation - 1 ) % 4;
}
sub track_hero {
$Hero = $Animates[HERO][LMC][WHERE];
# route monsters to where the player will fall to as otherwise they
# tend to freeze or head in the wrong direction
my $row = $Hero->[PROW];
my $col = $Hero->[PCOL];
return
if $row == ROWS - 1
or $LMap->[$row][$col][GROUND][WHAT] == LADDER;
my $goal = $row;
for my $r ( $row + 1 .. ROWS - 1 ) {
last if $LMap->[$r][$col][GROUND][WHAT] == WALL;
if ($LMap->[$r][$col][GROUND][WHAT] == LADDER
or ( $r < ROWS - 2
and $LMap->[$r][$col][GROUND][WHAT] == FLOOR
and $LMap->[ $r + 1 ][$col][GROUND][WHAT] == WALL )
or ( $r == ROWS - 1
and $LMap->[$r][$col][GROUND][WHAT] == FLOOR )
) {
$goal = $r;
last;
}
}
$Hero = [ $col, $goal ];
}
sub update_hero {
my ( $key, $ret );
tcflush( STDIN_FILENO, TCIFLUSH );
while (1) {
while (1) {
$key = ReadKey(0);
last if exists $Key_Commands{$key};
#post_message(sprintf "Illegal command \\%03o", ord $key);
}
$ret = $Key_Commands{$key}->();
last if $ret != MOVE_FAILED;
}
return $ret;
}
sub update_monst {
my ($ent) = @_;
my $mcol = $ent->[LMC][WHERE][PCOL];
my $mrow = $ent->[LMC][WHERE][PROW];
# prevent monster move where only gravity should apply
# NOTE one may have the clever idea that monsters can run across the
# heads of other monsters though that would require changes to how
# the graph is setup to permit such moves, and additional checks to
# see if something to tread upon is available (and then to let the
# hero do that (like in Lode Runner) or to prevent them from such
# head-running...)
if ( $mrow != ROWS - 1
and $ent->[LMC][GROUND][WHAT] == FLOOR
and $LMap->[ $mrow + 1 ][$mcol][GROUND][WHAT] != WALL ) {
return;
}
my $dest = find_hero( $ent, $mcol, $mrow );
return unless defined $dest;
relocate( $ent, $dest ) unless interact( $ent, $dest );
if ( $ent->[STASH][GEM_STASH] > 0
and !defined $ent->[LMC][ITEM] ) {
if ( rand() < $ent->[STASH][GEM_ODDS] ) {
post_message( 'The ' . $Monst_Name . ' drops a gem!' );
$ent->[STASH][GEM_STASH]--;
make_item( $ent->[LMC][WHERE], GEM, GEM_VALUE );
$ent->[STASH][GEM_ODDS] = 0.0 - GEM_ODDS_ADJUST;
}
$ent->[STASH][GEM_ODDS] += GEM_ODDS_ADJUST;
}
}
1;
__END__
=head1 NAME
Game::PlatformsOfPeril - the platforms of peril
=head1 SYNOPSIS
Platforms of Peril is a terminal-based game. Assuming App::cpanminus
(and possibly also local::lib) is installed and setup, in a suitable
terminal (possibly one with a square font such as White Rabbit and a
black background) install and run the game via:
cpanm Game::PlatformsOfPeril
pperil
Help text should be printed when the game starts. Use the C<?> key in
game to show the help text again.
=head1 DESCRIPTION
You are the only spawn (son, daughter, etc.) of a Xorbian Ranger and as
such are duty bound not to peruse pointless background material such as
this. You have long hair, green eyes, and start the game with a bomb,
and need to collect gems all the while avoiding the enemies. The enemies
( run in 2.309 seconds using v1.01-cache-2.11-cpan-39bf76dae61 )