X-Git-Url: http://git.shiar.net/sheet.git/blobdiff_plain/cd55ca709c1aefb562b3dd5a3436759177208070..3207fe934ef25ea7980d123c83c2711cf8964646:/sc.plp?ds=sidebyside diff --git a/sc.plp b/sc.plp index a721035..c969185 100644 --- a/sc.plp +++ b/sc.plp @@ -1,28 +1,37 @@ <(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, - ); -} -my $datafile = "sc-units-$scver{id}.inc.pl"; + }, + lotv => { + name => 'Legacy of the Void', + title => 'starcraft2 lotv', + game => 'StarCraft II LotV', + major => 2, + }, +); + +$Request ||= 'bw'; +$Request = 'lotv' if $Request eq '2'; +my %scver = %{ $scvers{$Request} } + or Abort("Requested version $Request not available", '404 unknown'); + +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 +40,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 +58,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"; @@ -92,20 +103,20 @@ sub coltoggle { :><:= coltoggle(exists $get{order} ? 'race' : 'source' => '') :> | -<:= coltoggle(name => 'name') :> | -cost | -gas | -<:= coltoggle(qw'build cost') :> | +<:= coltoggle(name => 'name') :> | +<:= coltoggle(cost => 'cost') :> | +gas | +<:= coltoggle(build => 'build') :> | <:= coltoggle(qw'size size') :> | -attr | -HP | +attr | +<:= coltoggle(HP => 'hp') :> | shield | ⨠| <:= 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 +290,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 +319,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"
);
@@ -346,11 +366,25 @@ 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
) 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
@@ -370,6 +404,12 @@ sub showrangeint {
} @{ $_->{attack} }
) for @rows;
}
+ 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};
}
@@ -407,7 +447,8 @@ sub showrangeint {
|