X-Git-Url: http://git.shiar.nl/sheet.git/blobdiff_plain/cb3850e29734fed8bdf97c0f67433d766d7a9153..1fcc0d8d5a8c54a917c862ffea4bd41a723360ad:/sc.plp diff --git a/sc.plp b/sc.plp index e5f528f..b14e04f 100644 --- a/sc.plp +++ b/sc.plp @@ -1,5 +1,10 @@ <(common.inc.plp)><: +my $datafile = 'sc-units.inc.pl'; +if ($ENV{PATH_INFO} and $ENV{PATH_INFO} eq '/2') { + $datafile = 'sc2-units.inc.pl'; +} + Html({ title => 'starcraft unit cheat sheet', version => 'v1.0', @@ -13,6 +18,7 @@ Html({ reference software attributes properties '], stylesheet => [qw'light'], + data => [$datafile], }); :> @@ -127,10 +133,17 @@ Unit properties as seen or measured in Brood War display: table-cell; } .legend { - min-width: 15em; - padding-left: 2em; + min-width: 20em; text-align: left; } + .units { + float: left; + padding-bottom: 1em; + margin-right: 2em; + } + .footer { + clear: left; + } <: @@ -185,16 +198,18 @@ sub showrange { } } - if ($elements[0] eq 'attack' and $elements[1] ne 'range' and $elements[2] eq 'cmp') {{ - my $type = $row->{$elements[0]}->{$elements[1]}->{type} or next; + if ($elements[0] eq 'attack' and $elements[1] ne 'range' and $elements[2] eq 'dps') {{ + my $attack = $row->{ $elements[0] }->{ $elements[1] }; + ref $attack or $attack = $row->{ $elements[0] }->{$attack}; # follow + my $type = $attack->{type} or next; if ($type eq 'explosive') { $min /= 2; } elsif ($type eq 'implosive') { $min /= 4; } - $min = int($min + .5); # round halves up }} + $_ = int($_ + .5) for $min, $max; # round halves up return $min == $max ? $min : "$min-$max"; } @@ -202,6 +217,11 @@ sub showrange { sub showattack { my ($row, $area) = @_; local $_ = $row->{attack}->{$area}; + if (not ref $_) { + # reference to another area + $area = $_; + $_ = $row->{attack}->{$area}; + } return '' unless $_; @@ -218,7 +238,7 @@ sub showrange { my $out = showrange($row, 'attack', $area, 'damage'); $out .= '+' if $_->{splash}; - $out .= '' . showrange($row, 'attack', $area, 'cmp'); + $out .= '' . showrange($row, 'attack', $area, 'dps'); return $tagbase . $out; } @@ -230,52 +250,36 @@ sub showrange { join('', $_->{name}, $_->{desc} ? ": $_->{desc}" : '', - $_->{range} ? sprintf(' (%s)', join ', ', - "range $_->{range}", -# "cost $_->{cost}", + $_->{range} || $_->{cost} ? sprintf(' (%s)', join ', ', + $_->{range} ? "range $_->{range}" : (), + $_->{cost} ? sprintf('cost %.0f%%', + 100 * $_->{cost} / $row->{energy} + ) : (), ) : '', ), - $_->{abbr}, - } @$specials; + sprintf($_->{build} ? '(%s)' : '%s', $_->{abbr}), + } grep { defined $_->{abbr} } @{$specials}; } - my $units = do 'sc-units.inc.pl'; - die "Cannot open unit data: $_\n" for $@ || $! || (); - my $grouped = !exists $get{order}; - if (exists $get{order}) { - $get{order} ||= ''; - if ($get{order} eq 'size') { - $_->{order} = $_->{unit}*8 + $_->{size} + $_->{hp}/512 + $_->{min}/8192 for @$units; - } - elsif ($get{order} eq 'cost') { - $_->{order} = $_->{gas}*1.5 + $_->{min} + $_->{unit}/8 + $_->{build}/256/8 for @$units; - } - else { - $units->[$_]->{order} = $_ for 0 .. $#$units; + sub showunitcols { + my ($row) = @_; + local $_ = $row; + $_->{hp} += $_->{shield} if $_->{shield}; + my $suitchar = ''; + if ($_->{suit}) { + $suitchar = [qw/? s m l/]->[$_->{suit}]; } - } - my @rows = $grouped ? @$units : sort {$a->{order} <=> $b->{order}} @$units; - my ($race, $cat) = ('', ''); - for (@rows) { - $race = $_->{race}, - printf '

%s

'."\n", $race, ucfirst $race - if $grouped and $race ne $_->{race}; - $_->{cat} = $_->{race} if not $grouped; - my $sizechar = [qw/? s m l/]->[$_->{size}]; - print( - '', - sprintf('%s', $cat ne $_->{cat} ? ('h', $cat = $_->{cat}) : ('d', ' ')), - '' . $_->{name}, - '' . ($_->{min} || '0'), + return ( + '' . ($_->{min} // ''), '' . ($_->{gas} || ''), - sprintf('%s%.0f', + !defined $_->{build} ? '' : sprintf('%s%.0f', !!$_->{base} && '+', $_->{build} || '0', ), - sprintf('%s', $sizechar, ucfirst $sizechar), + !$suitchar ? '' : sprintf('%s', $suitchar, ucfirst $suitchar), '' . join('', - $_->{unit} ? $_->{unit} == .5 ? '½' : $_->{unit} : ' ', + defined $_->{unit} && $_->{unit} == .5 ? '½' : $_->{unit}, defined $_->{organic} && sprintf( '%s', $_->{organic} ? 'o' : 'u', @@ -283,8 +287,10 @@ sub showrange { $_->{organic} ? 'o' : 'm', ), ), - '' . $_->{hp}, - '' . ($_->{shield} ? $_->{shield}.'%' : ' '), + '' . $_->{hp} // '', + '' . ( + $_->{shield} ? sprintf('%.0f%%', 100 * $_->{shield} / $_->{hp}) : ' ' + ), '' . showrange($_, 'armor'), showattack($_, 'ground'), showattack($_, 'air'), @@ -297,20 +303,42 @@ sub showrange { '' . showmagic($_), "\n" ); + } + + my $units = do $datafile; + die "Cannot open unit data: $_\n" for $@ || $! || (); + my $grouped = !exists $get{order}; + if (exists $get{order}) { + $get{order} ||= ''; + if ($get{order} eq 'size') { + $_->{order} = $_->{unit}*8 + $_->{suit} + $_->{hp}/512 + $_->{min}/8192 for @$units; + } + elsif ($get{order} eq 'cost') { + $_->{order} = $_->{gas}*1.5 + $_->{min} + $_->{unit}/8 + $_->{build}/256/8 for @$units; + } + else { + $units->[$_]->{order} = $_ for 0 .. $#$units; + } + } + my @rows = $grouped ? @$units : sort {$a->{order} <=> $b->{order}} @$units; + + my ($race, $cat) = ('', ''); + for (@rows) { + $race = $_->{race}, + printf '

%s

'."\n", $race, ucfirst $race + if $grouped and $race ne $_->{race}; + $_->{cat} = $_->{race} if not $grouped; + print( + '', + sprintf('%s', $cat ne $_->{cat} ? ('h', $cat = $_->{cat}) : ('d', ' ')), + '' . $_->{name}, + showunitcols($_), + ); for my $alt (grep { $_->{alt} } @{ $_->{special} }) { print( - '' . $alt->{alt}, - showattack($alt, 'ground'), - showattack($alt, 'air'), - '' . showrange($alt, 'attack', 'range'), - '' . sprintf( - $alt->{detect} ? '%s' : '%s', - showrange($alt, 'sight') - ), - '' . showrange($alt, 'speed'), - '', - "\n", + '' . $alt->{alt}, + showunitcols($alt), ); } }