X-Git-Url: http://git.shiar.nl/sheet.git/blobdiff_plain/81aefba6ac586eccbe18b4e90efc175e34fff5ad..98a8228ac6651509dfe58a871594b5cc22cee553:/sc.plp?ds=sidebyside
diff --git a/sc.plp b/sc.plp
index 0966fc4..e784cbd 100644
--- a/sc.plp
+++ b/sc.plp
@@ -1,28 +1,44 @@
<(common.inc.plp)><:
use List::Util qw(max sum);
-my %scver = (
- id => 'bw',
- name => 'Brood War',
- title => 'starcraft',
- game => 'StarCraft',
- major => 1,
-);
-
-if ($ENV{PATH_INFO} and $ENV{PATH_INFO} eq '/2') {
- %scver = (
- id => 'hots',
+my %scvers = (
+ bw => {
+ name => 'Brood War',
+ title => 'starcraft',
+ game => 'StarCraft BW',
+ major => 1,
+ },
+ hots => {
name => 'Heart of the Swarm',
- title => 'starcraft2',
- game => 'StarCraft II',
+ title => 'starcraft2 hots',
+ game => 'StarCraft II HotS',
major => 2,
- );
+ },
+ lotv => {
+ name => 'Legacy of the Void',
+ title => 'starcraft2 lotv',
+ game => 'StarCraft II LotV',
+ major => 2,
+ },
+ index => 'bw',
+ 1 => 'bw',
+ 2 => 'lotv',
+);
+
+my $requestver = $scvers{$Request ||= 'index'}
+ or Html(), Abort("Requested version $Request
not available", '404 request not found');
+
+if (ref $requestver ne 'HASH') {
+ $header{Location} = "/sc/$requestver";
+ Abort("Canonical URL for $Request is at $requestver", '302 subpage alias');
}
-my $datafile = "sc-units-$scver{id}.inc.pl";
+
+my %scver = %{$requestver};
+my $datafile = "sc-units-$Request";
Html({
title => "$scver{title} unit cheat sheet",
- version => '1.1',
+ version => '1.4',
description => [
"Reference of $scver{game} unit properties,"
. " comparing various statistics of all the units in $scver{name}"
@@ -31,28 +47,29 @@ Html({
keywords => [
qw'
starcraft game unit statistics stats comparison table sheet cheat
- reference software attributes properties
+ reference software attributes properties patch attribute multiplayer
',
- $scver{major} < 2 ? qw' bw broodwar brood war ' : qw' starcraft2 hots ',
+ $scver{major} < 2 ? qw' bw broodwar brood war ' :
+ qw' starcraft2 lotv hots wol ',
],
- stylesheet => [qw'light'],
- raw => '',
- data => [$datafile],
+ stylesheet => [qw( light dark )],
+ raw => '',
+ data => ["$datafile.inc.pl"],
});
-print "
Unit properties as seen or measured in $scver{name}\n$patch.\n"; -print "Also see the $_ table.\n" for join(', ', - ('StarCraft 2: HotS') x ($scver{major} < 2), - ('original SC: Brood War') x ($scver{major} > 1), +say "
Unit properties as seen or measured in $scver{name}\n$patch."; +say "Also see the $_ tables." for join(' and ', + (showlink('StarCraft 2: LotV', '/sc/lotv')) x ($Request ne 'lotv'), + (showlink( 'HotS', '/sc/hots')) x ($Request ne 'hots'), + (showlink('original SC: Brood War', '/sc/bw')) x ($Request ne 'bw'), ); -print "
\n\n"; +say "\n"; sub addupgrade { my ($ref, $increase, $org) = @_; @@ -85,29 +102,27 @@ for my $unit (@{$units}) { sub coltoggle { my ($name, $id, $nolink) = @_; - return sprintf( - (defined $get{order} ? $get{order} eq $id : !$id) ? '%2$s â¼' - : $nolink ? '%2$s' : '%s', - $id && "order=$id", $name - ); + return "$name â¼" if defined $get{order} ? $get{order} eq $id : !$id; + return $name if $nolink; + return showlink($name, '?'.($id && "order=$id")); } :>- | <:= coltoggle('name', '') :> | -cost | -gas | -<:= coltoggle(qw'build cost') :> | +<:= coltoggle(exists $get{order} ? 'race' : 'source' => '') :> | +<:= coltoggle(name => 'name') :> | +<:= coltoggle(cost => 'cost') :> | +gas | +<:= coltoggle(build => 'build') :> | <:= coltoggle(qw'size size') :> | -attr | -HP | +attr | +<:= coltoggle(HP => 'hp') :> | shield | ⨠| -attack | -<:= coltoggle(qw'dps attack 1') :> | +<:= coltoggle(attack => 'attack') :> | +dps | range | sight | -speed | +<:= coltoggle(speed => 'speed') :> | specials | ' . ($_->{min} // ''), - ' | ' . ($_->{gas} || ''), - !defined $_->{build} ? ' | ' : sprintf(' | %s%.0f', - !!$_->{base} && '+', - $_->{build} || '0', + ' | ' . ($_->{min} // ''), + ' | ' . ($_->{gas} || ''), + defined $_->{transform} ? sprintf(' | %.0f', + $_->{transform}, + ) : + !defined $_->{build} ? ' | ' : sprintf(' | %s%.0f', + defined $_->{warp} && sprintf(' title="%.0f without warpgate"', $_->{build}), + !!$_->{base} && sprintf( + '+', + 'from '.join('+', @{ $_->{base} }), + ), + $_->{warp} // $_->{build} || '0', ), sprintf(' | %s', $_-> {cargo} < 0 ? ('supply', T => 'transport') : $_->{upgraded}->{cargo} < 0 ? ('supply magic-opt', T => 'optional transport') : - $_->{attr}->{flying} ? ('air', F => 'flying') : + $_-> {attr}->{flying} ? ('air', F => 'flying') : + $_->{upgraded}->{attr}->{flying} ? ('air magic-opt', F => 'potentially flying') : $_->{attr}->{structure} ? ('x', B => 'building') : ( [qw( x s m l l h h h h )]->[ $_->{cargo} ], @@ -273,7 +301,7 @@ sub showrangeint { ), defined $_->{size} && sprintf('â%.1f ', $_->{size}), ), - sprintf(' | %s', + sprintf(' | %s', defined $_->{pop} && $_->{pop} < 0 && ' unit-supply', defined $_->{pop} && $_->{pop} == .5 ? '½' : $_->{pop}, ), @@ -302,7 +330,8 @@ sub showrangeint { $_->{attr}->{massive} && 'â', ), - ' | ' . $_->{hp} // '', + $_->{hp} < 0 ? ' | â' : + ' | ' . showrangeint($_->{hp}, $_->{upgraded}->{hp}), $_->{shield} ? sprintf(' | %.0f%% | {shield} / $_->{hp} ) : ' | {attr}->{jump} && qq'â', ' | ' . showmagic($_), - !$_->{attack}->[1] ? () : ( - ' |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
', showattack($_, 1), ' | ' - ), - !$_->{attack}->[2] ? () : ( - ' | |||||||||||||||||||||||||||||
', showattack($_, 2), ' | ' - ), + (map {( + ' | |||||||||||||||||||||||||||||
', + showattack($row, $_), + ' | ', + )} 1 .. $#{ $_->{attack} }), "\n" ); } + my @rows = @{$units}; my $grouped = 1; # race headers if (exists $get{order}) { $grouped = 0; $get{order} ||= ''; - if ($get{order} eq 'size') { + if ($get{order} eq 'name') { + @rows = sort {$a->{name} cmp $b->{name}} @rows; + } + elsif ($get{order} eq 'cost') { + $_->{order} = ( + $_->{gas}*1.5 + $_->{min} + $_->{pop}/8 + $_->{build}/256/8 + ) for @rows; + } + elsif ($get{order} eq 'build') { + my %unittime = map { ($_->{name} => $_->{warp} // $_->{build}) } @rows; + $unittime{Templar} = $unittime{'High Templar'}; + $_->{order} = ( + ($_->{warp} // $_->{build}) + + ($_->{gas}*1.5 + $_->{min} + $_->{pop}/8)/1024 + + ($_->{base} ? ($unittime{$_->{base}->[0]} // 100) + 1 : 0) + ) for @rows; + } + elsif ($get{order} eq 'size') { $_->{order} = ( $_->{pop}*16 + ($_->{size} // $_->{suit}) + $_->{cargo}/8 + $_->{hp}/512 + $_->{min}/8192 - ) for @$units; + ) for @rows; } - elsif ($get{order} eq 'cost') { + elsif ($get{order} eq 'hp') { $_->{order} = ( - $_->{gas}*1.5 + $_->{min} + $_->{pop}/8 + $_->{build}/256/8 - ) for @$units; + $_->{hp}*1.01 + $_->{armor} + $_->{shield} + $_->{size}/1024, + ) for @rows; } elsif ($get{order} eq 'attack') { - $_->{order} = $_->{hp} / 1024 + $_->{shield} / 1008 + max( + $_->{order} = $_->{hp} / 16384 + max( map { - ($_->{damage} + $_->{upgrade} * 3) - * ($_->{count} // 1) / ($_->{cooldown} // 1) + ($_->{dps} ? $_->{dps}->[-1] : + ($_->{damage} + $_->{upgrade} * 3) + * ($_->{count} // 1) / ($_->{cooldown} // 1) + ) * ($_->{splash} ? 1.01 : 1) * ($_->{type} eq 'implosive' ? .96 : 1) * ($_->{type} eq 'explosive' ? .98 : 1) } @{ $_->{attack} } - ) for @$units; + ) for @rows; } - else { - $units->[$_]->{order} = $_ for 0 .. $#$units; + elsif ($get{order} eq 'speed') { + $_->{order} = ( + ($_->{upgraded}->{speed} // $_->{speed}*1.01) + + $_->{sight}/1024 + $_->{detect}/2048 + ) for @rows; } + @rows = sort {$a->{order} <=> $b->{order}} @rows if exists $rows[0]->{order}; } - my @rows = @{$units}; - @rows = sort {$a->{order} <=> $b->{order}} @rows unless $grouped; my ($race, $cat) = ('', ''); for (@rows) { if ($grouped) { - printf ' | |||||||||||||||||||||||||||||
%s'."\n", + say sprintf ' | ||||||||||||||||||||||||||||||
%s', $race = $_->{race}, ucfirst $race unless $race eq $_->{race}; } @@ -407,7 +457,8 @@ sub showrangeint {
|