git @ Cat's Eye Technologies REDGREEN / master script / redgreen.pl
master

Tree @master (Download .tar.gz)

redgreen.pl @masterraw · history · blame

#!/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 ###