X-Git-Url: http://git.shiar.nl/sheet.git/blobdiff_plain/bd7288335390bc941dde7a1ad728bc0000d8386a..1fcc0d8d5a8c54a917c862ffea4bd41a723360ad:/sc.plp diff --git a/sc.plp b/sc.plp index 873c75b..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], }); :> @@ -192,8 +198,10 @@ 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; } @@ -209,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 $_; @@ -225,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; } @@ -237,16 +250,62 @@ 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'; + sub showunitcols { + my ($row) = @_; + local $_ = $row; + $_->{hp} += $_->{shield} if $_->{shield}; + my $suitchar = ''; + if ($_->{suit}) { + $suitchar = [qw/? s m l/]->[$_->{suit}]; + } + + return ( + '' . ($_->{min} // ''), + '' . ($_->{gas} || ''), + !defined $_->{build} ? '' : sprintf('%s%.0f', + !!$_->{base} && '+', + $_->{build} || '0', + ), + !$suitchar ? '' : sprintf('%s', $suitchar, ucfirst $suitchar), + '' . join('', + defined $_->{unit} && $_->{unit} == .5 ? '½' : $_->{unit}, + defined $_->{organic} && sprintf( + '%s', + $_->{organic} ? 'o' : 'u', + $_->{organic} ? 'organic' : 'mechanic', + $_->{organic} ? 'o' : 'm', + ), + ), + '' . $_->{hp} // '', + '' . ( + $_->{shield} ? sprintf('%.0f%%', 100 * $_->{shield} / $_->{hp}) : ' ' + ), + '' . showrange($_, 'armor'), + showattack($_, 'ground'), + showattack($_, 'air'), + '' . showrange($_, 'attack', 'range'), + '' . sprintf( + $_->{detect} ? '%s' : '%s', + showrange($_, 'sight') + ), + '' . showrange($_, 'speed'), + '' . showmagic($_), + "\n" + ); + } + + my $units = do $datafile; die "Cannot open unit data: $_\n" for $@ || $! || (); my $grouped = !exists $get{order}; if (exists $get{order}) { @@ -269,55 +328,17 @@ sub showrange { printf '

%s

'."\n", $race, ucfirst $race if $grouped and $race ne $_->{race}; $_->{cat} = $_->{race} if not $grouped; - my $suitchar = [qw/? s m l/]->[$_->{suit}]; print( '', sprintf('%s', $cat ne $_->{cat} ? ('h', $cat = $_->{cat}) : ('d', ' ')), '' . $_->{name}, - '' . ($_->{min} || '0'), - '' . ($_->{gas} || ''), - sprintf('%s%.0f', - !!$_->{base} && '+', - $_->{build} || '0', - ), - sprintf('%s', $suitchar, ucfirst $suitchar), - '' . join('', - $_->{unit} ? $_->{unit} == .5 ? '½' : $_->{unit} : ' ', - defined $_->{organic} && sprintf( - '%s', - $_->{organic} ? 'o' : 'u', - $_->{organic} ? 'organic' : 'mechanic', - $_->{organic} ? 'o' : 'm', - ), - ), - '' . $_->{hp}, - '' . ($_->{shield} ? $_->{shield}.'%' : ' '), - '' . showrange($_, 'armor'), - showattack($_, 'ground'), - showattack($_, 'air'), - '' . showrange($_, 'attack', 'range'), - '' . sprintf( - $_->{detect} ? '%s' : '%s', - showrange($_, 'sight') - ), - '' . showrange($_, 'speed'), - '' . showmagic($_), - "\n" + 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), ); } }