#!/usr/bin/perl
# - automatically generated from src/redgreen.alp by:
# alpaca.pl v0.93
# http://catseye.webhop.net/projects/alpaca/
######################################################
use Alpaca qw(true false guess
adjacent_state adjacent_class
load_playfield display_playfield process_playfield);
sub FallableClassRules {
return 'Air' if ((not SupportClassMember($Playfield->[$x][$y+1])) and (adjacent_state('Air') >= 2) and (not (adjacent_state('DuctTape') >= 1)));
return 'Water' if ((not SupportClassMember($Playfield->[$x][$y+1])) and (adjacent_state('Water') >= 4) and (not (adjacent_state('DuctTape') >= 1)));
return $Playfield->[$x][$y] if (($Playfield->[$x][$y+1] eq 'ConveyorLeft' and (not PassthruClassMember($Playfield->[$x-1][$y]))) or ($Playfield->[$x][$y+1] eq 'ConveyorRight' and (not PassthruClassMember($Playfield->[$x+1][$y]))));
return 0
};
sub PassthruClassRules {
return $Playfield->[$x][$y-1] if (FallableClassMember($Playfield->[$x][$y-1]));
return $Playfield->[$x+1][$y] if (FallableClassMember($Playfield->[$x+1][$y]) and $Playfield->[$x+1][$y+1] eq 'ConveyorLeft');
return $Playfield->[$x-1][$y] if (FallableClassMember($Playfield->[$x-1][$y]) and $Playfield->[$x-1][$y+1] eq 'ConveyorRight');
return 0
};
sub FlammableClassRules {
return 'Fire' if ((adjacent_class(\&BurnerClassMember) >= 1));
return 0
};
sub SteamyClassRules {
return 'Water' if ($Playfield->[$x-1][$y] eq 'Water' or $Playfield->[$x+1][$y] eq 'Water' or $Playfield->[$x-1][$y-1] eq 'Water' or $Playfield->[$x+1][$y-1] eq 'Water' or $Playfield->[$x][$y-1] eq 'Water');
return 'Air' if (1);
return 0
};
sub BurnerClassRules {
return 0
};
sub SupportClassRules {
return 0
};
sub AirStateRules {
return 'Water' if ($Playfield->[$x][$y-1] eq 'Water' or $Playfield->[$x-1][$y-1] eq 'Water' or $Playfield->[$x+1][$y-1] eq 'Water' or ($Playfield->[$x-1][$y] eq 'Water' and SupportClassMember($Playfield->[$x-1][$y+1])) or ($Playfield->[$x-1][$y] eq 'Water' and $Playfield->[$x-1][$y+1] eq 'Water' and $Playfield->[$x][$y+1] eq 'Water') or ($Playfield->[$x+1][$y] eq 'Water' and SupportClassMember($Playfield->[$x+1][$y+1])) or ($Playfield->[$x+1][$y] eq 'Water' and $Playfield->[$x+1][$y+1] eq 'Water' and $Playfield->[$x][$y+1] eq 'Water'));
return 'Steam' if ($Playfield->[$x][$y+1] eq 'Steam' or $Playfield->[$x-1][$y+1] eq 'Steam' or $Playfield->[$x+1][$y+1] eq 'Steam');
return 'Smoke' if ($Playfield->[$x][$y+1] eq 'Smoke' or $Playfield->[$x-1][$y+1] eq 'Smoke' or $Playfield->[$x+1][$y+1] eq 'Smoke');
return 'Zappy' if ((adjacent_state('Spark') >= 1));
return PassthruClassRules() || 'Air'
};
sub WaterStateRules {
return 'Steam' if ((adjacent_state('Fire') >= 1) or (adjacent_state('Magma') >= 1));
return 'Bubble' if ($Playfield->[$x][$y+1] eq 'Bubble' or $Playfield->[$x][$y+1] eq 'Smoke' or $Playfield->[$x][$y+1] eq 'Steam');
return 'Fish' if ((adjacent_state('Fish') >= 3) and (adjacent_state('Water') >= 5));
return PassthruClassRules() || 'Water'
};
sub FireStateRules {
return 'Smoke' if ((adjacent_state('Water') >= 1) or (not (adjacent_state('Air') >= 1)) or ((not (adjacent_state('Torch') >= 1)) and (not (adjacent_state('DuctTape') >= 1)) and (not (adjacent_state('Twig') >= 1))));
return PassthruClassRules() || BurnerClassRules() || 'Fire'
};
sub EarthStateRules {
return 'Magma' if ((adjacent_state('Fire') >= 1));
return SupportClassRules() || 'Earth'
};
sub MagmaStateRules {
return 'Earth' if ((not (adjacent_state('Fire') >= 1)) and (not (adjacent_state('Magma') >= 2)));
return SupportClassRules() || BurnerClassRules() || 'Magma'
};
sub SteamStateRules {
return PassthruClassRules() || SteamyClassRules() || 'Steam'
};
sub SmokeStateRules {
return PassthruClassRules() || SteamyClassRules() || 'Smoke'
};
sub BubbleStateRules {
return PassthruClassRules() || SteamyClassRules() || 'Bubble'
};
sub FishStateRules {
return 'Air' if ((not (adjacent_state('Water') >= 1)));
return 'Water' if ((adjacent_state('Fish') >= 4) or (adjacent_state('Water') >= 7));
return 'Fish'
};
sub OnePebbleStateRules {
return 'TwoPebble' if ($Playfield->[$x][$y-1] eq 'OnePebble' and (SupportClassMember($Playfield->[$x][$y+1])));
return FallableClassRules() || 'OnePebble'
};
sub TwoPebbleStateRules {
return FallableClassRules() || SupportClassRules() || 'TwoPebble'
};
sub SparkStateRules {
return 'Tail' if (1);
return SupportClassRules() || BurnerClassRules() || 'Spark'
};
sub TailStateRules {
return 'Wire' if (1);
return SupportClassRules() || 'Tail'
};
sub WireStateRules {
return 'Spark' if ((adjacent_state('Spark') >= 1) and (not (adjacent_state('Spark') >= 3)));
return SupportClassRules() || 'Wire'
};
sub DuctTapeStateRules {
return 'UnravelTape' if (((not (adjacent_state('DuctTape') >= 2))) or ((not ((adjacent_state('DuctTape') >= 1) and (adjacent_class(\&SupportClassMember) >= 1)))));
return SupportClassRules() || FlammableClassRules() || 'DuctTape'
};
sub UnravelTapeStateRules {
return FallableClassRules() || FlammableClassRules() || 'UnravelTape'
};
sub TwigStateRules {
return FallableClassRules() || SupportClassRules() || FlammableClassRules() || 'Twig'
};
sub ZappyStateRules {
return 'BigZappy' if (1);
return PassthruClassRules() || BurnerClassRules() || 'Zappy'
};
sub BigZappyStateRules {
return 'Air' if (1);
return PassthruClassRules() || BurnerClassRules() || 'BigZappy'
};
sub RandomizerStateRules {
return SupportClassRules() || 'Randomizer'
};
sub ConveyorLeftStateRules {
return 'ConveyorRight' if ($Playfield->[$x][$y+1] eq 'Randomizer' and guess());
return 'ConveyorLeft'
};
sub ConveyorRightStateRules {
return 'ConveyorLeft' if ($Playfield->[$x][$y+1] eq 'Randomizer' and guess());
return 'ConveyorRight'
};
sub TorchStateRules {
return 'Torch'
};
sub BurnerClassMember {
return $_[0] eq 'Fire' ||
$_[0] eq 'Magma' ||
$_[0] eq 'Spark' ||
$_[0] eq 'Zappy' ||
$_[0] eq 'BigZappy' ||
0
};
sub FallableClassMember {
return $_[0] eq 'OnePebble' ||
$_[0] eq 'TwoPebble' ||
$_[0] eq 'UnravelTape' ||
$_[0] eq 'Twig' ||
0
};
sub FlammableClassMember {
return $_[0] eq 'DuctTape' ||
$_[0] eq 'UnravelTape' ||
$_[0] eq 'Twig' ||
0
};
sub PassthruClassMember {
return $_[0] eq 'Air' ||
$_[0] eq 'Water' ||
$_[0] eq 'Fire' ||
$_[0] eq 'Steam' ||
$_[0] eq 'Smoke' ||
$_[0] eq 'Bubble' ||
$_[0] eq 'Zappy' ||
$_[0] eq 'BigZappy' ||
0
};
sub SteamyClassMember {
return $_[0] eq 'Steam' ||
$_[0] eq 'Smoke' ||
$_[0] eq 'Bubble' ||
0
};
sub SupportClassMember {
return $_[0] eq 'Earth' ||
$_[0] eq 'Magma' ||
$_[0] eq 'TwoPebble' ||
$_[0] eq 'Spark' ||
$_[0] eq 'Tail' ||
$_[0] eq 'Wire' ||
$_[0] eq 'DuctTape' ||
$_[0] eq 'Twig' ||
$_[0] eq 'Randomizer' ||
0
};
$Appearance = {
'Air' => ' ',
'BigZappy' => 'Z',
'Bubble' => 'o',
'ConveyorLeft' => '<',
'ConveyorRight' => '>',
'DuctTape' => 'D',
'Earth' => '#',
'Fire' => '%',
'Fish' => 'f',
'Magma' => '&',
'OnePebble' => '.',
'Randomizer' => '?',
'Smoke' => '@',
'Spark' => '*',
'Steam' => 's',
'Tail' => '-',
'Torch' => 'T',
'Twig' => 'l',
'TwoPebble' => ':',
'UnravelTape' => 'O',
'Water' => '~',
'Wire' => '=',
'Zappy' => 'z',
};
$InputCodec = {
' ' => 'Air',
'Z' => 'BigZappy',
'o' => 'Bubble',
'<' => 'ConveyorLeft',
'>' => 'ConveyorRight',
'D' => 'DuctTape',
'#' => 'Earth',
'%' => 'Fire',
'f' => 'Fish',
'&' => 'Magma',
'.' => 'OnePebble',
'?' => 'Randomizer',
'@' => 'Smoke',
'*' => 'Spark',
's' => 'Steam',
'-' => 'Tail',
'T' => 'Torch',
'l' => 'Twig',
':' => 'TwoPebble',
'O' => 'UnravelTape',
'~' => 'Water',
'=' => 'Wire',
'z' => 'Zappy',
};
$StateRule = {
'Air' => \&main::AirStateRules,
'BigZappy' => \&main::BigZappyStateRules,
'Bubble' => \&main::BubbleStateRules,
'ConveyorLeft' => \&main::ConveyorLeftStateRules,
'ConveyorRight' => \&main::ConveyorRightStateRules,
'DuctTape' => \&main::DuctTapeStateRules,
'Earth' => \&main::EarthStateRules,
'Fire' => \&main::FireStateRules,
'Fish' => \&main::FishStateRules,
'Magma' => \&main::MagmaStateRules,
'OnePebble' => \&main::OnePebbleStateRules,
'Randomizer' => \&main::RandomizerStateRules,
'Smoke' => \&main::SmokeStateRules,
'Spark' => \&main::SparkStateRules,
'Steam' => \&main::SteamStateRules,
'Tail' => \&main::TailStateRules,
'Torch' => \&main::TorchStateRules,
'Twig' => \&main::TwigStateRules,
'TwoPebble' => \&main::TwoPebbleStateRules,
'UnravelTape' => \&main::UnravelTapeStateRules,
'Water' => \&main::WaterStateRules,
'Wire' => \&main::WireStateRules,
'Zappy' => \&main::ZappyStateRules,
};
load_playfield($ARGV[0]);
display_playfield();
while (!$done)
{
process_playfield();
display_playfield();
}
exit(0);
### END ###