word: language includes for general use
[sheet.git] / sc.plp
diff --git a/sc.plp b/sc.plp
index 78eebc43bc8fa648c3f768ba8a4b818d6e16a895..b3c27fc6c8705c02786aa3bba48350b380af8e5f 100644 (file)
--- a/sc.plp
+++ b/sc.plp
@@ -5,27 +5,40 @@ my %scvers = (
        bw => {
                name => 'Brood War',
                title => 'starcraft',
        bw => {
                name => 'Brood War',
                title => 'starcraft',
-               game => 'StarCraft',
+               game => 'StarCraft BW',
                major => 1,
        },
        hots => {
                name => 'Heart of the Swarm',
                major => 1,
        },
        hots => {
                name => 'Heart of the Swarm',
-               title => 'starcraft2',
-               game => 'StarCraft II',
+               title => 'starcraft2 hots',
+               game => 'StarCraft II HotS',
                major => 2,
        },
                major => 2,
        },
+       lotv => {
+               name => 'Legacy of the Void',
+               title => 'starcraft2 lotv',
+               game => 'StarCraft II LotV',
+               major => 2,
+       },
+       index => 'bw',
+       1     => 'bw',
+       2     => 'lotv',
 );
 
 );
 
-$Request ||= 'bw';
-$Request = 'hots' 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');
+
+if (ref $requestver ne 'HASH') {
+       $header{Location} = $requestver;
+       Abort("Canonical URL for $Request is at $requestver", '302 subpage alias');
+}
 
 
+my %scver = %{$requestver};
 my $datafile = "sc-units-$Request.inc.pl";
 
 Html({
        title => "$scver{title} unit cheat sheet",
 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}"
        description => [
                "Reference of $scver{game} unit properties,"
                . " comparing various statistics of all the units in $scver{name}"
@@ -36,10 +49,11 @@ Html({
                starcraft game unit statistics stats comparison table sheet cheat
                reference software attributes properties patch attribute multiplayer
                ',
                starcraft game unit statistics stats comparison table sheet cheat
                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 => '<link rel="stylesheet" type="text/css" media="all" href="/sc.css?1.1" title="light">',
+       stylesheet => [qw( light dark )],
+       raw => '<link rel="stylesheet" type="text/css" media="all" href="/sc.css?1.2">',
        data => [$datafile],
 });
 
        data => [$datafile],
 });
 
@@ -51,8 +65,9 @@ my $patch = shift @{$units}
        or Abort("Cannot open unit data: metadata not found", 501);
 
 say "<p>Unit properties as seen or measured in $scver{name}\n$patch.";
        or Abort("Cannot open unit data: metadata not found", 501);
 
 say "<p>Unit properties as seen or measured in $scver{name}\n$patch.";
-say "Also see the $_ table." for join(', ',
-       (showlink('StarCraft 2: HotS', '/sc/hots'))    x ($Request ne 'hots'),
+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 "</p>\n";
        (showlink('original SC: Brood War', '/sc/bw')) x ($Request ne 'bw'),
 );
 say "</p>\n";
@@ -95,12 +110,12 @@ sub coltoggle {
 :><table class="units">
 <thead><tr>
        <th><:= coltoggle(exists $get{order} ? 'race' : 'source' => '') :></th>
 :><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="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>
        <th class="val unit-hp"><:= coltoggle(HP => 'hp') :></th>
        <th class="val unit-shield">shield</th>
        <th class="val unit-armor" title="armor">⛨</th>
@@ -176,7 +191,8 @@ sub showrangeint {
                                sprintf('+%s vs %s',
                                        showrangeint(
                                                $attack->{bonus}->{$_},
                                sprintf('+%s vs %s',
                                        showrangeint(
                                                $attack->{bonus}->{$_},
-                                               $attack->{bonus}->{$_} + $attack->{bonus}->{"-$_"} * 3,
+                                               ($upattack->{bonus} // $attack->{bonus})->{$_}
+                                                       + ($upattack->{bonus} // $attack->{bonus})->{"-$_"} * 3,
                                        ),
                                        $_,
                                ),
                                        ),
                                        $_,
                                ),
@@ -256,8 +272,11 @@ sub showrangeint {
                $_->{hp} += $_->{shield} if $_->{shield};
 
                return (
                $_->{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"),
                                !!$_->{base} && sprintf(
                        !defined $_->{build} ? '<td>' : sprintf('<td class="val time"%s>%s%.0f',
                                defined $_->{warp} && qq(title="$_->{build} without warpgate"),
                                !!$_->{base} && sprintf(
@@ -269,7 +288,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') :
                        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} ],
                                $_->{attr}->{structure} ? ('x',   B => 'building') :
                                (
                                        [qw( x s m l l h h h h )]->[ $_->{cargo} ],
@@ -278,7 +298,7 @@ sub showrangeint {
                                ),
                                defined $_->{size} && sprintf('⌀%.1f ', $_->{size}),
                        ),
                                ),
                                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},
                        ),
                                defined $_->{pop} && $_->{pop} < 0 && ' unit-supply',
                                defined $_->{pop} && $_->{pop} == .5 ? '½' : $_->{pop},
                        ),
@@ -307,7 +327,8 @@ sub showrangeint {
                                $_->{attr}->{massive}
                                        && '<span class="unit-massive" title="massive">⚓</span>',
                        ),
                                $_->{attr}->{massive}
                                        && '<span class="unit-massive" title="massive">⚓</span>',
                        ),
-                       '<td class="val unit-hp">' . $_->{hp} // '',
+                       $_->{hp} < 0 ? '<td class="val unit-hp" title="invulnerable">∞' :
+                       '<td class="val unit-hp">' . showrangeint($_->{hp}, $_->{upgraded}->{hp}),
                        $_->{shield} ? sprintf('<td class="val unit-shield">%.0f%%<td',
                                100 * $_->{shield} / $_->{hp}
                        ) : '<td colspan=2',
                        $_->{shield} ? sprintf('<td class="val unit-shield">%.0f%%<td',
                                100 * $_->{shield} / $_->{hp}
                        ) : '<td colspan=2',
@@ -336,10 +357,10 @@ sub showrangeint {
                                && qq'<span class="unit unit-jump" title="$_->{attr}->{jump}">↕</span>',
                        '<td class="unit-magic">' . showmagic($_),
                        !$_->{attack}->[1] ? () : (
                                && 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>'
+                               '<tr><th class="cat" colspan="2"><td colspan=10>', showattack($_, 1), '<td colspan=3>'
                        ),
                        !$_->{attack}->[2] ? () : (
                        ),
                        !$_->{attack}->[2] ? () : (
-                               '<tr><td colspan=12>', showattack($_, 2), '<td colspan=3>'
+                               '<tr><th class="cat" colspan="2"><td colspan=10>', showattack($_, 2), '<td colspan=3>'
                        ),
                        "\n"
                );
                        ),
                        "\n"
                );
@@ -353,11 +374,6 @@ sub showrangeint {
                if ($get{order} eq 'name') {
                        @rows = sort {$a->{name} cmp $b->{name}} @rows;
                }
                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
                elsif ($get{order} eq 'cost') {
                        $_->{order} = (
                                $_->{gas}*1.5 + $_->{min} + $_->{pop}/8 + $_->{build}/256/8
@@ -378,6 +394,11 @@ sub showrangeint {
                                + $_->{hp}/512 + $_->{min}/8192
                        ) for @rows;
                }
                                + $_->{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(
                                map {
                elsif ($get{order} eq 'attack') {
                        $_->{order} = $_->{hp} / 1024 + $_->{shield} / 1008 + max(
                                map {
@@ -434,7 +455,8 @@ sub showrangeint {
 
 <dl>
 <dt>cost
 
 <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
        <dd>includes total expenses if based on existing units
 <dt>build
        <dd>relative time needed to create at least one unit