X-Git-Url: http://git.shiar.nl/sheet.git/blobdiff_plain/1cb822295129412ecabcac689b469a35d619724a..1de61e5745ecf3dd1a41e1e932bae2f7568353a4:/sc.plp diff --git a/sc.plp b/sc.plp index 0426b6e..55dbd09 100644 --- a/sc.plp +++ b/sc.plp @@ -1,9 +1,10 @@ <(common.inc.plp)><: -my $datafile = 'sc-units.inc.pl'; +my $scver = 'bw'; if ($ENV{PATH_INFO} and $ENV{PATH_INFO} eq '/2') { - $datafile = 'sc2-units.inc.pl'; + my $scver = 'hots'; } +my $datafile = "sc-units-$scver.inc.pl"; Html({ title => 'starcraft unit cheat sheet', @@ -18,6 +19,7 @@ Html({ reference software attributes properties '], stylesheet => [qw'light'], + raw => '', data => [$datafile], }); @@ -29,126 +31,6 @@ Unit properties as seen or measured in Brood War version≥1.08.

- - <: sub coltoggle { my ($name, $id) = @_; @@ -178,6 +60,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); @@ -212,36 +100,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; } @@ -295,15 +187,15 @@ sub showrange { '' . ( $_->{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" ); @@ -311,8 +203,9 @@ sub showrange { my $units = do $datafile; die "Cannot open unit data: $_\n" for $@ || $! || (); - my $grouped = !exists $get{order}; + 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; @@ -324,25 +217,32 @@ sub showrange { $units->[$_]->{order} = $_ for 0 .. $#$units; } } - my @rows = $grouped ? @$units : sort {$a->{order} <=> $b->{order}} @$units; + my @rows = @{$units}; + @rows = sort {$a->{order} <=> $b->{order}} @rows unless $grouped; my ($race, $cat) = ('', ''); for (@rows) { - $race = $_->{race}, - printf '

%s

'."\n", $race, ucfirst $race - if $grouped and $race ne $_->{race}; - $_->{cat} = $_->{race} if not $grouped; + 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}, + '', $cat ne $_->{cat} && ($cat = $_->{cat}), + '', $_->{name}, showunitcols($_), ); - for my $alt (grep { $_->{alt} } @{ $_->{special} }) { + for my $subrow (@{ $_->{special} }) { + $subrow->{alt} or next; print( - '' . $alt->{alt}, - showunitcols($alt), + '', $subrow->{alt}, + showunitcols($subrow), ); } } @@ -380,8 +280,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