(common.inc.plp)><: Html({ title => 'starcraft unit cheat sheet', version => 'v1.0', description => [ 'Reference of StarCraft unit properties,' . ' comparing various statistics of all the units in Brood War' . ' including costs, damage, defense, speed, ranges, and abilities.', ], keywords => [qw' starcraft game unit statistics stats comparison table sheet cheat reference software attributes properties '], stylesheet => [qw'light'], }); :>
Unit properties as seen or measured in Brood War version≥1.08.
<: sub coltoggle { my ($name, $id) = @_; return sprintf( (defined $get{order} ? $get{order} eq $id : !$id) ? '%2$s ▼' : '%s', $id && "order=$id", $name ); } :><:= coltoggle('name', '') :> | <:= coltoggle(qw'build cost') :> | <:= coltoggle(qw'size size') :> | HP | shield | armor | ground | air | range | sight | speed | specials | ' unless $_; my $tagbase = ' | '; my $out = showrange($row, 'attack', $area, 'damage'); $out .= '+' if $_->{splash}; $out .= ' | ' . showrange($row, 'attack', $area, 'cmp'); return $tagbase . $out; } sub showmagic { my ($row) = @_; my $specials = $row->{special} or return ''; return join ' ', map { sprintf '%s', join('', $_->{name}, $_->{desc} ? ": $_->{desc}" : '', $_->{range} ? sprintf(' (%s)', join ', ', "range $_->{range}", # "cost $_->{cost}", ) : '', ), $_->{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; } } 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( ' | ||||||||||||||||||||||||||
' . $_->{name}, ' | ' . ($_->{min} || '0'), ' | ' . ($_->{gas} || ''), ' | ' . sprintf('%.0f', $_->{build} || '0'), sprintf(' | %s', $sizechar, ucfirst $sizechar), ' | ' . 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" ); 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", ); } } :> |
When two values are given (1-2), second value indicates attribute after all possible upgrades.