#!/usr/local/bin/perl
eval "exec /usr/local/bin/perl -S $0 $*"
    if $running_under_some_shell;
			# this emulates #! processing on NIH machines.
			# (remove #! line above if indigestible)

eval '$'.$1.'$2;' while $ARGV[0] =~ /^([A-Za-z_]+=)(.*)/ && shift;
			# process any FOO=bar switches

#
#                               delta
#
#                written by Ken Stevens for chainsaw 3.0
#
# DESCRIPTION:
# This script reads through your production info and tells you whether you
# have a positive or negative delta on iron, dust, lcm, etc...  If you
# have a negative delta, then the "supply" columb will tell you in how
# many updates you will run out of stock.
# The output looks something like this:
#
#      ----PRODUCTION DELTA REPORT----
#   com    start        +        -    delta      net   supply
# ------------------------------------------------------------
#  food    12304     3996     2572     1423    13727         
#  iron    13398     2997     1795     1202    14600         
#   oil      500        0      207     -207      293        2
#  dust      325        0      134     -134      191        2
#   lcm     4974      586      925     -339     4635       14
#   hcm    10591      586      570       16    10607         
# ------------------------------------------------------------
#  bars      980       20                       1000
#   pet       98        0                         98
# shell     2756      195                       2951
#  guns      304       36                        340
#   civ    36652    10995                      47647
#    uw     2997      449                       3446
#   mil      929      240                       1169
#
# INSTALLATION:
# Before you run this script, make sure that you have typed:
# chmod +x delta
# where delta is the name of this file.
#
# HOW TO RUN IT:
# Set the variable MAX_CIV_PER_SECTOR to what the "nation" command tells you
# your max civs per sector is.  (This variable is set at the top of
# the script, just a few lines below here.)
# Also, set the ETU_PER_UPDATE to what it should be.
#
# If you use eif, then you should just put the following two lines in
# your .eifrc file:
#
# alias del "cen # >!.delta ; com # >>.delta ; prod # >>.delta ; @delta .delta"
# alias cdel "cen # >!.cdelta ; prod # >>.cdelta ; @delta .cdelta"
#
# Then in eif you can type "del" to get your production delta.  The extra
# feature "cdel" tells you approximately how many updates until your civs
# max out.
#
# If you don't use eif, then all I have to say is "you should".  But I
# may be biased, because my cousin wrote it.
#
# BUG REPORTS:
# mail your bug-reports and comments to:
# stevens@math.utoronto.ca

$[ = 1;			# set array base to 1
$, = ' ';		# set output field separator
$\ = "\n";		# set output record separator

$MAX_CIV_PER_SECTOR = 999;
$ETU_PER_UPDATE = 60;

while (<>) {
    chop;	# strip record separator
    @Fld = split(' ', $_, 9999);

    {
	if ($Fld[5] ne '1994' && $Fld[1] ne 'sect') {
	    if ($com) {
		{
		    $ss += substr($_, 34, 4);

		    if (substr($_, 34, 1) ne ' ') {
			$sg += $Fld[5];
			$sp += $Fld[6];
			$si += $Fld[7];
			$sd += $Fld[8];
			$sb += $Fld[9];
			$so += $Fld[10];
			$sl += $Fld[11];
			$sh += $Fld[12];
			$sr += $Fld[13];
		    }
		    else {
			$sg += $Fld[6];
			$sp += $Fld[7];
			$si += $Fld[8];
			$sd += $Fld[9];
			$sb += $Fld[10];
			$so += $Fld[11];
			$sl += $Fld[12];
			$sh += $Fld[13];
			$sr += $Fld[14];
		    }
		}
	    }
	    elsif ($prod) {
		if ($Fld[2] eq 'm') {
		    $i += $Fld[5];
		}
		if ($Fld[2] eq 'g') {
		    $d += $Fld[5];
		}
		if ($Fld[2] eq 'o') {
		    $o += $Fld[5];
		}
		if ($Fld[2] eq '%') {
		    $p += $Fld[5];
		    $oc += &num($Fld[9]);
		}
		if ($Fld[2] eq 'j') {
		    $l += $Fld[5];
		    $ic += &num($Fld[9]);
		}
		if ($Fld[2] eq 'k') {
		    $h += $Fld[5];
		    $ic += &num($Fld[9]);
		}
		if ($Fld[2] eq 'l') {
		    $lc += &num($Fld[9]);
		}
		if ($Fld[2] eq 'b') {
		    $b += $Fld[5];
		    $dc += &num($Fld[9]);
		}
		if ($Fld[2] eq 'i') {
		    $S += $Fld[5];
		    $lc += &num($Fld[9]);
		    $hc += &num($Fld[10]);
		}
		if ($Fld[2] eq 'd') {
		    $g += $Fld[5];
		    $oc += &num($Fld[9]);
		    $lc += &num($Fld[10]);
		    $hc += &num($Fld[11]);
		}
		if ($Fld[2] eq 't') {
		    $dc += &num($Fld[9]);
		    $oc += &num($Fld[10]);
		    $lc += &num($Fld[11]);
		}
		if ($Fld[2] eq 'r') {
		    $dc += &num($Fld[9]);
		    $oc += &num($Fld[10]);
		    $lc += &num($Fld[11]);
		}
		if ($Fld[2] eq 'e') {
		    $M += $Fld[5];
		}
		if ($Fld[2] eq 'a') {
		    $f += &min($Fld[5], 999);
		}
		if ($Fld[2] eq '^') {
		    $mountain += 1;
		}
	    }
	    elsif ($cen) {
		if ($Fld[7] eq '*') {
		    $sc += $Fld[8];
		    $sm += $Fld[9];
		    $su += $Fld[10];
		    if ($Fld[10]) {
			++$uwsectors;
		    }
		    $sf += $Fld[11];
		}
		else {
		    $sc += $Fld[7];
		    $sm += $Fld[8];
		    $su += $Fld[9];
		    if ($Fld[9]) {
			++$uwsectors;
		    }
		    $sf += $Fld[10];
		}
	    }
	}
    }

    if (/CENSUS/) {
	$cen = 1;
	$com = 0;
	$prod = 0;
    }
    if (/COMMODITIES/) {
	$com = 1;
	$cen = 0;
	$prod = 0;
	$do_delta = 1;
    }
    if (/PRODUCTION/) {
	$prod = 1;
	$cen = 0;
	$com = 0;
    }
    if (/sectors/) {
	if ($cen) {
	    $sectors = $Fld[1];
	}
    }
}

if ($do_delta) {
    $c = $sc * 5 * $ETU_PER_UPDATE / 1000;
    $u = $su * 5 * $ETU_PER_UPDATE / 2000;
    $fc += (($sc + $sm + $su) * $ETU_PER_UPDATE / 1000) + (($c + $u) *

      $ETU_PER_UPDATE / 5000);
    print '     ----PRODUCTION DELTA REPORT----';
    printf "%5s %8s %8s %8s %8s %8s %8s\n", 'com', 'start', '+', '-', 'delta',

      'net', 'supply';
    print '------------------------------------------------------------';
    if ($f || $fc) {
	printf "%5s %8d %8d %8d %8d %8d %8s\n", 'food', $sf, $f, $fc,

	  $f - $fc, $sf + $f - $fc, &warn($sf, $f - $fc);
    }
    if ($i || $si) {
	printf "%5s %8d %8d %8d %8d %8d %8s\n", 'iron', $si, $i, $ic,

	  $i - $ic, $si + $i - $ic, &warn($si, $i - $ic);
    }
    if ($o || $so) {
	printf "%5s %8d %8d %8d %8d %8d %8s\n", 'oil', $so, $o, $oc, $o - $oc,

	  $so + $o - $oc, &warn($so, $o - $oc);
    }
    if ($d || $sd) {
	printf "%5s %8d %8d %8d %8d %8d %8s\n", 'dust', $sd, $d, $dc,

	  $d - $dc, $sd + $d - $dc, &warn($sd, $d - $dc);
    }
    if ($l || $sl) {
	printf "%5s %8d %8d %8d %8d %8d %8s\n", 'lcm', $sl, $l, $lc, $l - $lc,

	  $sl + $l - $lc, &warn($sl, $l - $lc);
    }
    if ($h || $sh) {
	printf "%5s %8d %8d %8d %8d %8d %8s\n", 'hcm', $sh, $h, $hc, $h - $hc,

	  $sh + $h - $hc, &warn($sh, $h - $hc);
    }
    print '------------------------------------------------------------';
    if ($b || $sb) {
	printf "%5s %8d %8d %8s %8s %8d\n", 'bars', $sb, $b, '', '', $sb + $b;
    }
    if ($p || $sp) {
	printf "%5s %8d %8d %8s %8s %8d\n", 'pet', $sp, $p, '', '', $sp + $p;
    }
    if ($S || $ss) {
	printf "%5s %8d %8d %8s %8s %8d\n", 'shell', $ss, $S, '', '',

	  $ss + $S;
    }
    if ($g || $sg) {
	printf "%5s %8d %8d %8s %8s %8d\n", 'guns', $sg, $g, '', '', $sg + $g;
    }
    if ($c || $sc) {
	printf "%5s %8d %8d %8s %8s %8d\n", 'civ', $sc, $c, '', '', $sc + $c;
    }
    if ($u || $su) {
	printf "%5s %8d %8d %8s %8s %8d\n", 'uw', $su, $u, '', '', $su + $u;
    }
    if ($M || $sm) {
	printf "%5s %8d %8d %8s %8s %8d\n", 'mil', $sm, $M, '', '', $sm + $M;
    }
}
else {
    $sectors -= $mountains;
    $civmax = $sectors * $MAX_CIV_PER_SECTOR;
    $uwmax = $uwsectors * $MAX_CIV_PER_SECTOR;
    $civ = $sc + $sm;
    $uw = $su;
    $foo = $sf;
    $fprod = $f;
    print '        ----FOOD DELTA REPORT----';
    print '	 start			  food	  food	  food';
    print 'update	  food	   civ	    uw	 eaten	  prod	 delta';
    print '-------------------------------------------------------';
    for ($i = 1; $i <= 20; ++$i) {
	$cbaby = $civ * 5 * $ETU_PER_UPDATE / 1000;
	$ubaby = $uw * 5 * $ETU_PER_UPDATE / 2000;
	$eaten = (($civ + $uw) * $ETU_PER_UPDATE / 1000) + (($cbaby + $ubaby)

	  * $ETU_PER_UPDATE / 5000);
	$delta = $fprod - $eaten;
	printf " %2d:\t%6d\t%6d\t%6d\t%6d\t%6d\t%6d\n", $i, $foo, $civ, $uw,

	  $eaten, $fprod, $delta;
	$foo += $delta;
	$civ += $cbaby;
	if ($civ > $civmax) {	#???
	    $civ = $civmax;
	}
	$uw += $ubaby;
	if ($uw > $uwmax) {	#???
	    $uw = $uwmax;
	}
    }
    printf "Maximum civs for %d sectors: %d\n", $sectors, $civmax;
    printf "Maximum uws for %d sectors: %d\n", $uwsectors, $uwmax;
}

sub num {
    local($str) = @_;
    substr($str, 1, length($str) - 1);
}

sub min {
    local($a, $b) = @_;
    if ($a < $b) {	#???
	return $a;
    }
    $b;
}

sub warn {
    local($start, $delta) = @_;
    if ($delta >= 0) {
	return '';
    }
    int(-$start / $delta) . '';
}
