X-Git-Url: http://git.shiar.nl/sheet.git/blobdiff_plain/b274dda92ace617497bf5866832b46629ba79209..85cf1cbebe994484740a5471565f5859c49106c2:/sc.plp diff --git a/sc.plp b/sc.plp index 26c8a97..5607a9a 100644 --- a/sc.plp +++ b/sc.plp @@ -44,12 +44,12 @@ Unit properties as seen or measured in Brood War } tr.alt td { font-size: 70%; - border-top-style: dashed; + padding-left: 0.5em; } .units tr th:first-child { padding-left: 0; } - .units tr:hover:not(.race) { + .units tbody tr:hover:not(.race) { background: #EEE; } @@ -65,18 +65,10 @@ Unit properties as seen or measured in Brood War .unit-o {color: #C08} /* organic */ .unit-u {color: #44C} /* mechanic */ - img.unit-o, img.unit-u { - margin-left: 0.2em; - vertical-align: middle; - } .unit-composed { color: #C88; font-size: 70%; } - .unit { - text-align: center; - white-space: nowrap; - } .unit.unit-s {color: #770} .unit.unit-m {color: #C70} .unit.unit-l {color: #D22} @@ -108,8 +100,12 @@ Unit properties as seen or measured in Brood War .unit-magic { padding-left: 0.5em; } + .magic-perma { + text-decoration: underline; + } .units .val { + white-space: nowrap; text-align: right; } @@ -125,14 +121,10 @@ Unit properties as seen or measured in Brood War .legend dd { text-indent: -1em; margin-left: 1em; - break-before: avoid; - -webkit-column-break-before: avoid; } - .units, .legend { - display: table-cell; - } .legend { + display: table-cell; min-width: 20em; text-align: left; } @@ -141,9 +133,6 @@ Unit properties as seen or measured in Brood War padding-bottom: 1em; margin-right: 2em; } - .footer { - clear: left; - } <: @@ -175,6 +164,12 @@ sub coltoggle { <: sub showrange { + my ($min, $max) = @_; + $_ = int($_ + .5) for $min, $max; # round halves up + return $min == $max ? $min : "$min-$max"; +} + +sub showval { my ($row, @elements) = @_; my ($min, $max); @@ -209,36 +204,40 @@ sub showrange { $min /= 4; } }} - $_ = int($_ + .5) for $min, $max; # round halves up - - return $min == $max ? $min : "$min-$max"; + return showrange($min, $max); } sub showattack { my ($row, $area) = @_; - local $_ = $row->{attack}->{$area}; - if (not ref $_) { + my $attack = $row->{attack}->{$area}; + if (not ref $attack) { # reference to another area - $area = $_; - $_ = $row->{attack}->{$area}; + $area = $attack; + $attack = $row->{attack}->{$area}; } - return '' unless $_; + return '' unless $attack; my $tagbase = ''; - my $out = showrange($row, 'attack', $area, 'damage'); - $out .= '+' if $_->{splash}; - $out .= '' . showrange($row, 'attack', $area, 'dps'); + my $out = showval($row, 'attack', $area, 'damage'); + $out .= '+' if $attack->{splash}; + $attack->{dps} = $attack->{cooldown} && [ + map { 24 * $_ / $attack->{cooldown} * ($attack->{count} // 1) } + map { ref $_ ? @{$_} : $_ } + $attack->{damage} + #TODO: upgrade (zergling) + ]; + $out .= '' . showval($row, 'attack', $area, 'dps'); return $tagbase . $out; } @@ -246,57 +245,41 @@ 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}; } - 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; + 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; - $_->{hp} += $_->{shield}; - my $suitchar = [qw/? s m l/]->[$_->{suit}]; - 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', $suitchar, ucfirst $suitchar), + !$suitchar ? '' : sprintf('%s', $suitchar, ucfirst $suitchar), '' . join('', - $_->{unit} ? $_->{unit} == .5 ? '½' : $_->{unit} : ' ', + defined $_->{unit} && $_->{unit} == .5 ? '½' : $_->{unit}, defined $_->{organic} && sprintf( '%s', $_->{organic} ? 'o' : 'u', @@ -304,36 +287,68 @@ sub showrange { $_->{organic} ? 'o' : 'm', ), ), - '' . $_->{hp}, + '' . $_->{hp} // '', '' . ( $_->{shield} ? sprintf('%.0f%%', 100 * $_->{shield} / $_->{hp}) : ' ' ), - '' . showrange($_, 'armor'), + '' . showval($_, 'armor'), showattack($_, 'ground'), showattack($_, 'air'), - '' . showrange($_, 'attack', 'range'), + '' . showval($_, 'attack', 'range'), '' . sprintf( $_->{detect} ? '%s' : '%s', - showrange($_, 'sight') + showval($_, 'sight') ), - '' . showrange($_, 'speed'), + '' . showval($_, 'speed'), '' . showmagic($_), "\n" ); + } - for my $alt (grep { $_->{alt} } @{ $_->{special} }) { + my $units = do $datafile; + die "Cannot open unit data: $_\n" for $@ || $! || (); + my $grouped = 1; # race headers + if (exists $get{order}) { + $grouped = 0; + $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 = @{$units}; + @rows = sort {$a->{order} <=> $b->{order}} @rows unless $grouped; + + my ($race, $cat) = ('', ''); + for (@rows) { + if ($grouped) { + printf '

%s

'."\n", + $race = $_->{race}, ucfirst $race + unless $race eq $_->{race}; + } + else { + $_->{cat} = $_->{race}; + } + + print( + '', + sprintf('%s', + $cat ne $_->{cat} ? ('h', $cat = $_->{cat}) : ('d', ' ') + ), + '' . $_->{name}, + showunitcols($_), + ); + + for my $subrow (@{ $_->{special} }) { + $subrow->{alt} or next; 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", + '' . $subrow->{alt}, + showunitcols($subrow), ); } } @@ -371,8 +386,7 @@ sub showrange {
ground/air
damage done per single attack against ground/air units
2nd column indicates relative amount of damage done in - a certain - amount of time + 1 second of fastest game time
splash damage+ hits nearby objects as well
explosive damage does only 50% damage to small units, 75% to medium, 100% to large @@ -386,7 +400,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