1#!/usr/local/bin/perl
2#
3# Call this script with something like 'cmap *', assuming
4#
5# alias cmap "dump ${1:-*} des >! tmp/cmap.dump;
6#    bmdump ${1:-*} x y des >! tmp/cmap.mdump;
7#    ldump ${1:-*} x y fort >! tmp/cmap.ldump;
8#    pdump * ?type=ss x y laun orb >! tmp/cmap.sat;
9#    look * ?type#sb&type#sbc&type#na&type#nm >! tmp/cmap.llook;
10#    llook * >> tmp/cmap.llook;
11#    coast * >! tmp/cmap.coast;
12#    @ /usr/local/lib/eif/cmap.pl"
13#
14# cmap.pl - johans, July 2002
15
16use strict;
17chdir "tmp" || die 'No  tmp  subdir';
18
19my %view;
20my ($minx, $miny, $maxx, $maxy);
21my %land = (
22		'agribusiness', 'a',
23		'airfield', '*',
24		'bank', 'b',
25		'capital', 'c',
26		'defense', 'd',
27		'enlistment', 'e',
28		'fortress', 'f',
29		'gold', 'g',
30		'harbor', 'h',
31		'headquarters', '!',
32		'heavy', 'k',
33		'highway', '+',
34		'library/school', 'l',
35		'light', 'j',
36		'mine', 'm',
37		'mountain', '^',
38		'nuclear', 'n',
39		'oil', 'o',
40		'park', 'p',
41		'plains', '~',
42		'radar', ')',
43		'refinery', '%',
44		'research', 'r',
45		'shell', 'i',
46		'technical', 't',
47		'uranium', 'u',
48		'venture', 'v',
49		'warehouse', 'w',
50		'wilderness', '-',
51		);
52my %colour = (
53		'me', 37,
54		'sea', '34',
55		'sat', '41',
56		'unknown', '32',
57		0, '33',
58		1, '1;31',
59		2, '1;32',
60		3, '1;33',
61		4, '1;34',
62		5, '1;35',
63		6, '1;36',
64		7, '1;37',
65		);
66
67open(CONFIG, '../.cmaprc');
68open(DUMP, 'cmap.dump') || die;
69open(MDUMP, 'cmap.mdump') || die;
70open(LOOK, 'cmap.llook') || die;
71open(LDUMP, 'cmap.ldump') || die;
72open(COAST, 'cmap.coast') || die;
73open(SAT, 'cmap.sat');
74my $init;
75while (<CONFIG>)
76{
77	my ($idx, $val) = /^\s*colour\s+(\S+)\s+(\S+)/;
78	next unless $idx;
79	$colour{$idx} = $val;
80}
81while (<DUMP>)
82{
83	chop;
84	my @line = split / /;
85	next unless /^[0-9-]+ [0-9-]/;
86	my ($x, $y) = @line[0..1];
87	$view{"$x:$y:0"} = $line[2];
88	$view{"$x:$y:1"} = $colour{me};
89}
90while (<MDUMP>)
91{
92	chop;
93	my @line = split / /;
94	next unless /^[0-9-]+ [0-9-]/;
95	my ($x, $y) = @line[0..1];
96	$view{"$x:$y:0"} = $line[2] unless $view{"$x:$y:0"};
97	$view{"$x:$y:1"} = $colour{unknown} unless $view{"$x:$y:1"};
98	$view{"$x:$y:1"} = $colour{sea} if $view{"$x:$y:0"} eq '.';
99	$minx = $x if $x < $minx || !defined($minx);
100	$miny = $y if $y < $miny || !defined($miny);
101	$maxx = $x if $x > $maxx || !defined($maxx);
102	$maxy = $y if $y > $maxy || !defined($maxy);
103}
104print "$minx:$maxx,$miny:$maxy\n";
105while (<LOOK>)
106{
107	my ($n, $p, $d, $x, $y) = /^(\S+).*#(\d+). (\S+).*@ (-?\d+),(-?\d+)/;
108	next if ! $n;
109	$view{"$x:$y:0"} = $land{$d} || '?';
110	$view{"$x:$y:1"} = $colour{$p} || $colour{unknown};
111}
112while (<LDUMP>)
113{
114	my @line = split /\s+/;
115	my ($x, $y) = @line[2..3];
116	$view{"$x:$y:l"} = 1;
117}
118while (<COAST>)
119{
120	my ($c) = /#\s*(\d+)/;
121	my ($x, $y) = / (-?\d+),(-?\d+)$/;
122	next unless $c;
123	$view{"$x:$y:s"} = $colour{$c};
124}
125while (<SAT>)
126{
127	my @line = split /\s+/;
128	next unless $line[3] eq 'Y';
129	my ($x, $y) = @line[1..2];
130	$view{"$x:$y:sat"} = 3;
131	for my $i ($minx .. $maxx)
132	{
133		for my $j ($miny .. $maxy)
134		{
135			$view{"$i:$j:sat"} = 1
136				if ((abs($x - $i) + abs($y - $j) <= 28) &&
137					(abs($y - $j) <= 14));
138		}
139	}
140}
141close CONFIG;
142close DUMP;
143close LOOK;
144close LDUMP;
145close COAST;
146close SAT;
147
148print "    ";
149for (my $i = $minx; $i <= $maxx; $i++)
150{
151	print int(abs($i) / 10) unless ( $i < 0 && $i > -10 );
152	print "-" if ( $i < 0 && $i > -10 );
153}
154print "\n    ";
155for (my $i = $minx; $i <= $maxx; $i++) { print abs($i) % 10; }
156print "\n";
157
158for (my $j = $miny; $j <= $maxy; $j++)
159{
160	print " " . int(abs($j) / 10) unless ( $j < 0 && $j > -10 );
161	print " -" if ( $j < 0 && $j > -10 );
162	print abs($j) % 10 . " ";
163	for (my $i = $minx; $i <= $maxx; $i++)
164	{
165		my $p = $view{"$i:$j:0"} || ' ';
166		my $l = $view{"$i:$j:l"};
167		my $c = $view{"$i:$j:1"};
168		my $s = $view{"$i:$j:s"};
169		my $sat = $view{"$i:$j:sat"};
170		$p = "[${s}ms" if $s;
171		if ($s) {
172			print "[${s}ms";
173		} elsif ($c) {
174			print $l
175				? "[${c};${l}m$p"
176				: "[${c}m$p"
177		} elsif ($sat) {
178			print "[${colour{sat}}m$p";
179		} else {
180			print $p;
181		}
182	}
183	print " " . int(abs($j) / 10) unless ( $j < 0 && $j > -10 );
184	print " -" if ( $j < 0 && $j > -10 );
185	print abs($j) % 10 . "\n";
186}
187
188print "    ";
189for (my $i = $minx; $i <= $maxx; $i++)
190{
191	print int(abs($i) / 10) unless ( $i < 0 && $i > -10 );
192	print "-" if ( $i < 0 && $i > -10 );
193}
194print "\n    ";
195for (my $i = $minx; $i <= $maxx; $i++) { print abs($i) % 10; }
196print "\n";
197