X-Git-Url: http://git.shiar.nl/sheet.git/blobdiff_plain/4a625d5eed49b9c5b46fa9c7d4b6e04fa355fc64..53b43cde562492785c4d5085845638136f2f43c9:/sc.plp diff --git a/sc.plp b/sc.plp index 5d82a8d..612695e 100644 --- a/sc.plp +++ b/sc.plp @@ -114,11 +114,33 @@ sub coltoggle { sub showrange { my ($min, $max) = @_; return '' if not defined $min; - $_ &&= int($_ + .5) for $min, $max; # round halves up - return $min || '-' if not defined $max or $min == $max; + return $min || '-' if !$max or $min == $max; return "$min-$max"; } +sub showrangeint { + $_ &&= int($_ + .5) for @_; # round halves up + return showrange(@_); +} + + sub showcost { + my ($row, $unit) = @_; + return join(' ', + sprintf('cost %s%%', join '-', + map { $_ && sprintf '%.0f', 100 * $row->{cost} / $_ } grep { defined $_ } + $unit->{energy}, + $unit->{upgraded}->{energy}, + $unit->{capacity}, + $unit->{upgraded}->{capacity}, + ), + !defined $row->{maint} ? () : sprintf('+%s%%/s', join '-', + map { sprintf '%.1f', 100 * $row->{maint} / $_ } grep $_, + $unit->{capacity}, + $unit->{upgraded}->{capacity}, + ), + ); + } + sub showattack { my ($row, $area) = @_; my $attack = $row->{attack}->[$area] @@ -130,8 +152,10 @@ sub showrange { $maxdamage += ($upattack->{upgrade} // $attack->{upgrade}) * 3; my $out = ''; + $out .= sprintf '¤ ', showcost($attack, $row) + if $attack->{cost}; $out .= sprintf('%s× ', - showrange($attack->{count}, $upattack->{count}), + showrangeint($attack->{count}, $upattack->{count}), ) if $attack->{count} > 1; $out .= '*' if $attack->{type} eq 'explosive'; @@ -149,7 +173,7 @@ sub showrange { } join '_', @bonus), join(', ', map {( sprintf('+%s vs %s', - showrange( + showrangeint( $attack->{bonus}->{$_}, $attack->{bonus}->{$_} + $attack->{bonus}->{"-$_"} * 3, ), @@ -162,7 +186,7 @@ sub showrange { if $attack->{type} eq 'projectile'; $out .= sprintf '', $attack->{name} if $attack->{name}; - $out .= showrange($damage, $maxdamage); + $out .= showrangeint($damage, $maxdamage); $out .= '' if $attack->{name}; $out .= sprintf('%s', $attack->{splash} eq 'line' ? ('linear', '+') : ('splash', '⁜') @@ -171,7 +195,7 @@ sub showrange { $out .= ''; if ($attack->{dps}) { # precalculated dps, do not touch - $out .= showrange($attack->{dps}->[0], + $out .= showrangeint($attack->{dps}->[0], $upattack->{dps}->[-1] // $attack->{dps}->[-1] ); } @@ -193,14 +217,14 @@ sub showrange { } $maxdamage *= ($upattack->{count} // $attack->{count} // 1) / ($upattack->{cooldown} // $attack->{cooldown}); - $out .= showrange($damage, $maxdamage); + $out .= showrangeint($damage, $maxdamage); } $out .= '' . '▽' x !!($attack->{anti} & 1); $out .= '' . '△' x !!($attack->{anti} & 2); $out .= '' . - showrange($attack->{range}, $upattack->{range}); + showrangeint($attack->{range}, $upattack->{range}); return $out; } @@ -217,12 +241,7 @@ sub showrange { (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}, - ), - ) : + $_->{cost} ? showcost($_, $row) : $_->{cooldown} ? "cooldown $_->{cooldown}s" : (), ), ), @@ -288,14 +307,26 @@ sub showrange { 100 * $_->{shield} / $_->{hp} ) : '' . - showrange($_->{armor}, $_->{upgraded}->{armor}), + showrangeint($_->{armor}, $_->{upgraded}->{armor}), showattack($_, 0), '' . sprintf( $_->{detect} ? '%s' : '%s', - showrange($_->{sight}, $_->{upgraded}->{sight}) + showrangeint($_->{sight}, $_->{upgraded}->{sight}) + ), + sprintf('%s', + showrange( + map { $_ && sprintf '%.1f', $_ } + $_->{speed}, $_->{upgraded}->{speed} + ), + defined $_->{creep} && sprintf(' title="%s on creep"', + $_->{creep} == 1 ? 'same' : showrange( + map { $_ && sprintf '%.1f', $_ } + $_->{speed} * $_->{creep}, + $_->{upgraded}->{speed} && $_->{upgraded}->{speed} * + ($_->{upgraded}->{creep} // $_->{creep}), + ), + ), ), - '' . - showrange($_->{speed}, $_->{upgraded}->{speed}), $_->{attr}->{jump} && qq'↕', '' . showmagic($_), @@ -376,7 +407,7 @@ sub showrange {
cost -
minerals+gas required to create one unit +
minerals and gas required to create one unit
includes total expenses if based on existing units
build
relative time needed to create at least one unit @@ -384,9 +415,8 @@ sub showrange { and +parent units
size
Transports can fit upto - 8 - non-Flying units -
number of command points taken per unit + 8 non-Flying cargo units +
number of command points taken while alive
<: if ($scver{major} > 1) { :>received damage depends on @@ -399,17 +429,31 @@ if ($scver{major} > 1) {
massive ⚓ units cannot be lifted or slowed and can break force fields<: } else { - :>organic/mechanic unit + :>abilities may hit only organic + or mechanic targets
affected by Small, Medium, or - Large unit damage<: + Large damage<: } :> -
HP
- total number of hitpoints (including shields) +
HP +
total number of hitpoints (including shields) +
everything zerg (except for eggs) regenerates one point every + <:= $scver{major} == 1 ? '4½' : '3.7' :> seconds
shield
percentage of HP in shields -
shields always take full damage, irrelevant of unit size -
does not take armor bonuses, but upgrades can decrease damage to any shield hit by upto 3 +
<: +if ($scver{major} > 1) { + :>shields always take full damage, irrelevant of unit size +
<: +} + :>does not take armor bonuses, + but upgrades can decrease damage to any shield hit by upto 3 +
<: +if ($scver{major} > 1) { + :>after 10 seconds out of combat, 2 points are recharged per game second<: +} else { + :>recharges one point every 2½ seconds<: +} :>
armor
base unit armor
can be increased by upto 3 at various facilities @@ -417,9 +461,8 @@ if ($scver{major} > 1) {
reduction applies to initial damage, before size penalties (so a plasma hit of 12 to 4 armor large deals 2 damage, not ½)
attack -
damage given per single hit -
dps indicates relative amount of damage - done in 1 second of in-game time +
damage per single hit +
some weapons fire multiple × times, multiplying armor penalties
splash damage hits all objects nearby ⁜ or in a straight line +.
<: @@ -430,30 +473,38 @@ if ($scver{major} > 1) { Point Defense Drones<: } else { :>*explosive damage does only - 50% damage to small units, 75% to medium, 100% to large + 50% damage to Small units, + 75% to Medium, + 100% to Large
~concussive/plasma damage does - 25% to large, 50% medium, 100% to small units<: + 25% to Large, + 50% Medium, + 100% to Small units<: } :> +
dps indicates relative total amount of damage + done in 1 second of <:= $scver{major} > 1 ? 'Normal in-game time' : + 'time on Fast game speed' :>
targets ▽ ground and/or △ air
range -
maximum range of weapon (note siege tank also has a minimum range) +
maximum hex distance a weapon can fire (note Sieged Tank also has a minimum)
sight
range in which the unit detects other units
emphasis indicates ability to detect cloaked units
speed -
relative speed of movement (when in full motion, startup speed ignored) +
top movement speed in hex per second +
acceleration and deceleration ignored
specials
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 +
range is maximum distance allowed to activate +
cost describes energy loss percentage on spawn and when fully charged

-When two values are given (1-2), second value indicates attribute after all -possible upgrades. +When two values are given (1-2), the second value indicates the attribute +after all possible upgrades.