index: release v1.18 with only altgr index linked
[sheet.git] / sc.plp
diff --git a/sc.plp b/sc.plp
index f0824bf917d45b07cb9a75e0781f2e1d2468dfee..e784cbdd6dbe6a67886bf98e5beb85c92f3c6463 100644 (file)
--- a/sc.plp
+++ b/sc.plp
@@ -20,18 +20,25 @@ my %scvers = (
                game => 'StarCraft II LotV',
                major => 2,
        },
+       index => 'bw',
+       1     => 'bw',
+       2     => 'lotv',
 );
 
-$Request ||= 'bw';
-$Request = 'lotv' if $Request eq '2';
-my %scver = %{ $scvers{$Request} }
-       or Abort("Requested version $Request not available", '404 unknown');
+my $requestver = $scvers{$Request ||= 'index'}
+       or Html(), Abort("Requested version <q>$Request</q> not available", '404 request not found');
 
-my $datafile = "sc-units-$Request.inc.pl";
+if (ref $requestver ne 'HASH') {
+       $header{Location} = "/sc/$requestver";
+       Abort("Canonical URL for $Request is at $requestver", '302 subpage alias');
+}
+
+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}"
@@ -45,15 +52,14 @@ Html({
                $scver{major} < 2 ? qw' bw broodwar brood war ' :
                qw' starcraft2 lotv hots wol ',
        ],
-       stylesheet => [qw'light'],
-       raw => '<link rel="stylesheet" type="text/css" media="all" href="/sc.css?1.1" title="light">',
-       data => [$datafile],
+       stylesheet => [qw( light dark )],
+       raw => '<link rel="stylesheet" type="text/css" media="all" href="/sc.css?1.2">',
+       data => ["$datafile.inc.pl"],
 });
 
 say "<h1>$scver{game} units</h1>\n";
 
-my $units = do $datafile;
-Abort("Cannot open unit data", 501, $_) for $@ || $! || ();
+my $units = Data($datafile);
 my $patch = shift @{$units}
        or Abort("Cannot open unit data: metadata not found", 501);
 
@@ -103,12 +109,12 @@ sub coltoggle {
 :><table class="units">
 <thead><tr>
        <th><:= coltoggle(exists $get{order} ? 'race' : 'source' => '') :></th>
-       <th><:= coltoggle(name => 'name') :></th>
-       <th class="val min" title=minerals><:= coltoggle(cost => 'cost') :></th>
-       <th class="val gas">gas</th>
+       <th class="unit-name"><:= coltoggle(name => 'name') :></th>
+       <th class="val unit-min" title=minerals><:= coltoggle(cost => 'cost') :></th>
+       <th class="val unit-gas">gas</th>
        <th class="val time"><:= coltoggle(build => 'build') :></th>
        <th class="unit" colspan="2"><:= coltoggle(qw'size size') :></th>
-       <th class="unit" colspan="2">attr</th>
+       <th class="unit unit-attr" colspan="2">attr</th>
        <th class="val unit-hp"><:= coltoggle(HP => 'hp') :></th>
        <th class="val unit-shield">shield</th>
        <th class="val unit-armor" title="armor">⛨</th>
@@ -172,24 +178,26 @@ sub showrangeint {
                        if $attack->{type} eq 'implosive';
        if (my @bonus = sort grep { !/^-/ } keys %{ $attack->{bonus} }) {
                $out .= sprintf('<span class="%s" title="%s">&ge;</span>',
-                       (map {
+                       (
                                $_ eq 'light' ? 'unit-s' :
                                $_ eq 'armored' ? 'unit-l' :
                                $_ eq 'organic' ? 'unit-o' :
                                $_ eq 'massive' ? 'unit-h' :
                                $_ eq 'shields' ? 'unit-shield' :
+                               $_ eq 'structure' ? 'unit-x' :
                                '',
-                       } join '_', @bonus),
-                       join(', ', map {(
+                       ),
+                       (
                                sprintf('+%s vs %s',
                                        showrangeint(
                                                $attack->{bonus}->{$_},
-                                               $attack->{bonus}->{$_} + $attack->{bonus}->{"-$_"} * 3,
+                                               ($upattack->{bonus} // $attack->{bonus})->{$_}
+                                                       + ($upattack->{bonus} // $attack->{bonus})->{"-$_"} * 3,
                                        ),
                                        $_,
                                ),
-                       )} @bonus),
-               );
+                       ),
+               ) for @bonus;
        }
                $out .= '<span class="unit-pdd" title="projectile">•</span>'
                        if $attack->{type} eq 'projectile';
@@ -243,9 +251,12 @@ sub showrangeint {
                my $specials = $row->{special} or return '';
                return join ' ', map {
                        sprintf '<span%s title="%s">%s</span>',
-                               $_->{duration} < 0 && ' class="magic-perma"',
                                join('',
-                                       $_->{name},
+                                       $_->{duration} < 0 && ' class="magic-perma"',
+                                       $_->{detect} && ' class="unit-detect"',
+                               ),
+                               join('',
+                                       $_->{name} // $_->{alt},
                                        $_->{desc} ? ": $_->{desc}" : '',
                                        (map { $_ && " ($_)" } join ', ',
                                                #TODO: apply upgrades
@@ -264,13 +275,13 @@ sub showrangeint {
                $_->{hp} += $_->{shield} if $_->{shield};
 
                return (
-                       '<td class="val min">' . ($_->{min} // ''),
-                       '<td class="val gas">' . ($_->{gas} || ''),
+                       '<td class="val unit-min">' . ($_->{min} // ''),
+                       '<td class="val unit-gas">' . ($_->{gas} || ''),
                        defined $_->{transform} ? sprintf('<td class="val time">%.0f',
                                $_->{transform},
                        ) :
                        !defined $_->{build} ? '<td>' : sprintf('<td class="val time"%s>%s%.0f',
-                               defined $_->{warp} && qq(title="$_->{build} without warpgate"),
+                               defined $_->{warp} && sprintf(' title="%.0f without warpgate"', $_->{build}),
                                !!$_->{base} && sprintf(
                                        '<span class="unit-composed" title="%s">+</span>',
                                        'from '.join('+', @{ $_->{base} }),
@@ -280,7 +291,8 @@ sub showrangeint {
                        sprintf('<td class="unit unit-%s" title="%4$s%3$s">%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} ],
@@ -289,7 +301,7 @@ sub showrangeint {
                                ),
                                defined $_->{size} && sprintf('⌀%.1f ', $_->{size}),
                        ),
-                       sprintf('<td class="val unit%s">%s',
+                       sprintf('<td class="val unit unit-pop%s">%s',
                                defined $_->{pop} && $_->{pop} < 0 && ' unit-supply',
                                defined $_->{pop} && $_->{pop} == .5 ? '½' : $_->{pop},
                        ),
@@ -347,12 +359,11 @@ sub showrangeint {
                        $_->{attr}->{jump}
                                && qq'<span class="unit unit-jump" title="$_->{attr}->{jump}">↕</span>',
                        '<td class="unit-magic">' . showmagic($_),
-                       !$_->{attack}->[1] ? () : (
-                               '<tr><td colspan=12>', showattack($_, 1), '<td colspan=3>'
-                       ),
-                       !$_->{attack}->[2] ? () : (
-                               '<tr><td colspan=12>', showattack($_, 2), '<td colspan=3>'
-                       ),
+                       (map {(
+                               '<tr class="sub"><th class="cat"><td><td colspan=10>',
+                               showattack($row, $_),
+                               '<td colspan=3>',
+                       )} 1 .. $#{ $_->{attack} }),
                        "\n"
                );
        }
@@ -365,11 +376,6 @@ sub showrangeint {
                if ($get{order} eq 'name') {
                        @rows = sort {$a->{name} cmp $b->{name}} @rows;
                }
-               elsif ($get{order} eq 'hp') {
-                       $_->{order} = (
-                               $_->{hp}*1.01 + $_->{armor} + $_->{shield} + $_->{size}/1024,
-                       ) for @rows;
-               }
                elsif ($get{order} eq 'cost') {
                        $_->{order} = (
                                $_->{gas}*1.5 + $_->{min} + $_->{pop}/8 + $_->{build}/256/8
@@ -390,8 +396,13 @@ sub showrangeint {
                                + $_->{hp}/512 + $_->{min}/8192
                        ) for @rows;
                }
+               elsif ($get{order} eq 'hp') {
+                       $_->{order} = (
+                               $_->{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 {
                                        ($_->{dps} ? $_->{dps}->[-1] :
                                                ($_->{damage} + $_->{upgrade} * 3)
@@ -446,7 +457,8 @@ sub showrangeint {
 
 <dl>
 <dt>cost
-       <dd>minerals and gas required to create one unit
+       <dd><span class="unit-min">minerals</span> and
+               <span class="unit-gas">gas</span> required to create one unit
        <dd>includes total expenses if based on existing units
 <dt>build
        <dd>relative time needed to create at least one unit