X-Git-Url: http://git.shiar.net/sheet.git/blobdiff_plain/bd7288335390bc941dde7a1ad728bc0000d8386a..eb359bb699fd2bb415141e773d8c260cdfd23810:/sc.plp diff --git a/sc.plp b/sc.plp index 873c75b..0426b6e 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], }); :> @@ -102,6 +108,9 @@ Unit properties as seen or measured in Brood War .unit-magic { padding-left: 0.5em; } + .magic-perma { + text-decoration: underline; + } .units .val { text-align: right; @@ -192,8 +201,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 +220,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 +241,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; } @@ -233,20 +249,67 @@ sub showrange { my ($row) = @_; my $specials = $row->{special} or return ''; return join ' ', map { - sprintf '%s', + sprintf '%s', + $_->{duration} < 0 && ' class="magic-perma"', 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}; + } + + 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 'sc-units.inc.pl'; + my $units = do $datafile; die "Cannot open unit data: $_\n" for $@ || $! || (); my $grouped = !exists $get{order}; if (exists $get{order}) { @@ -269,55 +332,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), ); } } @@ -370,7 +395,7 @@ sub showrange {
speed
relative speed of movement (when in full motion, startup speed ignored)
specials -
special abilities +
special abilities are usually casted manually, but some are always active
parentheses () indicate that it needs to be researched first
hover for description
range is maximum range required to activate