1
0
Fork 0

Updated attributes and skills

This commit is contained in:
Michaël Lemaire 2017-06-11 22:44:12 +02:00
parent ea13e25c5e
commit 7275288f13
34 changed files with 363 additions and 359 deletions

View file

@ -98,34 +98,34 @@ For battle purpose, the ship is to be considered "dead".
### Attributes
Attributes represent a ship's ability to use its HSP system:
Attributes represent a ship's ability to use its HSP system and weapons:
* **Initiative** - Ability to play before other ships in the play order
* **Hull capacity** - Maximal Hull value (when the battle starts)
* **Shield capacity** - Maximal Shield value (when the battle starts)
* **Power capacity** - Maximal Power value
* **Initial power** - Power immediately available at the start of battle
* **Power recovery** - Power generated at the end of a ship's turn
* **Power generation** - Power generated at the end of a ship's turn
* **Maneuverability** - Ability to move first and fast
* **Precision** - Ability to target far and good
These attributes are the sum of all currently applied effects (being permanent by an equipped item,
or a temporary effect caused by a weapon or a drone).
For example, a ship that equips a power generator with "power recovery +3", but has a sticky effect
of "power recovery -1" from a previous weapon hit, will have an effective power recovery of 2.
For example, a ship that equips a power generator with "power generation +3", but has a sticky effect
of "power generation -1" from a previous weapon hit, will have an effective power generation of 2.
### Skills
Skills represent a ship's ability to use equipments:
* **Materials** - Usage of physical materials such as bullets, shells...
* **Electronics** - Components of computers and communication
* **Energy** - Raw energy manipulation
* **Human** - Management of a human team and resources
* **Photons** - Forces of light, and electromagnetic radiation
* **Antimatter** - Manipulation of matter and antimatter particles
* **Quantum** - Application of quantum uncertainty principle
* **Gravity** - Interaction with gravitational forces
* **Time** - Manipulation of time
* **Time** - Control of relativity's time properties
Each equipment has minimal skill requirements to be used. For example, a weapon may require "materials >= 2"
and "energy >= 3" to be equipped. A ship that does not meet these requirements will not be able to use
and "photons >= 3" to be equipped. A ship that does not meet these requirements will not be able to use
the equipment.
Skills are defined by the player, using points given while leveling up.

View file

@ -19,7 +19,7 @@
inkscape:version="0.92.1 r15371"
sodipodi:docname="character.svg"
enable-background="new"
inkscape:export-filename="/home/michael/workspace/perso/spacetac/out/assets/images/character/close.png"
inkscape:export-filename="/tmp/sheet.png"
inkscape:export-xdpi="96"
inkscape:export-ydpi="96">
<defs
@ -573,11 +573,11 @@
borderopacity="1.0"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:zoom="7.919596"
inkscape:cx="577.1487"
inkscape:cy="39.46876"
inkscape:zoom="0.49497475"
inkscape:cx="970.56884"
inkscape:cy="617.47621"
inkscape:document-units="px"
inkscape:current-layer="layer2"
inkscape:current-layer="layer11"
showgrid="false"
inkscape:window-width="1920"
inkscape:window-height="1037"
@ -593,13 +593,13 @@
inkscape:snap-object-midpoints="true"
inkscape:snap-bbox-edge-midpoints="true"
inkscape:snap-others="true"
inkscape:snap-global="false"
inkscape:snap-global="true"
showborder="false"
borderlayer="false"
inkscape:showpageshadow="true"
inkscape:lockguides="true"
inkscape:measure-start="168.929,966.071"
inkscape:measure-end="228.214,927.143">
inkscape:measure-start="519.581,357.616"
inkscape:measure-end="665.158,357.616">
<sodipodi:guide
position="0,0"
orientation="0,1920"
@ -644,7 +644,7 @@
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
@ -1188,17 +1188,6 @@
height="10.620193"
x="191.35637"
y="195.53967" />
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:6.3499999px;line-height:6.61458349px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';letter-spacing:0px;word-spacing:0px;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.26458335px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
x="194.33784"
y="203.16125"
id="text6516"><tspan
sodipodi:role="line"
id="tspan6514"
x="194.33784"
y="203.16125"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:6.3499999px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#ffffff;fill-opacity:1;stroke-width:0.26458335px">35</tspan></text>
</g>
</g>
<use
@ -1279,26 +1268,6 @@
id="rect6041"
d="m 165.26733,271.72806 h 15.88055 l 1.60362,12.73588 h -19.08779 z"
style="display:inline;opacity:1;fill:#2d0c08;fill-opacity:1;stroke:none;stroke-width:0.15408839;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;filter:url(#filter9551)" />
<text
id="text6631"
y="282.02341"
x="169.983"
style="font-style:normal;font-weight:normal;font-size:10.58333397px;line-height:6.61458349px;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.26458335px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
xml:space="preserve"><tspan
style="fill:#ffffff;fill-opacity:1;stroke-width:0.26458335px"
y="282.02341"
x="169.983"
id="tspan6629"
sodipodi:role="line">2</tspan></text>
<path
style="display:inline;opacity:1;fill:#d7d07d;fill-opacity:1;stroke:none;stroke-width:0.58238131;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;filter:url(#filter9551)"
d="m 517.54102,1067.4453 -0.96875,7.6934 h 72.14257 l -0.96875,-7.6934 z"
transform="matrix(0.26458334,0,0,0.26458334,26.987511,0)"
id="path4776"
inkscape:connector-curvature="0"
inkscape:export-filename="/home/michael/workspace/perso/spacetac/out/assets/images/character/experience.png"
inkscape:export-xdpi="96"
inkscape:export-ydpi="96" />
</g>
<g
id="g6064"
@ -1315,17 +1284,6 @@
id="rect6044"
d="m 266.80115,271.72803 h 15.88054 l 1.87089,12.73588 h -19.62232 z"
style="display:inline;opacity:1;fill:#182126;fill-opacity:1;stroke:#d4d6e5;stroke-width:0.79374999;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;filter:url(#filter9551)" />
<text
id="text6637"
y="281.94846"
x="271.37729"
style="font-style:normal;font-weight:normal;font-size:10.58333397px;line-height:6.61458349px;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.26458335px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
xml:space="preserve"><tspan
style="fill:#ffffff;fill-opacity:1;stroke-width:0.26458335px"
y="281.94846"
x="271.37729"
id="tspan6635"
sodipodi:role="line">0</tspan></text>
<text
id="text6641"
y="280.98312"
@ -1341,29 +1299,6 @@
<g
id="g4635"
transform="translate(9.5250003)">
<g
id="g6665"
transform="matrix(1,0,0,0.93590183,86.972862,8.8615075)"
style="opacity:1">
<ellipse
style="fill:#267482;fill-opacity:1;stroke-width:0.76175737;stroke-miterlimit:4;stroke-dasharray:none"
id="path6647"
cy="176.57861"
cx="193.08553"
rx="13.219336"
ry="5.6314278" />
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:10.58333397px;line-height:6.61458349px;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#dde0a5;fill-opacity:1;stroke:none;stroke-width:0.26458335px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter7193)"
x="194.12859"
y="179.89624"
id="text6651"><tspan
sodipodi:role="line"
id="tspan6649"
x="194.12859"
y="179.89624"
style="fill:#dde0a5;fill-opacity:1;stroke-width:0.26458335px">+</tspan></text>
</g>
<use
height="100%"
width="100%"
@ -1421,72 +1356,6 @@
x="106.28822"
y="164.41965"
ry="0" />
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:7.05555582px;line-height:6.61458349px;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;opacity:1;fill:#c9d8ef;fill-opacity:1;stroke:#395665;stroke-width:0.18520834;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
x="122.49858"
y="176.74901"
id="text6476"><tspan
sodipodi:role="line"
id="tspan6474"
x="122.49858"
y="176.74901"
style="font-size:7.05555582px;fill:#c9d8ef;fill-opacity:1;stroke:#395665;stroke-width:0.18520834;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1">Initiative</tspan></text>
<text
id="text6572"
y="193.22876"
x="114.94691"
style="font-style:normal;font-weight:normal;font-size:7.05555582px;line-height:6.61458349px;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;opacity:1;fill:#c9d8ef;fill-opacity:1;stroke:#395665;stroke-width:0.18520834;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
xml:space="preserve"><tspan
style="font-size:7.05555582px;fill:#c9d8ef;fill-opacity:1;stroke:#395665;stroke-width:0.18520834;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
y="193.22876"
x="114.94691"
id="tspan6570"
sodipodi:role="line">Hull capacity</tspan></text>
<text
id="text6576"
y="210.2377"
x="111.0643"
style="font-style:normal;font-weight:normal;font-size:7.05555582px;line-height:6.61458349px;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;opacity:1;fill:#c9d8ef;fill-opacity:1;stroke:#395665;stroke-width:0.18520834;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
xml:space="preserve"><tspan
style="font-size:7.05555582px;fill:#c9d8ef;fill-opacity:1;stroke:#395665;stroke-width:0.18520834;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
y="210.2377"
x="111.0643"
id="tspan6574"
sodipodi:role="line">Shield capacity</tspan></text>
<text
id="text6580"
y="227.24663"
x="111.12289"
style="font-style:normal;font-weight:normal;font-size:7.05555582px;line-height:6.61458349px;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;opacity:1;fill:#c9d8ef;fill-opacity:1;stroke:#395665;stroke-width:0.18520834;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
xml:space="preserve"><tspan
style="font-size:7.05555582px;fill:#c9d8ef;fill-opacity:1;stroke:#395665;stroke-width:0.18520834;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
y="227.24663"
x="111.12289"
id="tspan6578"
sodipodi:role="line">Power capacity</tspan></text>
<text
id="text6584"
y="244.25557"
x="115.92712"
style="font-style:normal;font-weight:normal;font-size:7.05555582px;line-height:6.61458349px;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;opacity:1;fill:#c9d8ef;fill-opacity:1;stroke:#395665;stroke-width:0.18520834;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
xml:space="preserve"><tspan
style="font-size:7.05555582px;fill:#c9d8ef;fill-opacity:1;stroke:#395665;stroke-width:0.18520834;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
y="244.25557"
x="115.92712"
id="tspan6582"
sodipodi:role="line">Initial power</tspan></text>
<text
id="text6588"
y="261.26443"
x="110.57858"
style="font-style:normal;font-weight:normal;font-size:7.05555582px;line-height:6.61458349px;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;opacity:1;fill:#c9d8ef;fill-opacity:1;stroke:#395665;stroke-width:0.18520834;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
xml:space="preserve"><tspan
style="font-size:7.05555582px;fill:#c9d8ef;fill-opacity:1;stroke:#395665;stroke-width:0.18520834;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
y="261.26443"
x="110.57858"
id="tspan6586"
sodipodi:role="line">Power recovery</tspan></text>
<use
x="0"
y="0"
@ -1495,72 +1364,6 @@
transform="translate(106.1661,-6.7705059e-6)"
width="100%"
height="100%" />
<text
id="text6733"
y="176.75209"
x="228.48232"
style="font-style:normal;font-weight:normal;font-size:7.05555582px;line-height:6.61458349px;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;opacity:1;fill:#c9d8ef;fill-opacity:1;stroke:#395665;stroke-width:0.18520834;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
xml:space="preserve"><tspan
style="font-size:7.05555582px;fill:#c9d8ef;fill-opacity:1;stroke:#395665;stroke-width:0.18520834;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
y="176.75209"
x="228.48232"
id="tspan6731"
sodipodi:role="line">Materials</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:7.05555582px;line-height:6.61458349px;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;opacity:1;fill:#c9d8ef;fill-opacity:1;stroke:#395665;stroke-width:0.18520834;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
x="225.41618"
y="193.761"
id="text6737"><tspan
sodipodi:role="line"
id="tspan6735"
x="225.41618"
y="193.761"
style="font-size:7.05555582px;fill:#c9d8ef;fill-opacity:1;stroke:#395665;stroke-width:0.18520834;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1">Electronics</tspan></text>
<text
id="text6741"
y="209.97757"
x="232.23058"
style="font-style:normal;font-weight:normal;font-size:7.05555582px;line-height:6.61458349px;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;opacity:1;fill:#c9d8ef;fill-opacity:1;stroke:#395665;stroke-width:0.18520834;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
xml:space="preserve"><tspan
style="font-size:7.05555582px;fill:#c9d8ef;fill-opacity:1;stroke:#395665;stroke-width:0.18520834;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
y="209.97757"
x="232.23058"
id="tspan6739"
sodipodi:role="line">Energy</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:7.05555582px;line-height:6.61458349px;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;opacity:1;fill:#c9d8ef;fill-opacity:1;stroke:#395665;stroke-width:0.18520834;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
x="232.05659"
y="227.67035"
id="text6745"><tspan
sodipodi:role="line"
id="tspan6743"
x="232.05659"
y="227.67035"
style="font-size:7.05555582px;fill:#c9d8ef;fill-opacity:1;stroke:#395665;stroke-width:0.18520834;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1">Human</tspan></text>
<text
id="text6749"
y="244.10396"
x="231.84818"
style="font-style:normal;font-weight:normal;font-size:7.05555582px;line-height:6.61458349px;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;opacity:1;fill:#c9d8ef;fill-opacity:1;stroke:#395665;stroke-width:0.18520834;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
xml:space="preserve"><tspan
style="font-size:7.05555582px;fill:#c9d8ef;fill-opacity:1;stroke:#395665;stroke-width:0.18520834;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
y="244.10396"
x="231.84818"
id="tspan6747"
sodipodi:role="line">Gravity</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:7.05555582px;line-height:6.61458349px;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;opacity:1;fill:#c9d8ef;fill-opacity:1;stroke:#395665;stroke-width:0.18520834;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
x="236.39742"
y="261.79672"
id="text6753"><tspan
sodipodi:role="line"
id="tspan6751"
x="236.39742"
y="261.79672"
style="font-size:7.05555582px;fill:#c9d8ef;fill-opacity:1;stroke:#395665;stroke-width:0.18520834;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1">Time</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:8.46666718px;line-height:6.61458349px;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;writing-mode:tb-rl;text-orientation:upright;fill:#d8daf5;fill-opacity:0.07835053;stroke:none;stroke-width:0.26458335px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
@ -1584,6 +1387,210 @@
y="204.61549"
style="font-size:6.3499999px;writing-mode:tb-rl;text-orientation:upright;fill:#1e1f21;fill-opacity:1;stroke-width:0.26458335px">| SKILLS |</tspan></text>
</g>
<g
inkscape:groupmode="layer"
id="layer11"
inkscape:label="Attributes Var"
style="display:inline">
<g
id="g6665"
transform="matrix(0.99999999,0,0,0.93590182,96.497863,8.8615076)"
style="display:inline;opacity:1">
<path
style="fill:#267482;fill-opacity:1;stroke-width:0.76175737;stroke-miterlimit:4;stroke-dasharray:none"
d="m 206.30486,176.57861 c 0,3.11015 -5.91849,5.63143 -13.21933,5.63143 v -11.26285 c 7.30083,0 13.21932,2.52127 13.21933,5.63142 z"
id="path6647"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cccc" />
<g
aria-label="+"
style="font-style:normal;font-weight:normal;font-size:10.58333397px;line-height:6.61458349px;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#dde0a5;fill-opacity:1;stroke:none;stroke-width:0.26458335px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter7193)"
id="text6651">
<path
d="m 198.99651,173.26099 v 2.87837 h 2.87837 v 0.8785 h -2.87837 v 2.87838 h -0.86817 v -2.87838 h -2.87838 v -0.8785 h 2.87838 v -2.87837 z"
style="fill:#dde0a5;fill-opacity:1;stroke-width:0.26458335px"
id="path4970"
inkscape:connector-curvature="0" />
</g>
</g>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:7.05555582px;line-height:6.61458349px;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;display:inline;opacity:1;fill:#c9d8ef;fill-opacity:1;stroke:#395665;stroke-width:0.185;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
x="122.49858"
y="176.74901"
id="text6476"><tspan
sodipodi:role="line"
id="tspan6474"
x="122.49858"
y="176.74901"
style="font-size:7.05555582px;fill:#c9d8ef;fill-opacity:1;stroke:#395665;stroke-width:0.185;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1">Initiative</tspan></text>
<text
id="text6572"
y="193.22876"
x="114.94691"
style="font-style:normal;font-weight:normal;font-size:7.05555582px;line-height:6.61458349px;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;display:inline;opacity:1;fill:#c9d8ef;fill-opacity:1;stroke:#395665;stroke-width:0.18520834;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
xml:space="preserve"><tspan
style="font-size:7.05555582px;fill:#c9d8ef;fill-opacity:1;stroke:#395665;stroke-width:0.18520834;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
y="193.22876"
x="114.94691"
id="tspan6570"
sodipodi:role="line">Hull capacity</tspan></text>
<text
id="text6576"
y="210.2377"
x="111.0643"
style="font-style:normal;font-weight:normal;font-size:7.05555582px;line-height:6.61458349px;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;display:inline;opacity:1;fill:#c9d8ef;fill-opacity:1;stroke:#395665;stroke-width:0.18520834;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
xml:space="preserve"><tspan
style="font-size:7.05555582px;fill:#c9d8ef;fill-opacity:1;stroke:#395665;stroke-width:0.18520834;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
y="210.2377"
x="111.0643"
id="tspan6574"
sodipodi:role="line">Shield capacity</tspan></text>
<text
id="text6580"
y="227.24663"
x="111.12289"
style="font-style:normal;font-weight:normal;font-size:7.05555582px;line-height:6.61458349px;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;display:inline;opacity:1;fill:#c9d8ef;fill-opacity:1;stroke:#395665;stroke-width:0.18520834;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
xml:space="preserve"><tspan
style="font-size:7.05555582px;fill:#c9d8ef;fill-opacity:1;stroke:#395665;stroke-width:0.18520834;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
y="227.24663"
x="111.12289"
id="tspan6578"
sodipodi:role="line">Power capacity</tspan></text>
<text
id="text6584"
y="244.25557"
x="115.92712"
style="font-style:normal;font-weight:normal;font-size:7.05555582px;line-height:6.61458349px;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;display:inline;opacity:1;fill:#c9d8ef;fill-opacity:1;stroke:#395665;stroke-width:0.18520834;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
xml:space="preserve"><tspan
style="font-size:7.05555582px;fill:#c9d8ef;fill-opacity:1;stroke:#395665;stroke-width:0.18520834;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
y="244.25557"
x="115.92712"
id="tspan6582"
sodipodi:role="line">Initial power</tspan></text>
<text
id="text6588"
y="261.26443"
x="110.57858"
style="font-style:normal;font-weight:normal;font-size:7.05555582px;line-height:6.61458349px;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;display:inline;opacity:1;fill:#c9d8ef;fill-opacity:1;stroke:#395665;stroke-width:0.18520834;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
xml:space="preserve"><tspan
style="font-size:7.05555582px;fill:#c9d8ef;fill-opacity:1;stroke:#395665;stroke-width:0.18520834;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
y="261.26443"
x="110.57858"
id="tspan6586"
sodipodi:role="line">Power recovery</tspan></text>
<text
id="text6733"
y="176.75209"
x="228.48232"
style="font-style:normal;font-weight:normal;font-size:7.05555582px;line-height:6.61458349px;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;display:inline;opacity:1;fill:#c9d8ef;fill-opacity:1;stroke:#395665;stroke-width:0.18520834;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
xml:space="preserve"><tspan
style="font-size:7.05555582px;fill:#c9d8ef;fill-opacity:1;stroke:#395665;stroke-width:0.18520834;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
y="176.75209"
x="228.48232"
id="tspan6731"
sodipodi:role="line">Materials</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:7.05555582px;line-height:6.61458349px;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;display:inline;opacity:1;fill:#c9d8ef;fill-opacity:1;stroke:#395665;stroke-width:0.18520834;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
x="225.41618"
y="193.761"
id="text6737"><tspan
sodipodi:role="line"
id="tspan6735"
x="225.41618"
y="193.761"
style="font-size:7.05555582px;fill:#c9d8ef;fill-opacity:1;stroke:#395665;stroke-width:0.18520834;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1">Electronics</tspan></text>
<text
id="text6741"
y="209.97757"
x="232.23058"
style="font-style:normal;font-weight:normal;font-size:7.05555582px;line-height:6.61458349px;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;display:inline;opacity:1;fill:#c9d8ef;fill-opacity:1;stroke:#395665;stroke-width:0.18520834;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
xml:space="preserve"><tspan
style="font-size:7.05555582px;fill:#c9d8ef;fill-opacity:1;stroke:#395665;stroke-width:0.18520834;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
y="209.97757"
x="232.23058"
id="tspan6739"
sodipodi:role="line">Energy</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:7.05555582px;line-height:6.61458349px;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;display:inline;opacity:1;fill:#c9d8ef;fill-opacity:1;stroke:#395665;stroke-width:0.18520834;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
x="232.05659"
y="227.67035"
id="text6745"><tspan
sodipodi:role="line"
id="tspan6743"
x="232.05659"
y="227.67035"
style="font-size:7.05555582px;fill:#c9d8ef;fill-opacity:1;stroke:#395665;stroke-width:0.18520834;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1">Human</tspan></text>
<text
id="text6749"
y="244.10396"
x="231.84818"
style="font-style:normal;font-weight:normal;font-size:7.05555582px;line-height:6.61458349px;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;display:inline;opacity:1;fill:#c9d8ef;fill-opacity:1;stroke:#395665;stroke-width:0.18520834;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
xml:space="preserve"><tspan
style="font-size:7.05555582px;fill:#c9d8ef;fill-opacity:1;stroke:#395665;stroke-width:0.18520834;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
y="244.10396"
x="231.84818"
id="tspan6747"
sodipodi:role="line">Gravity</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:7.05555582px;line-height:6.61458349px;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;display:inline;opacity:1;fill:#c9d8ef;fill-opacity:1;stroke:#395665;stroke-width:0.18520834;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
x="236.39742"
y="261.79672"
id="text6753"><tspan
sodipodi:role="line"
id="tspan6751"
x="236.39742"
y="261.79672"
style="font-size:7.05555582px;fill:#c9d8ef;fill-opacity:1;stroke:#395665;stroke-width:0.18520834;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1">Time</tspan></text>
<text
transform="translate(-22.755693,-26.728013)"
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:6.3499999px;line-height:6.61458349px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';letter-spacing:0px;word-spacing:0px;display:inline;opacity:1;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.26458335px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
x="194.33784"
y="203.16125"
id="text6516"><tspan
sodipodi:role="line"
id="tspan6514"
x="194.33784"
y="203.16125"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:6.3499999px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#ffffff;fill-opacity:1;stroke-width:0.26458335px">35</tspan></text>
<text
transform="translate(7.4083334)"
id="text6637"
y="281.94846"
x="271.37729"
style="font-style:normal;font-weight:normal;font-size:10.58333397px;line-height:6.61458349px;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;display:inline;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.26458335px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
xml:space="preserve"><tspan
style="fill:#ffffff;fill-opacity:1;stroke-width:0.26458335px"
y="281.94846"
x="271.37729"
id="tspan6635"
sodipodi:role="line">0</tspan></text>
<text
transform="translate(-26.987511)"
id="text6631"
y="282.02341"
x="169.983"
style="font-style:normal;font-weight:normal;font-size:10.58333397px;line-height:6.61458349px;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;display:inline;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.26458335px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
xml:space="preserve"><tspan
style="fill:#ffffff;fill-opacity:1;stroke-width:0.26458335px"
y="282.02341"
x="169.983"
id="tspan6629"
sodipodi:role="line">2</tspan></text>
<path
style="display:inline;opacity:1;fill:#d7d07d;fill-opacity:1;stroke:none;stroke-width:0.58238131;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;filter:url(#filter9551)"
d="m 517.54102,1067.4453 -0.96875,7.6934 h 72.14257 l -0.96875,-7.6934 z"
id="path4776"
inkscape:connector-curvature="0"
inkscape:export-filename="/home/michael/workspace/perso/spacetac/out/assets/images/character/experience.png"
inkscape:export-xdpi="96"
inkscape:export-ydpi="96"
transform="scale(0.26458334)" />
</g>
<g
inkscape:groupmode="layer"
id="layer3"

Before

Width:  |  Height:  |  Size: 69 KiB

After

Width:  |  Height:  |  Size: 70 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 116 KiB

After

Width:  |  Height:  |  Size: 57 KiB

View file

@ -5,15 +5,15 @@ module TS.SpaceTac {
var fleet2 = new Fleet();
var ship1 = new Ship(fleet1, "F1S1");
ship1.setAttribute("initiative", 2);
ship1.setAttribute("maneuvrability", 2);
var ship2 = new Ship(fleet1, "F1S2");
ship2.setAttribute("initiative", 4);
ship2.setAttribute("maneuvrability", 4);
var ship3 = new Ship(fleet1, "F1S3");
ship3.setAttribute("initiative", 1);
ship3.setAttribute("maneuvrability", 1);
var ship4 = new Ship(fleet2, "F2S1");
ship4.setAttribute("initiative", 8);
ship4.setAttribute("maneuvrability", 8);
var ship5 = new Ship(fleet2, "F2S2");
ship5.setAttribute("initiative", 2);
ship5.setAttribute("maneuvrability", 2);
var battle = new Battle(fleet1, fleet2);
expect(battle.play_order.length).toBe(0);
@ -77,7 +77,7 @@ module TS.SpaceTac {
expect(battle.playing_ship_index).toBeNull();
// Force play order
iforeach(battle.iships(), ship => ship.setAttribute("initiative", 1));
iforeach(battle.iships(), ship => ship.setAttribute("maneuvrability", 1));
var gen = new SkewedRandomGenerator([0.1, 0.2, 0.0]);
battle.throwInitiative(gen);

View file

@ -37,7 +37,7 @@ module TS.SpaceTac.Specs {
// Force lucky finds with one template
var looter = new LootGenerator(random, false);
var template = new LootTemplate(SlotType.Power, "Nuclear Reactor");
template.setSkillsRequirements({ "skill_energy": istep(4) });
template.setSkillsRequirements({ "skill_photons": istep(4) });
template.addAttributeEffect("power_capacity", 1);
looter.templates = [template];
spyOn(outcome, "getLootGenerator").and.returnValue(looter);
@ -49,11 +49,11 @@ module TS.SpaceTac.Specs {
expect(outcome.loot[1].name).toBe("Nuclear Reactor");
expect(outcome.loot[1].level).toBe(4);
expect(outcome.loot[1].quality).toBe(EquipmentQuality.COMMON);
expect(outcome.loot[1].requirements).toEqual({ "skill_energy": 7 });
expect(outcome.loot[1].requirements).toEqual({ "skill_photons": 7 });
expect(outcome.loot[2].name).toBe("Nuclear Reactor");
expect(outcome.loot[2].level).toBe(6);
expect(outcome.loot[2].quality).toBe(EquipmentQuality.PREMIUM);
expect(outcome.loot[2].requirements).toEqual({ "skill_energy": 9 });
expect(outcome.loot[2].requirements).toEqual({ "skill_photons": 9 });
});
it("grants experience", function () {

View file

@ -94,9 +94,9 @@ module TS.SpaceTac {
drone.duration = 3;
drone.effects = [
new DamageEffect(5),
new AttributeEffect("skill_human", 1)
new AttributeEffect("skill_quantum", 1)
]
expect(drone.getDescription()).toEqual("For 3 activations:\n• do 5 damage\n• human skill +1");
expect(drone.getDescription()).toEqual("For 3 activations:\n• do 5 damage\n• quantum skill +1");
});
});
}

View file

@ -34,11 +34,11 @@ module TS.SpaceTac.Specs {
expect(equipment.canBeEquipped(ship.attributes)).toBe(true);
// Second requirement
equipment.requirements["skill_material"] = 3;
equipment.requirements["skill_materials"] = 3;
expect(equipment.canBeEquipped(ship.attributes)).toBe(false);
ship.attributes.skill_material.set(4);
ship.attributes.skill_materials.set(4);
expect(equipment.canBeEquipped(ship.attributes)).toBe(true);
});
@ -65,7 +65,7 @@ module TS.SpaceTac.Specs {
let equipment = new Equipment();
expect(equipment.getMinimumLevel()).toBe(1);
equipment.requirements["skill_human"] = 10;
equipment.requirements["skill_quantum"] = 10;
expect(equipment.getMinimumLevel()).toBe(1);
equipment.requirements["skill_time"] = 1;
@ -74,7 +74,7 @@ module TS.SpaceTac.Specs {
equipment.requirements["skill_gravity"] = 2;
expect(equipment.getMinimumLevel()).toBe(2);
equipment.requirements["skill_electronics"] = 4;
equipment.requirements["skill_antimatter"] = 4;
expect(equipment.getMinimumLevel()).toBe(3);
});

View file

@ -33,23 +33,23 @@ module TS.SpaceTac.Specs {
it("applies requirements on skills", function () {
let template = new LootTemplate(SlotType.Hull, "Hull");
template.setSkillsRequirements({ "skill_energy": 1, "skill_gravity": istep(2, istep(1)) });
template.setSkillsRequirements({ "skill_photons": 1, "skill_gravity": istep(2, istep(1)) });
let result = template.generate(1);
expect(result.requirements).toEqual({
"skill_energy": 1,
"skill_photons": 1,
"skill_gravity": 2
});
result = template.generate(2);
expect(result.requirements).toEqual({
"skill_energy": 2,
"skill_photons": 2,
"skill_gravity": 3
});
result = template.generate(10);
expect(result.requirements).toEqual({
"skill_energy": 10,
"skill_photons": 10,
"skill_gravity": 47
});
});
@ -123,7 +123,7 @@ module TS.SpaceTac.Specs {
let template = new LootTemplate(SlotType.Weapon, "Weapon");
expect(template.hasDamageEffect()).toBe(false);
template.addAttributeEffect("initiative", 1);
template.addAttributeEffect("maneuvrability", 1);
expect(template.hasDamageEffect()).toBe(false);
template.addFireAction(1, 50, 50, [new EffectTemplate(new BaseEffect("test"), {})]);

View file

@ -291,14 +291,13 @@ module TS.SpaceTac.Specs {
let power_generator = new Equipment(SlotType.Power);
power_generator.effects = [
new AttributeEffect("power_capacity", 8),
new AttributeEffect("power_recovery", 3),
new AttributeEffect("power_initial", 4)
new AttributeEffect("power_generation", 3),
]
ship.addSlot(SlotType.Power).attach(power_generator);
expect(ship.values.power.get()).toBe(0);
ship.initializeActionPoints();
expect(ship.values.power.get()).toBe(4);
expect(ship.values.power.get()).toBe(8);
ship.values.power.set(3);
expect(ship.values.power.get()).toBe(3);
ship.recoverActionPoints();
@ -424,13 +423,13 @@ module TS.SpaceTac.Specs {
let slot = ship.addSlot(SlotType.Hull);
expect(ship.canEquip(equipment)).toBe(slot);
equipment.requirements["skill_energy"] = 2;
equipment.requirements["skill_photons"] = 2;
expect(ship.canEquip(equipment)).toBe(null);
ship.upgradeSkill("skill_energy");
ship.upgradeSkill("skill_photons");
expect(ship.canEquip(equipment)).toBe(null);
ship.upgradeSkill("skill_energy");
ship.upgradeSkill("skill_photons");
expect(ship.canEquip(equipment)).toBe(slot);
slot.attach(new Equipment(SlotType.Hull));
@ -446,17 +445,17 @@ module TS.SpaceTac.Specs {
expect(ship.level.get()).toBe(2);
expect(ship.getAvailableUpgradePoints()).toBe(15);
expect(ship.getAttribute("skill_energy")).toBe(0);
ship.upgradeSkill("skill_energy");
expect(ship.getAttribute("skill_energy")).toBe(1);
expect(ship.getAttribute("skill_photons")).toBe(0);
ship.upgradeSkill("skill_photons");
expect(ship.getAttribute("skill_photons")).toBe(1);
range(50).forEach(() => ship.upgradeSkill("skill_gravity"));
expect(ship.getAttribute("skill_energy")).toBe(1);
expect(ship.getAttribute("skill_photons")).toBe(1);
expect(ship.getAttribute("skill_gravity")).toBe(14);
expect(ship.getAvailableUpgradePoints()).toBe(0);
ship.updateAttributes();
expect(ship.getAttribute("skill_energy")).toBe(1);
expect(ship.getAttribute("skill_photons")).toBe(1);
expect(ship.getAttribute("skill_gravity")).toBe(14);
});

View file

@ -8,30 +8,30 @@ module TS.SpaceTac {
*/
export class ShipSkills {
// Skills
skill_material = new ShipAttribute("material skill")
skill_energy = new ShipAttribute("energy skill")
skill_electronics = new ShipAttribute("electronics skill")
skill_human = new ShipAttribute("human skill")
skill_time = new ShipAttribute("time skill")
skill_materials = new ShipAttribute("materials skill")
skill_photons = new ShipAttribute("photons skill")
skill_antimatter = new ShipAttribute("antimatter skill")
skill_quantum = new ShipAttribute("quantum skill")
skill_gravity = new ShipAttribute("gravity skill")
skill_time = new ShipAttribute("time skill")
}
/**
* Set of ShipAttribute for a ship
*/
export class ShipAttributes extends ShipSkills {
// Attribute controlling the play order
initiative = new ShipAttribute("initiative")
// Maximal hull value
hull_capacity = new ShipAttribute("hull capacity")
// Maximal shield value
shield_capacity = new ShipAttribute("shield capacity")
// Maximal power value
power_capacity = new ShipAttribute("power capacity")
// Initial power value at the start of a battle
power_initial = new ShipAttribute("initial power")
// Power value recovered each turn
power_recovery = new ShipAttribute("power recovery")
power_generation = new ShipAttribute("power generation")
// Ability to move first and fast
maneuvrability = new ShipAttribute("maneuvrability")
// Ability to fire far and good
precision = new ShipAttribute("precision")
}
/**
@ -153,7 +153,7 @@ module TS.SpaceTac {
// Make an initiative throw, to resolve play order in a battle
throwInitiative(gen: RandomGenerator): void {
this.play_priority = gen.random() * this.attributes.initiative.get();
this.play_priority = gen.random() * this.attributes.maneuvrability.get();
}
// Return the player owning this ship
@ -289,7 +289,7 @@ module TS.SpaceTac {
// If no value is provided, the attribute ap_initial will be used
initializeActionPoints(value: number | null = null): void {
if (value === null) {
value = this.attributes.power_initial.get();
value = this.attributes.power_capacity.get();
}
this.setValue("power", value);
}
@ -300,7 +300,7 @@ module TS.SpaceTac {
recoverActionPoints(value: number | null = null): void {
if (this.alive) {
if (value === null) {
value = this.attributes.power_recovery.get();
value = this.attributes.power_generation.get();
}
this.setValue("power", value, true);
}

View file

@ -14,7 +14,7 @@ module TS.SpaceTac.Specs {
expect(ship.slots[4].type).toBe(SlotType.Weapon);
expect(ship.slots[5].type).toBe(SlotType.Weapon);
expect(ship.slots[6].type).toBe(SlotType.Weapon);
expect(ship.getAttribute("skill_material")).toBe(1);
expect(ship.getAttribute("skill_materials")).toBe(1);
});
});
}

View file

@ -4,15 +4,13 @@ module TS.SpaceTac.Specs {
let ship = new Ship();
expect(ship.getAttribute("power_capacity")).toBe(0);
expect(ship.getAttribute("power_initial")).toBe(0);
expect(ship.getAttribute("power_recovery")).toBe(0);
expect(ship.getAttribute("power_generation")).toBe(0);
expect(ship.getValue("power")).toBe(0);
TestTools.setShipAP(ship, 12, 4);
expect(ship.getAttribute("power_capacity")).toBe(12);
expect(ship.getAttribute("power_initial")).toBe(12);
expect(ship.getAttribute("power_recovery")).toBe(4);
expect(ship.getAttribute("power_generation")).toBe(4);
expect(ship.getValue("power")).toBe(12);
});

View file

@ -59,10 +59,8 @@ module TS.SpaceTac {
if (effect instanceof AttributeEffect) {
if (effect.attrcode === "power_capacity") {
effect.value = points;
} else if (effect.attrcode === "power_recovery") {
} else if (effect.attrcode === "power_generation") {
effect.value = recovery;
} else if (effect.attrcode === "power_initial") {
effect.value = points;
}
}
});

View file

@ -44,7 +44,7 @@ module TS.SpaceTac.Specs {
let ship = battle.fleets[0].addShip();
TestTools.addEngine(ship, 500);
let drone = new Drone(ship);
drone.effects = [new AttributeEffect("initiative", 1)];
drone.effects = [new AttributeEffect("maneuvrability", 1)];
drone.x = 100;
drone.y = 0;
drone.radius = 50;
@ -56,7 +56,7 @@ module TS.SpaceTac.Specs {
maneuver = new Maneuver(ship, new MoveAction(new Equipment()), Target.newFromLocation(100, 30));
expect(maneuver.getFinalLocation()).toEqual(jasmine.objectContaining({ x: 100, y: 30 }));
expect(maneuver.effects).toEqual([[ship, new AttributeEffect("initiative", 1)]]);
expect(maneuver.effects).toEqual([[ship, new AttributeEffect("maneuvrability", 1)]]);
});
});
}

View file

@ -144,7 +144,7 @@ module TS.SpaceTac {
* Evaluate doing nothing, between -1 and 1
*/
static evaluateIdling(ship: Ship, battle: Battle, maneuver: Maneuver): number {
let lost = ship.getValue("power") - maneuver.getPowerUsage() + ship.getAttribute("power_recovery") - ship.getAttribute("power_capacity");
let lost = ship.getValue("power") - maneuver.getPowerUsage() + ship.getAttribute("power_generation") - ship.getAttribute("power_capacity");
if (lost > 0) {
return -lost / ship.getAttribute("power_capacity");
} else if (maneuver.action instanceof FireWeaponAction || maneuver.action instanceof DeployDroneAction) {

View file

@ -2,20 +2,20 @@ module TS.SpaceTac {
describe("AttributeEffect", function () {
it("is not applied directly", function () {
let ship = new Ship();
expect(ship.getAttribute("initiative")).toBe(0);
expect(ship.getAttribute("maneuvrability")).toBe(0);
let effect = new AttributeEffect("initiative", 20);
let effect = new AttributeEffect("maneuvrability", 20);
effect.applyOnShip(ship, ship);
expect(ship.getAttribute("initiative")).toBe(0);
expect(ship.getAttribute("maneuvrability")).toBe(0);
ship.sticky_effects.push(new StickyEffect(effect, 2));
ship.updateAttributes();
expect(ship.getAttribute("initiative")).toBe(20);
expect(ship.getAttribute("maneuvrability")).toBe(20);
});
it("has a description", function () {
let effect = new AttributeEffect("initiative", 12);
expect(effect.getDescription()).toEqual("initiative +12");
let effect = new AttributeEffect("maneuvrability", 12);
expect(effect.getDescription()).toEqual("maneuvrability +12");
effect = new AttributeEffect("shield_capacity", -4);
expect(effect.getDescription()).toEqual("shield capacity -4");

View file

@ -4,19 +4,19 @@ module TS.SpaceTac.Equipments {
let template = new ForceField();
let equipment = template.generate(1);
expect(equipment.requirements).toEqual({ "skill_energy": 1 });
expect(equipment.requirements).toEqual({ "skill_photons": 1 });
expect(equipment.effects).toEqual([new AttributeEffect("shield_capacity", 100)]);
equipment = template.generate(2);
expect(equipment.requirements).toEqual({ "skill_energy": 3 });
expect(equipment.requirements).toEqual({ "skill_photons": 3 });
expect(equipment.effects).toEqual([new AttributeEffect("shield_capacity", 140)]);
equipment = template.generate(3);
expect(equipment.requirements).toEqual({ "skill_energy": 5 });
expect(equipment.requirements).toEqual({ "skill_photons": 5 });
expect(equipment.effects).toEqual([new AttributeEffect("shield_capacity", 180)]);
equipment = template.generate(10);
expect(equipment.requirements).toEqual({ "skill_energy": 19 });
expect(equipment.requirements).toEqual({ "skill_photons": 19 });
expect(equipment.effects).toEqual([new AttributeEffect("shield_capacity", 460)]);
});
});

View file

@ -5,7 +5,7 @@ module TS.SpaceTac.Equipments {
constructor() {
super(SlotType.Shield, "Force Field", "A basic force field, generated by radiating waves of compressed energy");
this.setSkillsRequirements({ "skill_energy": istep(1, irepeat(2)) });
this.setSkillsRequirements({ "skill_photons": istep(1, irepeat(2)) });
this.addAttributeEffect("shield_capacity", istep(100, irepeat(40)));
}
}

View file

@ -4,19 +4,19 @@ module TS.SpaceTac.Equipments {
let template = new GatlingGun();
let equipment = template.generate(1);
expect(equipment.requirements).toEqual({ "skill_material": 1 });
expect(equipment.requirements).toEqual({ "skill_materials": 1 });
expect(equipment.action).toEqual(new FireWeaponAction(equipment, 3, 600, 0, [new DamageEffect(30, 20)]));
equipment = template.generate(2);
expect(equipment.requirements).toEqual({ "skill_material": 2 });
expect(equipment.requirements).toEqual({ "skill_materials": 2 });
expect(equipment.action).toEqual(new FireWeaponAction(equipment, 3, 600, 0, [new DamageEffect(35, 25)]));
equipment = template.generate(3);
expect(equipment.requirements).toEqual({ "skill_material": 3 });
expect(equipment.requirements).toEqual({ "skill_materials": 3 });
expect(equipment.action).toEqual(new FireWeaponAction(equipment, 3, 600, 0, [new DamageEffect(40, 30)]));
equipment = template.generate(10);
expect(equipment.requirements).toEqual({ "skill_material": 10 });
expect(equipment.requirements).toEqual({ "skill_materials": 10 });
expect(equipment.action).toEqual(new FireWeaponAction(equipment, 3, 600, 0, [new DamageEffect(75, 65)]));
});
});

View file

@ -5,7 +5,7 @@ module TS.SpaceTac.Equipments {
constructor() {
super(SlotType.Weapon, "Gatling Gun", "Mechanical weapon using loads of metal bullets propelled by guided explosions");
this.setSkillsRequirements({ "skill_material": 1 });
this.setSkillsRequirements({ "skill_materials": 1 });
this.setCooldown(irepeat(2), irepeat(2));
this.addFireAction(irepeat(3), irepeat(600), 0, [
new EffectTemplate(new DamageEffect(), { base: istep(30, irepeat(5)), span: istep(20, irepeat(5)) })

View file

@ -4,19 +4,19 @@ module TS.SpaceTac.Equipments {
let template = new IronHull();
let equipment = template.generate(1);
expect(equipment.requirements).toEqual({ "skill_material": 1 });
expect(equipment.requirements).toEqual({ "skill_materials": 1 });
expect(equipment.effects).toEqual([new AttributeEffect("hull_capacity", 200)]);
equipment = template.generate(2);
expect(equipment.requirements).toEqual({ "skill_material": 2 });
expect(equipment.requirements).toEqual({ "skill_materials": 2 });
expect(equipment.effects).toEqual([new AttributeEffect("hull_capacity", 220)]);
equipment = template.generate(3);
expect(equipment.requirements).toEqual({ "skill_material": 3 });
expect(equipment.requirements).toEqual({ "skill_materials": 3 });
expect(equipment.effects).toEqual([new AttributeEffect("hull_capacity", 240)]);
equipment = template.generate(10);
expect(equipment.requirements).toEqual({ "skill_material": 10 });
expect(equipment.requirements).toEqual({ "skill_materials": 10 });
expect(equipment.effects).toEqual([new AttributeEffect("hull_capacity", 380)]);
});
});

View file

@ -5,7 +5,7 @@ module TS.SpaceTac.Equipments {
constructor() {
super(SlotType.Hull, "Iron Hull", "Protective hull, based on layered iron alloys");
this.setSkillsRequirements({ "skill_material": 1 });
this.setSkillsRequirements({ "skill_materials": 1 });
this.addAttributeEffect("hull_capacity", istep(200, irepeat(20)));
}
}

View file

@ -4,39 +4,35 @@ module TS.SpaceTac.Equipments {
let template = new NuclearReactor();
let equipment = template.generate(1);
expect(equipment.requirements).toEqual({ "skill_energy": 1 });
expect(equipment.requirements).toEqual({ "skill_photons": 1 });
expect(equipment.effects).toEqual([
new AttributeEffect("initiative", 1),
new AttributeEffect("power_capacity", 8),
new AttributeEffect("power_initial", 5),
new AttributeEffect("power_recovery", 4),
new AttributeEffect("maneuvrability", 1),
new AttributeEffect("power_capacity", 7),
new AttributeEffect("power_generation", 4),
]);
equipment = template.generate(2);
expect(equipment.requirements).toEqual({ "skill_energy": 2 });
expect(equipment.requirements).toEqual({ "skill_photons": 2 });
expect(equipment.effects).toEqual([
new AttributeEffect("initiative", 2),
new AttributeEffect("power_capacity", 9),
new AttributeEffect("power_initial", 5),
new AttributeEffect("power_recovery", 4),
new AttributeEffect("maneuvrability", 2),
new AttributeEffect("power_capacity", 8),
new AttributeEffect("power_generation", 4),
]);
equipment = template.generate(3);
expect(equipment.requirements).toEqual({ "skill_energy": 3 });
expect(equipment.requirements).toEqual({ "skill_photons": 3 });
expect(equipment.effects).toEqual([
new AttributeEffect("initiative", 3),
new AttributeEffect("power_capacity", 10),
new AttributeEffect("power_initial", 6),
new AttributeEffect("power_recovery", 4),
new AttributeEffect("maneuvrability", 3),
new AttributeEffect("power_capacity", 9),
new AttributeEffect("power_generation", 4),
]);
equipment = template.generate(10);
expect(equipment.requirements).toEqual({ "skill_energy": 10 });
expect(equipment.requirements).toEqual({ "skill_photons": 10 });
expect(equipment.effects).toEqual([
new AttributeEffect("initiative", 10),
new AttributeEffect("power_capacity", 17),
new AttributeEffect("power_initial", 9),
new AttributeEffect("power_recovery", 6),
new AttributeEffect("maneuvrability", 10),
new AttributeEffect("power_capacity", 16),
new AttributeEffect("power_generation", 6),
]);
});
});

View file

@ -5,11 +5,10 @@ module TS.SpaceTac.Equipments {
constructor() {
super(SlotType.Power, "Nuclear Reactor", "A standard nuclear power core, drawing power from atom fusion cycles");
this.setSkillsRequirements({ "skill_energy": 1 });
this.addAttributeEffect("initiative", istep(1));
this.addAttributeEffect("power_capacity", istep(8));
this.addAttributeEffect("power_initial", istep(5, irepeat(0.5)));
this.addAttributeEffect("power_recovery", istep(4, irepeat(0.3)));
this.setSkillsRequirements({ "skill_photons": 1 });
this.addAttributeEffect("maneuvrability", istep(1));
this.addAttributeEffect("power_capacity", istep(7));
this.addAttributeEffect("power_generation", istep(4, irepeat(0.3)));
}
}
}

View file

@ -4,19 +4,19 @@ module TS.SpaceTac.Equipments {
let template = new PowerDepleter();
let equipment = template.generate(1);
expect(equipment.requirements).toEqual({ "skill_energy": 1 });
expect(equipment.requirements).toEqual({ "skill_photons": 1 });
expect(equipment.action).toEqual(new FireWeaponAction(equipment, 4, 500, 0, [new StickyEffect(new AttributeLimitEffect("power_capacity", 3), 2, true)]));
equipment = template.generate(2);
expect(equipment.requirements).toEqual({ "skill_energy": 2 });
expect(equipment.requirements).toEqual({ "skill_photons": 2 });
expect(equipment.action).toEqual(new FireWeaponAction(equipment, 4, 520, 0, [new StickyEffect(new AttributeLimitEffect("power_capacity", 3), 2, true)]));
equipment = template.generate(3);
expect(equipment.requirements).toEqual({ "skill_energy": 3 });
expect(equipment.requirements).toEqual({ "skill_photons": 3 });
expect(equipment.action).toEqual(new FireWeaponAction(equipment, 4, 540, 0, [new StickyEffect(new AttributeLimitEffect("power_capacity", 3), 2, true)]));
equipment = template.generate(10);
expect(equipment.requirements).toEqual({ "skill_energy": 10 });
expect(equipment.requirements).toEqual({ "skill_photons": 10 });
expect(equipment.action).toEqual(new FireWeaponAction(equipment, 4, 680, 0, [new StickyEffect(new AttributeLimitEffect("power_capacity", 3), 2, true)]));
});

View file

@ -5,7 +5,7 @@ module TS.SpaceTac.Equipments {
constructor() {
super(SlotType.Weapon, "Power Depleter", "Direct-hit weapon that creates an energy well near the target, sucking its power surplus");
this.setSkillsRequirements({ "skill_energy": 1 });
this.setSkillsRequirements({ "skill_photons": 1 });
this.setCooldown(irepeat(2), irepeat(3));
this.addFireAction(irepeat(4), istep(500, irepeat(20)), 0, [
new StickyEffectTemplate(new AttributeLimitEffect("power_capacity"), { "value": irepeat(3) }, irepeat(2))

View file

@ -4,19 +4,19 @@ module TS.SpaceTac.Equipments {
let template = new RepairDrone();
let equipment = template.generate(1);
expect(equipment.requirements).toEqual({ "skill_human": 1 });
expect(equipment.requirements).toEqual({ "skill_quantum": 1 });
expect(equipment.action).toEqual(new DeployDroneAction(equipment, 4, 300, 10, 150, [new ValueEffect("hull", 5)]));
equipment = template.generate(2);
expect(equipment.requirements).toEqual({ "skill_human": 2 });
expect(equipment.requirements).toEqual({ "skill_quantum": 2 });
expect(equipment.action).toEqual(new DeployDroneAction(equipment, 4, 310, 11, 155, [new ValueEffect("hull", 6)]));
equipment = template.generate(3);
expect(equipment.requirements).toEqual({ "skill_human": 3 });
expect(equipment.requirements).toEqual({ "skill_quantum": 3 });
expect(equipment.action).toEqual(new DeployDroneAction(equipment, 4, 320, 12, 160, [new ValueEffect("hull", 7)]));
equipment = template.generate(10);
expect(equipment.requirements).toEqual({ "skill_human": 10 });
expect(equipment.requirements).toEqual({ "skill_quantum": 10 });
expect(equipment.action).toEqual(new DeployDroneAction(equipment, 4, 390, 19, 195, [new ValueEffect("hull", 14)]));
});

View file

@ -8,7 +8,7 @@ module TS.SpaceTac.Equipments {
constructor() {
super(SlotType.Weapon, "Repair Drone", "Drone able to repair small hull breaches, remotely controlled by human pilots");
this.setSkillsRequirements({ "skill_human": 1 });
this.setSkillsRequirements({ "skill_quantum": 1 });
this.setCooldown(irepeat(1), istep(3, irepeat(0.2)));
this.addDroneAction(irepeat(4), istep(300, irepeat(10)), istep(10, irepeat(1)), istep(150, irepeat(5)), [
new EffectTemplate(new ValueEffect("hull"), { "value": istep(5) })

View file

@ -4,23 +4,23 @@ module TS.SpaceTac.Equipments {
let template = new RocketEngine();
let equipment = template.generate(1);
expect(equipment.requirements).toEqual({ "skill_energy": 1 });
expect(equipment.effects).toEqual([new AttributeEffect("initiative", 1)]);
expect(equipment.requirements).toEqual({ "skill_photons": 1 });
expect(equipment.effects).toEqual([new AttributeEffect("maneuvrability", 1)]);
expect(equipment.action).toEqual(new MoveAction(equipment, 200));
equipment = template.generate(2);
expect(equipment.requirements).toEqual({ "skill_energy": 2 });
expect(equipment.effects).toEqual([new AttributeEffect("initiative", 2)]);
expect(equipment.requirements).toEqual({ "skill_photons": 2 });
expect(equipment.effects).toEqual([new AttributeEffect("maneuvrability", 2)]);
expect(equipment.action).toEqual(new MoveAction(equipment, 220));
equipment = template.generate(3);
expect(equipment.requirements).toEqual({ "skill_energy": 3 });
expect(equipment.effects).toEqual([new AttributeEffect("initiative", 3)]);
expect(equipment.requirements).toEqual({ "skill_photons": 3 });
expect(equipment.effects).toEqual([new AttributeEffect("maneuvrability", 3)]);
expect(equipment.action).toEqual(new MoveAction(equipment, 240));
equipment = template.generate(10);
expect(equipment.requirements).toEqual({ "skill_energy": 10 });
expect(equipment.effects).toEqual([new AttributeEffect("initiative", 10)]);
expect(equipment.requirements).toEqual({ "skill_photons": 10 });
expect(equipment.effects).toEqual([new AttributeEffect("maneuvrability", 10)]);
expect(equipment.action).toEqual(new MoveAction(equipment, 380));
});
});

View file

@ -5,9 +5,9 @@ module TS.SpaceTac.Equipments {
constructor() {
super(SlotType.Engine, "Rocket Engine", "First-era conventional deep-space engine, based on gas exhausts pushed through a nozzle");
this.setSkillsRequirements({ "skill_energy": 1 });
this.setSkillsRequirements({ "skill_photons": 1 });
this.setCooldown(irepeat(2), 0);
this.addAttributeEffect("initiative", 1);
this.addAttributeEffect("maneuvrability", 1);
this.addMoveAction(istep(200, irepeat(20)));
}
}

View file

@ -4,19 +4,19 @@ module TS.SpaceTac.Equipments {
let template = new SubMunitionMissile();
let equipment = template.generate(1);
expect(equipment.requirements).toEqual({ "skill_material": 1 });
expect(equipment.requirements).toEqual({ "skill_materials": 1 });
expect(equipment.action).toEqual(new FireWeaponAction(equipment, 4, 500, 150, [new DamageEffect(30, 2)]));
equipment = template.generate(2);
expect(equipment.requirements).toEqual({ "skill_material": 2 });
expect(equipment.requirements).toEqual({ "skill_materials": 2 });
expect(equipment.action).toEqual(new FireWeaponAction(equipment, 4, 520, 155, [new DamageEffect(32, 3)]));
equipment = template.generate(3);
expect(equipment.requirements).toEqual({ "skill_material": 3 });
expect(equipment.requirements).toEqual({ "skill_materials": 3 });
expect(equipment.action).toEqual(new FireWeaponAction(equipment, 4, 540, 160, [new DamageEffect(34, 4)]));
equipment = template.generate(10);
expect(equipment.requirements).toEqual({ "skill_material": 10 });
expect(equipment.requirements).toEqual({ "skill_materials": 10 });
expect(equipment.action).toEqual(new FireWeaponAction(equipment, 4, 680, 195, [new DamageEffect(48, 11)]));
});

View file

@ -5,7 +5,7 @@ module TS.SpaceTac.Equipments {
constructor() {
super(SlotType.Weapon, "SubMunition Missile", "Explosive missile releasing small shelled payloads, that will in turn explode on impact");
this.setSkillsRequirements({ "skill_material": 1 });
this.setSkillsRequirements({ "skill_materials": 1 });
this.setCooldown(irepeat(1), 0);
this.addFireAction(irepeat(4), istep(500, irepeat(20)), istep(150, irepeat(5)), [
new EffectTemplate(new DamageEffect(), { base: istep(30, irepeat(2)), span: istep(2, irepeat(1)) })

View file

@ -10,11 +10,11 @@ module TS.SpaceTac.UI.Specs {
expect(sprite.effects.children.length).toBe(0);
sprite.displayValueChanged(new ValueChangeEvent(ship, ship.attributes.power_recovery, -4));
sprite.displayValueChanged(new ValueChangeEvent(ship, ship.attributes.power_generation, -4));
expect(sprite.effects.children.length).toBe(1);
let t1 = <Phaser.Text>sprite.effects.getChildAt(0);
expect(t1.text).toBe("power recovery -4");
expect(t1.text).toBe("power generation -4");
sprite.displayValueChanged(new ValueChangeEvent(ship, ship.values.shield, 12));

View file

@ -137,16 +137,16 @@ module TS.SpaceTac.UI {
let x1 = 664;
let x2 = 1066;
let y = 662;
this.addAttribute("initiative", x1, y);
this.addAttribute("hull_capacity", x1, y + 64);
this.addAttribute("shield_capacity", x1, y + 128);
this.addAttribute("power_capacity", x1, y + 192);
this.addAttribute("power_initial", x1, y + 256);
this.addAttribute("power_recovery", x1, y + 320);
this.addAttribute("skill_material", x2, y);
this.addAttribute("skill_electronics", x2, y + 64);
this.addAttribute("skill_energy", x2, y + 128);
this.addAttribute("skill_human", x2, y + 192);
this.addAttribute("hull_capacity", x1, y);
this.addAttribute("shield_capacity", x1, y + 64);
this.addAttribute("power_capacity", x1, y + 128);
this.addAttribute("power_generation", x1, y + 192);
this.addAttribute("maneuvrability", x1, y + 256);
this.addAttribute("precision", x1, y + 320);
this.addAttribute("skill_materials", x2, y);
this.addAttribute("skill_photons", x2, y + 64);
this.addAttribute("skill_antimatter", x2, y + 128);
this.addAttribute("skill_quantum", x2, y + 192);
this.addAttribute("skill_gravity", x2, y + 256);
this.addAttribute("skill_time", x2, y + 320);
}
@ -155,11 +155,18 @@ module TS.SpaceTac.UI {
* Add an attribute display
*/
private addAttribute(attribute: keyof ShipAttributes, x: number, y: number) {
let text = new Phaser.Text(this.game, x, y, "", { align: "center", font: "18pt Arial", fill: "#FFFFFF" });
let attrname = capitalize(SHIP_ATTRIBUTES[attribute].name);
let name = new Phaser.Text(this.game, x - 144, y - 2, attrname,
{ align: "center", font: "20pt Arial", fill: "#c9d8ef", stroke: "#395665", strokeThickness: 1 });
name.anchor.set(0.5, 0.5);
this.addChild(name);
let text = new Phaser.Text(this.game, x, y, "",
{ align: "center", font: "bold 18pt Arial", fill: "#FFFFFF" });
text.anchor.set(0.5, 0.5);
this.addChild(text);
this.attributes[SHIP_ATTRIBUTES[attribute].name] = text;
this.attributes[attribute] = text;
if (SHIP_SKILLS.hasOwnProperty(attribute)) {
let button = new Phaser.Button(this.game, x + 54, y - 4, "character-skill-upgrade", () => {
@ -169,7 +176,7 @@ module TS.SpaceTac.UI {
button.anchor.set(0.5, 0.5);
this.ship_upgrades.add(button);
this.view.tooltip.bindStaticText(button, `Spend one point to upgrade ${SHIP_ATTRIBUTES[attribute].name}`);
this.view.tooltip.bindStaticText(button, `Spend one point to upgrade ${attrname}`);
}
}
@ -214,7 +221,7 @@ module TS.SpaceTac.UI {
this.ship_upgrades.visible = upgrade_points > 0;
iteritems(<any>ship.attributes, (key, value: ShipAttribute) => {
let text = this.attributes[value.name];
let text = this.attributes[key];
if (text) {
text.setText(value.get().toString());
}