X-Git-Url: http://git.shiar.nl/sheet.git/blobdiff_plain/92599fd64e5807f0af90406e02385d3be7001379..f5e535f48dc60fdcaa93b9b6ee523801448b9f82:/sc.plp diff --git a/sc.plp b/sc.plp index c86ef0b..09ae989 100644 --- a/sc.plp +++ b/sc.plp @@ -55,13 +55,14 @@ print "Also see the $_ table.\n" for join(', ', print "

\n\n"; sub addupgrade { - my ($ref, $increase) = @_; + my ($ref, $increase, $org) = @_; if (ref $increase eq 'HASH') { - addupgrade(\${$ref}->{$_}, $increase->{$_}) for keys %{$increase}; + addupgrade(\${$ref}->{$_}, $increase->{$_}, $org->{$_}) for keys %{$increase}; } elsif (ref $increase eq 'ARRAY') { - addupgrade(\${$ref}->[$_], $increase->[$_]) for 0 .. $#{$increase}; + addupgrade(\${$ref}->[$_], $increase->[$_], $org->[$_]) for 0 .. $#{$increase}; } + ${$ref} //= $org; ${$ref} += $increase if $increase =~ /^-?[0-9.]+/; } @@ -69,7 +70,15 @@ for my $unit (@{$units}) { for my $upgrade (@{ $unit->{upgrade} }) { while (my ($col, $increase) = each %{$upgrade}) { defined $unit->{$col} or next; - addupgrade(\( $unit->{upgraded}->{$col} //= $unit->{$col} ), $increase); + addupgrade(\$unit->{upgraded}->{$col}, $increase, $unit->{$col}); + } + } + for my $special (@{ $unit->{special} }) { + for my $upgrade (@{ $special->{upgrade} }) { + while (my ($col, $increase) = each %{$upgrade}) { + defined $special->{$col} or next; + addupgrade(\$special->{upgraded}->{$col}, $increase, $special->{$col}); + } } } } @@ -112,46 +121,60 @@ sub showrange { sub showattack { my ($row, $area) = @_; my $attack = $row->{attack}->[$area] - or return ''; + or return ''; my $upattack = $row->{upgraded}->{attack}->[$area]; my $damage = $attack->{damage}; my $maxdamage = $upattack->{damage} // $damage; - $damage = $damage->[0] if ref $damage; - $maxdamage = $maxdamage->[-1] if ref $maxdamage; + $maxdamage += ($upattack->{upgrade} // $attack->{upgrade}) * 3; my $out = ''; - $out .= "$attack->{count}× " if $attack->{count} > 1; + $out .= sprintf('%s× ', + showrange($attack->{count}, $upattack->{count}), + ) if $attack->{count} > 1; $out .= '*' if $attack->{type} eq 'explosive'; $out .= '~' if $attack->{type} eq 'implosive'; + if (my @bonus = sort grep { !/^-/ } keys %{ $attack->{bonus} }) { $out .= sprintf('', (map { - $_ =~ /^light/ ? 'unit-s' : + $_ eq 'light' ? 'unit-s' : $_ eq 'armored' ? 'unit-l' : $_ eq 'organic' ? 'unit-o' : - $_ =~ /^massive/ ? 'unit-h' : + $_ eq 'massive' ? 'unit-h' : $_ eq 'shields' ? 'unit-shield' : '', - } join '_', keys %{ $attack->{bonus} }), + } join '_', @bonus), join(', ', map {( sprintf('+%s vs %s', - (map { - ref $_ ? showrange($_->[0], $_->[-1]) : $_ - } $attack->{bonus}->{$_}), + showrange( + $attack->{bonus}->{$_}, + $attack->{bonus}->{$_} + $attack->{bonus}->{"-$_"} * 3, + ), $_, ), - )} keys %{ $attack->{bonus} }), - ) if $attack->{bonus}; + )} @bonus), + ); + } + $out .= '•' + if $attack->{type} eq 'projectile'; + $out .= sprintf '', $attack->{name} if $attack->{name}; $out .= showrange($damage, $maxdamage); + $out .= '' if $attack->{name}; $out .= sprintf('%s', - $attack->{splash} eq 'line' ? ('linear', '×') : ('splash', '+') + $attack->{splash} eq 'line' ? ('linear', '+') : ('splash', '⁜') ) if $attack->{splash}; $out .= ''; - if ($attack->{cooldown}) { + if ($attack->{dps}) { + # precalculated dps, do not touch + $out .= showrange($attack->{dps}->[0], + $upattack->{dps}->[-1] // $attack->{dps}->[-1] + ); + } + elsif ($attack->{cooldown}) { if (my $type = $attack->{type}) { if ($type eq 'explosive') { $damage /= 2; @@ -163,7 +186,8 @@ sub showrange { $damage *= ($attack->{count} // 1) / $attack->{cooldown}; if (my $bonus = $upattack->{bonus} // $attack->{bonus}) { $maxdamage += $_ for max( - map { ref $_ ? $_->[-1] : $_ } values %{$bonus} + map { $bonus->{$_} + $bonus->{"-$_"} * 3 } + grep { !/^-/ } keys %{$bonus} ); } $maxdamage *= ($upattack->{count} // $attack->{count} // 1) @@ -174,6 +198,9 @@ sub showrange { $out .= '' . '▽' x !!($attack->{anti} & 1); $out .= '' . '△' x !!($attack->{anti} & 2); + $out .= '' . + showrange($attack->{range}, $upattack->{range}); + return $out; } @@ -186,15 +213,17 @@ sub showrange { join('', $_->{name}, $_->{desc} ? ": $_->{desc}" : '', - $_->{range} || $_->{cost} ? sprintf(' (%s)', join ', ', + (map { $_ && " ($_)" } join ', ', + #TODO: apply upgrades $_->{range} ? "range $_->{range}" : (), $_->{cost} ? sprintf('cost %.0f%%%s', 100 * $_->{cost} / $row->{energy}, defined $_->{maint} && sprintf('+%.1f%%/s', 100 * $_->{maint} / $row->{energy}, ), - ) : (), - ) : '', + ) : + $_->{cooldown} ? "cooldown $_->{cooldown}s" : (), + ), ), sprintf($_->{build} ? '(%s)' : '%s', $_->{abbr}), } grep { defined $_->{abbr} } @{$specials}; @@ -236,8 +265,9 @@ sub showrange { $_->{attr}->{massive} && '⚓', ), - '' . ( - defined $_->{unit} && $_->{unit} == .5 ? '½' : $_->{unit} + sprintf('%s', + defined $_->{pop} && $_->{pop} < 0 && ' unit-supply', + defined $_->{pop} && $_->{pop} == .5 ? '½' : $_->{pop}, ), '' . join('', grep { $_ } (defined $_->{organic} ? !$_->{organic} : $_->{attr}->{mech}) @@ -260,8 +290,6 @@ sub showrange { ' class="val unit-armor">' . showrange($_->{armor}, $_->{upgraded}->{armor}), showattack($_, 0), - '' . - showrange(map { $_->{attack}->[0]->{range} } $_, $_->{upgraded}), '' . sprintf( $_->{detect} ? '%s' : '%s', showrange($_->{sight}, $_->{upgraded}->{sight}) @@ -274,7 +302,10 @@ sub showrange { && qq'↑', '' . showmagic($_), !$_->{attack}->[1] ? () : ( - '', showattack($_, 1), '' + '', showattack($_, 1), '' + ), + !$_->{attack}->[2] ? () : ( + '', showattack($_, 2), '' ), "\n" ); @@ -286,19 +317,19 @@ sub showrange { $get{order} ||= ''; if ($get{order} eq 'size') { $_->{order} = ( - $_->{unit}*16 + ($_->{size} // $_->{suit}) + $_->{cargo}/8 + $_->{pop}*16 + ($_->{size} // $_->{suit}) + $_->{cargo}/8 + $_->{hp}/512 + $_->{min}/8192 ) for @$units; } elsif ($get{order} eq 'cost') { $_->{order} = ( - $_->{gas}*1.5 + $_->{min} + $_->{unit}/8 + $_->{build}/256/8 + $_->{gas}*1.5 + $_->{min} + $_->{pop}/8 + $_->{build}/256/8 ) for @$units; } elsif ($get{order} eq 'attack') { $_->{order} = $_->{hp} / 1024 + $_->{shield} / 1008 + max( map { - ((map { ref $_ ? $_->[-1] : $_ } $_->{damage})[0]) + ($_->{damage} + $_->{upgrade} * 3) * ($_->{count} // 1) / ($_->{cooldown} // 1) * ($_->{splash} ? 1.01 : 1) * ($_->{type} eq 'implosive' ? .96 : 1) @@ -396,12 +427,14 @@ if ($scver{major} > 1) {
damage given per single hit
dps indicates relative amount of damage done in 1 second of in-game time -
splash damage hits all objects nearby + - or in a straight line ×. +
splash damage hits all objects nearby ⁜ + or in a straight line +.
<: if ($scver{major} > 1) { :>does not include bonus damage - dealt to susceptible unit types<: + dealt to susceptible unit types +
•projectile shots are negated by + Point Defense Drones<: } else { :>*explosive damage does only 50% damage to small units, 75% to medium, 100% to large @@ -418,8 +451,8 @@ if ($scver{major} > 1) {
speed
relative speed of movement (when in full motion, startup speed ignored)
specials -
special abilities are usually casted manually, but some are always active
parentheses () indicate that it needs to be researched first +
passive abilities are always enabled
hover for description
range is maximum range required to activate
cost is percentage of total energy lost