X-Git-Url: http://git.shiar.nl/sheet.git/blobdiff_plain/917ba679115b9e3cd7b88f7e5081a1a2503a684e..d08e6069c69af98c82e3bba61ccccb14f2e76c7a:/sc.plp?ds=inline
diff --git a/sc.plp b/sc.plp
index a282ef4..b3c27fc 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 ($Request and $Request 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} = $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.inc.pl";
Html({
title => "$scver{title} unit cheat sheet",
- version => '1.1',
+ version => '1.2',
description => [
"Reference of $scver{game} unit properties,"
. " comparing various statistics of all the units in $scver{name}"
@@ -31,12 +47,13 @@ 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 => '',
+ stylesheet => [qw( light dark )],
+ raw => '',
data => [$datafile],
});
@@ -48,9 +65,10 @@ my $patch = shift @{$units}
or Abort("Cannot open unit data: metadata not found", 501);
say "
Unit properties as seen or measured in $scver{name}\n$patch."; -say "Also see the $_ table." for join(', ', - (showlink('StarCraft 2: HotS', '/sc/2')) x ($scver{major} < 2), - (showlink('original SC: Brood War', '/sc')) x ($scver{major} > 1), +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'), ); say "
\n"; @@ -91,21 +109,21 @@ sub coltoggle { } :>- | <:= 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} && qq(title="$_->{build} without warpgate"), + !!$_->{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} ], @@ -271,7 +298,7 @@ sub showrangeint { ), defined $_->{size} && sprintf('â%.1f ', $_->{size}), ), - sprintf(' | %s', + sprintf(' | %s', defined $_->{pop} && $_->{pop} < 0 && ' unit-supply', defined $_->{pop} && $_->{pop} == .5 ? '½' : $_->{pop}, ), @@ -300,7 +327,8 @@ sub showrangeint { $_->{attr}->{massive} && 'â', ), - ' | ' . $_->{hp} // '', + $_->{hp} < 0 ? ' | â' : + ' | ' . showrangeint($_->{hp}, $_->{upgraded}->{hp}), $_->{shield} ? sprintf(' | %.0f%% | {shield} / $_->{hp} ) : ' | â', ' | ' . showmagic($_), !$_->{attack}->[1] ? () : ( - ' |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
', showattack($_, 1), ' | ' + ' | |||||||||||||||||||||||||||||
', showattack($_, 1), ' | ' ), !$_->{attack}->[2] ? () : ( - ' | |||||||||||||||||||||||||||||
', showattack($_, 2), ' | ' + ' | |||||||||||||||||||||||||||||
', showattack($_, 2), ' | '
),
"\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(
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) {
@@ -405,7 +455,8 @@ sub showrangeint {
|