The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#! /usr/bin/perl
# vim: sw=4 et nowrap

my $GENERATE;

use lib 't/lib';
use Test::NetHack::FOV::Compare 'compare';

BEGIN {
    $GENERATE = (@ARGV == 1 && $ARGV[0] eq '-regenerate') ? 1 : 0;

    if ($GENERATE) {
        require Test::NetHack::FOV::Real;
        Test::NetHack::FOV::Real->import('calculate_fov');
    } else {
        require NetHack::FOV;
        NetHack::FOV->import('calculate_fov');
        require Test::More;
        Test::More->import(tests => 352);
    }
}


my @textmap =
('                                                                                '
,'                                                                                '
,'                                                     ###########                '
,'             ##############                        #############                '
,'             ################      #########     ###        #                   '
,'             ############## ################     #          #####               '
,'                     #  #   #      ###############              #               '
,'              ########  # ##################                    ###             '
,'              #       ### # #      #########                      #             '
,'            ###       # #####          #                          ##            '
,'            #       ### # # #         ##                           #            '
,'          ###       # ##### #         #                    ##############       '
,'          #  ######## # #   #  ########                    ##############       '
,'          #  #      #####   #  #                           ##############       '
,'          ########  # #     ########                       ##############       '
,'          ########### #       ######                                            '
,'          ########            ######                                            '
,'          ########                                                              '
,'          ########                                                              '
,'                                                                                '
,'                                                                                '
);

my @map;

for my $y (0 .. 20) {
    for my $x (0 .. 79) {
        $map[$x][$y] = substr($textmap[$y], $x, 1) eq '#' ? 0 : 1;
    }
}

sub cb {
    my ($x,$y) = @_;

    return $x >= 0 && $y >= 0 && $x < 80 && $y < 21 && !$map[$x][$y];
}

my @floor;
my @maybevis;

for my $y (0 .. 20) {
    TILE:for my $x (0 .. 79) {
        push @floor, [$x,$y] if !$map[$x][$y];

        my $couldsee;
        for ([-1,-1],[-1,0],[-1,1],[0,-1],[0,0],[0,1],[1,-1],[1,0],[1,1]) {
            $couldsee ||= !$map[$_->[0]+$x][$_->[1]+$y];
        }

        push @maybevis, [$x,$y] if $couldsee;
    }
}

for my $xy (@floor) {
    my $mp;
    my $AoA = calculate_fov(@$xy, \&cb);

    if ($GENERATE) {

        for my $i (0 .. (@maybevis - 1)) {
            vec($mp, $i, 1) = $AoA->[$maybevis[$i][0]][$maybevis[$i][1]];
        }
        print $mp;

    } else {

        read DATA, $mp, (@maybevis + 7) / 8;
        my $AoAr = [];
        for my $i (0 .. (@maybevis - 1)) {
            $AoAr->[$maybevis[$i][0]][$maybevis[$i][1]] = vec($mp, $i, 1);
        }

        compare(\@map, $xy->[0], $xy->[1], $AoA, $AoAr);

    }
}

close DATA unless $GENERATE;

__DATA__
üøÿüÿðx `üøÿþÿðxüøÿþÿ° üøÿþÿ¸(üøÿþÿ¸ÿ(üøÿþÿ€ÿüøÿþÿ€ÿüøÿþÿ€ÿüøÿþÿ€ÿüøÿþÿ€ÿüøÿþÿ€ÿþÿüÿüÿ€ÿþÛþÿüÿüÿ€ÿþÛþÿüÿüÿ€ÿþÛþÿüÿüÿ€ÿþßþÿüÿüÿ€ÿþßþÿüÿüÿ€ÿþßþÿüÿüÿ€ÿþÿ˜þÿüÿüÿ€ÿþÿ˜þÿüÿüÿ€ÿþÿ˜þÿüÿüÿ€ÿþÿ=ÈFþÿüÿüÿ€ÿþÿ=Ìgþÿüÿüÿ€ÿþÿäcÀ8`pþÿüÿüÿ€ÿÿþÿd#@þÿüÿüÿ€ÿÿþÿ`ðîÿþÿðø `øþÿþÿøxüþÿþÿ¸(üþÿþÿ€üþÿþÿ€üþÿþÿ€üþÿþÿ€üþÿþÿ€üþÿþÿ€ÿüþÿþÿ€ÿüþÿþÿ€ÿüþÿþÿ€üþÿþÿ€þÿüÿüÿ€ÿþÛþÿüÿüÿ€ÿþÛþÿüÿüÿ€ÿþÛþÿüÿüÿ€ÿþÛþÿüÿüÿ€ÿþÛþÿüÿüÿ€ÿþßþÿüÿüÿ€ÿþßþÿüÿüÿ€ÿþßþÿüÿüÿ€ÿþÿ˜þÿüÿüÿ€ÿþÿŒþÿüÿüÿ€ÿþÿÄcþÿüÿüÿ€ÿþÿà`À8`pþÿüÿüÿ€ÿþû` þÿüÿüÿ€ÿþû} þÿüÿüÿ€ÿÿþû> þüÿüÿ€ÿßþ[à€€€ðÿðÿàÿþ€ÿüðÿøÿðÿÿ?€ÿü€ðÿüÿøÿÿ?€ÿü€ðÿþÿüÿÿ?€ÿü€ðÿÿÿüÿ€ÿàÿü€ðÿ€ÿÿüÿ€ÿàÿü€ðÿÀÿÿýÿ€ÿàÿü€ðÿÀÿÿýÿ€ÿàÿüÀðÿÀÿÿýÿ€ÿàÿü@€ðè€{øøÀÀøü€?øø`àx~€øèà€ÿ>Àþÿüÿüÿ€ÿþÛþÿüÿüÿ€ÿþÛþÿüÿüÿ€ÿþÛþÿüÿüÿ€ÿþÛþÿüÿüÿ€ÿþÛþÿüÿüÿ€ÿþÛþÿüÿüÿ€ÿþÛþÿüÿüÿ€ÿþßþÿüÿüÿ€ÿþßþÿüÿüÿ€ÿþßþÿüÿüÿ€ÿþûÀ@þÿüÿüÿ€ÿþûà`À8`pþÿüÿüÿ€ÿþû`þÿüÿüÿ€ÿþÛðÀxÿÀÿÿÿÀÿüà€€€þø|€ÿÁÀÿÿÿàÿüÀÿ~ÀûáÀÿÿýðÿüøñÀÿÿýøÿü€øùÀÿÿýüÿ€ÿÀøýÀÿÿýþÿðÿààøÿÀÿÿýÿÿþÿþððøÿÀÿÿýÿÿþÿ€ÿüðøÿÀÿÿýÿÿÿÿ€ÿüðøÿÀÿÿýÿÿ€ÿÿàÿü€ðøÿÀÿÿýÿÿ€ÿÿàÿü€ðøÿÀÿÿýÿ€ÿÿàÿü€ðøÿÀÿÿýÿ?Àÿÿðÿü€ðøÿÀÿÿýÿÀÿðÿüÀðøÿÀÿÿýÿÀÿ?ðÿü@€ðøÿÀÿÿýÿàÿøÿü@x|€x8ððÀ_ÀÀ_@_@@øÿàÿ€ÿÀ€Àÿÿü>pà`À8`p<ÀÀ à€€€ðÀÿðÿ/€ÿÿ€ÿÿàÿüðàÿøÿ/€ÿÿÀÿÿðÿüððÿüÿ/€ÿÿàÿÿøÿü€ðøÿþÿ/€ÿÿðÿÿüÿü€ðøÿÿÿ/€ÿÿøÿÿüÿü€ðøÿ€ÿÿ/€ÿÿüÿÿüÿü€ðøÿÀÿÿ/€ÿÿþÿÿýÿüÀ€ðøÿÀÿÿ/€ÿÿÿÿÿýÿü@ðøÿÀÿÿ/€ÿÿ€ÿÿÿ@ýÿü@ð?øÿÀÿÿ/€ÿÿ€ÿÿÿ@ýÿüðøÀÿ¿/€ÿÿ€ÿÿý@ý?|ðøÀÿŸ/€ÿÿ€ÿÿü@ý<øÀÿ/€ÿÿ€ÿü@ýø0Àÿ‡?€ÿÿ€ÿ?ü@ý€øÀÿƒ?€ÿÿ€ÿü@ýxp|€ üøü`€üøü0€üøôüøôüøôüøôøðpüøôüøô@øààpàxЀ8`p€/Àýÿ€ÿÿÀý@0à€€/Àÿ€ÿ€ÿÿÀÿ€`À€/ÀÿÀÿ€ÿÿ@ÿÀà€€€À€/Àÿàÿ€ÿÿ@ÿà€€/Àýðÿ€ÿÿ@ýð€/Àýøÿ€ÿÿ@ýø@ð/Àýüÿ€ÿÿ@ýü`|Àþ/Àýþÿ€ÿÿ@ýþpÀüÀÿ/Àýÿÿ€ÿÿ@ýÿxðÿÀÿ/Àýÿÿ€ÿÿ@ýÿ|ðÿàÿ/Àýÿÿ€ÿÿ@ýÿüðÀÿðÿ/Àýÿÿ€ÿÿ@ýÿüðÀÿðÿ/Àýÿÿ€ÿÿ@ýÿü€ðÀÿðÿÀýÿ€ÿÿ@ýÿü€ðàÿøÿÀýÿ?€ÿÿ@ýÿüÀðàÿøÿÀýÿ€ÿÿ@ýÿü@€ðàÿøÿÀýÿ€ÿÿ@ýÿüððÿüÿÀýÿ€ÿÿ@ýÿ|`ð>\0ð>|À0ÀÀ0€Ð>|`|xxà €€¼|î`€€€`ð|þ°€(`øà@pð|zÀ$8`pÀ€ÀðÀ²èÀÀÀè €€ðÿÀÿàÿ€ÿ€ÿ|ðÿàÿðÿÀÿ€ÿ|ðÿàÿøÿàÿ€ÿ|ðÿàÿüÿðÿ€ÿü€ðÀÿðÿüÿøÿ€ÿü€ðÀÿðÿüÿüÿ€ÿüÀ€ðÀÿðÿ€ýÿþÿ€ÿ|ðÀÿðÿÀýÿÿÿ€ÿ|ðÀÿðÿÀýÿ€ÿÿ€ÿ|ð<pà0`À8À|àÀ€80|à`€| @ð<xà€€	€p@@pðxøÀ8`ppüøÀ6ÈÀ°Üø@0àÀ€
Àø@Ø`À@ø@à€€€ðÿàÿ€ÿþ|Àà€À0ðà0ÀÀð€Àðàppü0 <àðà@€|àëÀ0€|à€=€Q00€| >H€p@@pààxÀþdtÀ
°	øð<øÀ€ÀÀà€€€x€ðàÀ0àà€Àø8pàà€Àðà|þ€ÿüÿðÿ¸øàÀÀÀ€8€øøàÀ@øø  €<àÀÀÀ0€x€?î€D€7ü€?þldp@@pà`€Ü€?ú`p0ØÀ€?ú00À€À@@€?êÀà€€€|À8``0àà€€þûøÿðÿðÿþÿðÿþûøÿðÿðÿþÿðÿþûøÿðÿðÿþÿðÿþûøÿðÿðÿþÿðÿþûøÿðÿðÿþÿðÿþûøÿðÿðÿþÿðÿþûøÿðÿðÿþÿðÿÀ€þÿøÿðÿðÿþÿðÿÀ€þÿøÿðÿðÿþÿðÿÀpÀþÿøÿðÿðÿþÿðÿþûøÿðÿðÿþÿðÿþûøÿðÿðÿþÿðÿþûøÿðÿðÿþÿðÿþûøÿðÿðÿþÿðÿøxàÀÀ8À€x€`à¿ÿþÀ>à€¿ÿþpÀ€8€€¿ÿú€¿ÿú€¿ÿú€¿ÿú=t€ÿÿú€€€ÿÿúÀ0L.à€> €p@@pà`€›ø8x|€Àà€€€ÿüüàÀ>ÿüü0`ÿüôÿüôÿüôÿüôx€0`À0ÀÀÿüô``ÿüôþûøÿðÿðÿþÿðÿþûøÿðÿðÿþÿðÿþûøÿðÿðÿþÿðÿþûøÿðÿðÿþÿðÿþûøÿðÿðÿþÿðÿþÿøÿðÿðÿþÿðÿþÿøÿðÿðÿþÿðÿÀ€þÿøÿðÿðÿþÿðÿÀ€þÿøÿðÿðÿþÿðÿÀ`Àþÿøÿðÿðÿþÿðÿ@0@þÿøÿðÿðÿþÿðÿþÿøÿðÿðÿþÿðÿþûøÿðÿðÿþÿðÿþûøÿðÿðÿþÿðÿ8àÀÀøÀ?€ÿøŸÿ€øÀÿ€ÿøŸÿ€øÀ+wÀD|à/`€0`¾ð.}€€
>}€p@@pà`À:uÀà€€€ü€ø<>ðàþþûøÿðÿðÿþÿðÿþûøÿðÿðÿþÿðÿþûøÿðÿðÿþÿðÿþÿøÿðÿðÿþÿðÿþÿøÿðÿðÿþÿðÿþÿøÿðÿðÿþÿðÿÀ€þÿøÿðÿðÿþÿðÿÀ€þÿøÿðÿðÿþÿðÿÀ€þÿøÿðÿðÿþÿðÿ@€þÿøÿðÿðÿþÿðÿÀpÀþÿøÿðÿðÿþÿðÿ@þÿøÿðÿðÿþÿðÿ@þÿøÿðÿðÿþÿðÿþÿøÿðÿðÿþÿðÿ8àÀûÀÿøÿÀÿ€ÿøŸÿ`ÀûÀÿøÿÀÿ€ÿøŸÿ€@ÿÀÿøÿÀÿ€ÿøŸÿ€@ÿÀÿøÿÀÿ€ÿøŸÿ@À@ÿÀÿøÿÀÿ€ÿøŸÿ@ûÀÿøÿÀÿ€ÿøŸÿ@ûÀÿøÀÿ€ÿøŸÿ@ûÀÿø?Àÿ€ÿøŸÿ€Làð€0`¸	À?>€Àà€€÷€ÿÜà €€÷€ÿüÀü€þ€ÿüàþ€þ€ÿüàþ€þ€ÿüàþ€ö€ÿüàþ€ö€ÿüàþ€ö€ÿüàþþûøÿðÿðÿþÿðÿþÿøÿðÿðÿþÿðÿþÿøÿðÿðÿþÿðÿþÿøÿðÿðÿþÿðÿþÿøÿðÿðÿþÿðÿþÿøÿðÿðÿþÿðÿÀ€þÿøÿðÿðÿþÿðÿÀ€þÿøÿðÿðÿþÿðÿÀ€þÿøÿðÿðÿþÿðÿ@€þÿøÿðÿðÿþÿðÿÀ`Àþÿøÿðÿðÿþÿðÿ@0@þÿøÿðÿðÿþÿðÿ@þÿøÿðÿðÿþÿðÿ@þÿøÿðÿðÿþÿðÿ8àÀÿÀÿøÿÀÿ€ÿøŸÿ`ÀÿÀÿøÿÀÿ€ÿøŸÿ€ ÀÿÀÿøÿÀÿ€ÿøŸÿ€ ÀÿÀÿøÿÀÿ€ÿøŸÿ€@ÿÀÿøÿÀÿ€ÿøŸÿ@ÿÀÿøÿÀÿ€ÿøŸÿ@ÿÀÿøÿÀÿ€ÿøŸÿ@ûÀÿøÿÀÿ€ÿøŸÿ@{ÀÿøÿÀÿ€ÿø‡@;À¿øÿÀ¿€x€€à@ÀŸøÿÀŸ€0`€€€€ÿÿðàþ€€ÿ€ÿðàþ€þ€ÿðàþ€þ€ÿðàþ€þ€ÿðàþ€ö€ÿðàþ8àÀÿÀÿøÿÀÿ€ÿøŸÿ˜`ÀÿÀÿøÿÀÿ€ÿøŸÿˆ`ÀÿÀÿøÿÀÿ€ÿøŸÿ€ ÀÿÀÿøÿÀÿ€ÿøŸÿ€ ÀÿÀÿøÿÀÿ€ÿøŸÿ@À ÀÿÀÿøÿÀÿ€ÿøŸÿ@ÿÀÿøÀÿ€ÿøŸÿ@ÿÀÿø?Àÿ€ÿøŸÿþüðàþþþðàþ€€ÿÿðàþ€€ÿÿðàþþÿðàþ€þ€ÿðàþ8àÀÿÀÿøÀÿ€ÿøŸÿ˜`ÀÿÀÿøÀÿ€ÿøŸÿˆ`ÀÿÀÿøÀÿ€ÿøŸÿ€ ÀÿÀÿø?Àÿ€ÿøŸÿ€ ÀÿÀÿø?Àÿ€ÿøŸÿ€ ÀÿÀÿø?Àÿ€ÿøŸÿ ÀÿÀÿøÀÿ€ÿøŸÿ ÀÿÀÿøÀÿ€ÿøŸÿ8˜àÀÿÀÿø?Àÿ€ÿøŸÿ˜`ÀÿÀÿø?Àÿ€ÿøŸÿˆ`ÀÿÀÿø?Àÿ€ÿøŸÿˆ`ÀÿÀÿø?Àÿ€ÿøŸÿ€ ÀÿÀÿøÀÿ€ÿøŸÿ€ ÀÿÀÿøÀÿ€ÿøŸÿ@À ÀÿÀÿøÀÿ€ÿøŸÿ ÀÿÀÿøÀÿ€ÿøŸÿ