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
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) * **Hull capacity** - Maximal Hull value (when the battle starts)
* **Shield capacity** - Maximal Shield value (when the battle starts) * **Shield capacity** - Maximal Shield value (when the battle starts)
* **Power capacity** - Maximal Power value * **Power capacity** - Maximal Power value
* **Initial power** - Power immediately available at the start of battle * **Power generation** - Power generated at the end of a ship's turn
* **Power recovery** - 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, 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). 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 For example, a ship that equips a power generator with "power generation +3", but has a sticky effect
of "power recovery -1" from a previous weapon hit, will have an effective power recovery of 2. of "power generation -1" from a previous weapon hit, will have an effective power generation of 2.
### Skills ### Skills
Skills represent a ship's ability to use equipments: Skills represent a ship's ability to use equipments:
* **Materials** - Usage of physical materials such as bullets, shells... * **Materials** - Usage of physical materials such as bullets, shells...
* **Electronics** - Components of computers and communication * **Photons** - Forces of light, and electromagnetic radiation
* **Energy** - Raw energy manipulation * **Antimatter** - Manipulation of matter and antimatter particles
* **Human** - Management of a human team and resources * **Quantum** - Application of quantum uncertainty principle
* **Gravity** - Interaction with gravitational forces * **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" 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. the equipment.
Skills are defined by the player, using points given while leveling up. Skills are defined by the player, using points given while leveling up.

View file

@ -19,7 +19,7 @@
inkscape:version="0.92.1 r15371" inkscape:version="0.92.1 r15371"
sodipodi:docname="character.svg" sodipodi:docname="character.svg"
enable-background="new" 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-xdpi="96"
inkscape:export-ydpi="96"> inkscape:export-ydpi="96">
<defs <defs
@ -573,11 +573,11 @@
borderopacity="1.0" borderopacity="1.0"
inkscape:pageopacity="0" inkscape:pageopacity="0"
inkscape:pageshadow="2" inkscape:pageshadow="2"
inkscape:zoom="7.919596" inkscape:zoom="0.49497475"
inkscape:cx="577.1487" inkscape:cx="970.56884"
inkscape:cy="39.46876" inkscape:cy="617.47621"
inkscape:document-units="px" inkscape:document-units="px"
inkscape:current-layer="layer2" inkscape:current-layer="layer11"
showgrid="false" showgrid="false"
inkscape:window-width="1920" inkscape:window-width="1920"
inkscape:window-height="1037" inkscape:window-height="1037"
@ -593,13 +593,13 @@
inkscape:snap-object-midpoints="true" inkscape:snap-object-midpoints="true"
inkscape:snap-bbox-edge-midpoints="true" inkscape:snap-bbox-edge-midpoints="true"
inkscape:snap-others="true" inkscape:snap-others="true"
inkscape:snap-global="false" inkscape:snap-global="true"
showborder="false" showborder="false"
borderlayer="false" borderlayer="false"
inkscape:showpageshadow="true" inkscape:showpageshadow="true"
inkscape:lockguides="true" inkscape:lockguides="true"
inkscape:measure-start="168.929,966.071" inkscape:measure-start="519.581,357.616"
inkscape:measure-end="228.214,927.143"> inkscape:measure-end="665.158,357.616">
<sodipodi:guide <sodipodi:guide
position="0,0" position="0,0"
orientation="0,1920" orientation="0,1920"
@ -644,7 +644,7 @@
<dc:format>image/svg+xml</dc:format> <dc:format>image/svg+xml</dc:format>
<dc:type <dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title /> <dc:title></dc:title>
</cc:Work> </cc:Work>
</rdf:RDF> </rdf:RDF>
</metadata> </metadata>
@ -1188,17 +1188,6 @@
height="10.620193" height="10.620193"
x="191.35637" x="191.35637"
y="195.53967" /> 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>
</g> </g>
<use <use
@ -1279,26 +1268,6 @@
id="rect6041" id="rect6041"
d="m 165.26733,271.72806 h 15.88055 l 1.60362,12.73588 h -19.08779 z" 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)" /> 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>
<g <g
id="g6064" id="g6064"
@ -1315,17 +1284,6 @@
id="rect6044" id="rect6044"
d="m 266.80115,271.72803 h 15.88054 l 1.87089,12.73588 h -19.62232 z" 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)" /> 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 <text
id="text6641" id="text6641"
y="280.98312" y="280.98312"
@ -1341,29 +1299,6 @@
<g <g
id="g4635" id="g4635"
transform="translate(9.5250003)"> 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 <use
height="100%" height="100%"
width="100%" width="100%"
@ -1421,72 +1356,6 @@
x="106.28822" x="106.28822"
y="164.41965" y="164.41965"
ry="0" /> 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 <use
x="0" x="0"
y="0" y="0"
@ -1495,72 +1364,6 @@
transform="translate(106.1661,-6.7705059e-6)" transform="translate(106.1661,-6.7705059e-6)"
width="100%" width="100%"
height="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 <text
xml:space="preserve" 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" 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" 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> 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>
<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 <g
inkscape:groupmode="layer" inkscape:groupmode="layer"
id="layer3" 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 fleet2 = new Fleet();
var ship1 = new Ship(fleet1, "F1S1"); var ship1 = new Ship(fleet1, "F1S1");
ship1.setAttribute("initiative", 2); ship1.setAttribute("maneuvrability", 2);
var ship2 = new Ship(fleet1, "F1S2"); var ship2 = new Ship(fleet1, "F1S2");
ship2.setAttribute("initiative", 4); ship2.setAttribute("maneuvrability", 4);
var ship3 = new Ship(fleet1, "F1S3"); var ship3 = new Ship(fleet1, "F1S3");
ship3.setAttribute("initiative", 1); ship3.setAttribute("maneuvrability", 1);
var ship4 = new Ship(fleet2, "F2S1"); var ship4 = new Ship(fleet2, "F2S1");
ship4.setAttribute("initiative", 8); ship4.setAttribute("maneuvrability", 8);
var ship5 = new Ship(fleet2, "F2S2"); var ship5 = new Ship(fleet2, "F2S2");
ship5.setAttribute("initiative", 2); ship5.setAttribute("maneuvrability", 2);
var battle = new Battle(fleet1, fleet2); var battle = new Battle(fleet1, fleet2);
expect(battle.play_order.length).toBe(0); expect(battle.play_order.length).toBe(0);
@ -77,7 +77,7 @@ module TS.SpaceTac {
expect(battle.playing_ship_index).toBeNull(); expect(battle.playing_ship_index).toBeNull();
// Force play order // 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]); var gen = new SkewedRandomGenerator([0.1, 0.2, 0.0]);
battle.throwInitiative(gen); battle.throwInitiative(gen);

View file

@ -37,7 +37,7 @@ module TS.SpaceTac.Specs {
// Force lucky finds with one template // Force lucky finds with one template
var looter = new LootGenerator(random, false); var looter = new LootGenerator(random, false);
var template = new LootTemplate(SlotType.Power, "Nuclear Reactor"); 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); template.addAttributeEffect("power_capacity", 1);
looter.templates = [template]; looter.templates = [template];
spyOn(outcome, "getLootGenerator").and.returnValue(looter); 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].name).toBe("Nuclear Reactor");
expect(outcome.loot[1].level).toBe(4); expect(outcome.loot[1].level).toBe(4);
expect(outcome.loot[1].quality).toBe(EquipmentQuality.COMMON); 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].name).toBe("Nuclear Reactor");
expect(outcome.loot[2].level).toBe(6); expect(outcome.loot[2].level).toBe(6);
expect(outcome.loot[2].quality).toBe(EquipmentQuality.PREMIUM); 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 () { it("grants experience", function () {

View file

@ -94,9 +94,9 @@ module TS.SpaceTac {
drone.duration = 3; drone.duration = 3;
drone.effects = [ drone.effects = [
new DamageEffect(5), 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); expect(equipment.canBeEquipped(ship.attributes)).toBe(true);
// Second requirement // Second requirement
equipment.requirements["skill_material"] = 3; equipment.requirements["skill_materials"] = 3;
expect(equipment.canBeEquipped(ship.attributes)).toBe(false); 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); expect(equipment.canBeEquipped(ship.attributes)).toBe(true);
}); });
@ -65,7 +65,7 @@ module TS.SpaceTac.Specs {
let equipment = new Equipment(); let equipment = new Equipment();
expect(equipment.getMinimumLevel()).toBe(1); expect(equipment.getMinimumLevel()).toBe(1);
equipment.requirements["skill_human"] = 10; equipment.requirements["skill_quantum"] = 10;
expect(equipment.getMinimumLevel()).toBe(1); expect(equipment.getMinimumLevel()).toBe(1);
equipment.requirements["skill_time"] = 1; equipment.requirements["skill_time"] = 1;
@ -74,7 +74,7 @@ module TS.SpaceTac.Specs {
equipment.requirements["skill_gravity"] = 2; equipment.requirements["skill_gravity"] = 2;
expect(equipment.getMinimumLevel()).toBe(2); expect(equipment.getMinimumLevel()).toBe(2);
equipment.requirements["skill_electronics"] = 4; equipment.requirements["skill_antimatter"] = 4;
expect(equipment.getMinimumLevel()).toBe(3); expect(equipment.getMinimumLevel()).toBe(3);
}); });

View file

@ -33,23 +33,23 @@ module TS.SpaceTac.Specs {
it("applies requirements on skills", function () { it("applies requirements on skills", function () {
let template = new LootTemplate(SlotType.Hull, "Hull"); 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); let result = template.generate(1);
expect(result.requirements).toEqual({ expect(result.requirements).toEqual({
"skill_energy": 1, "skill_photons": 1,
"skill_gravity": 2 "skill_gravity": 2
}); });
result = template.generate(2); result = template.generate(2);
expect(result.requirements).toEqual({ expect(result.requirements).toEqual({
"skill_energy": 2, "skill_photons": 2,
"skill_gravity": 3 "skill_gravity": 3
}); });
result = template.generate(10); result = template.generate(10);
expect(result.requirements).toEqual({ expect(result.requirements).toEqual({
"skill_energy": 10, "skill_photons": 10,
"skill_gravity": 47 "skill_gravity": 47
}); });
}); });
@ -123,7 +123,7 @@ module TS.SpaceTac.Specs {
let template = new LootTemplate(SlotType.Weapon, "Weapon"); let template = new LootTemplate(SlotType.Weapon, "Weapon");
expect(template.hasDamageEffect()).toBe(false); expect(template.hasDamageEffect()).toBe(false);
template.addAttributeEffect("initiative", 1); template.addAttributeEffect("maneuvrability", 1);
expect(template.hasDamageEffect()).toBe(false); expect(template.hasDamageEffect()).toBe(false);
template.addFireAction(1, 50, 50, [new EffectTemplate(new BaseEffect("test"), {})]); 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); let power_generator = new Equipment(SlotType.Power);
power_generator.effects = [ power_generator.effects = [
new AttributeEffect("power_capacity", 8), new AttributeEffect("power_capacity", 8),
new AttributeEffect("power_recovery", 3), new AttributeEffect("power_generation", 3),
new AttributeEffect("power_initial", 4)
] ]
ship.addSlot(SlotType.Power).attach(power_generator); ship.addSlot(SlotType.Power).attach(power_generator);
expect(ship.values.power.get()).toBe(0); expect(ship.values.power.get()).toBe(0);
ship.initializeActionPoints(); ship.initializeActionPoints();
expect(ship.values.power.get()).toBe(4); expect(ship.values.power.get()).toBe(8);
ship.values.power.set(3); ship.values.power.set(3);
expect(ship.values.power.get()).toBe(3); expect(ship.values.power.get()).toBe(3);
ship.recoverActionPoints(); ship.recoverActionPoints();
@ -424,13 +423,13 @@ module TS.SpaceTac.Specs {
let slot = ship.addSlot(SlotType.Hull); let slot = ship.addSlot(SlotType.Hull);
expect(ship.canEquip(equipment)).toBe(slot); expect(ship.canEquip(equipment)).toBe(slot);
equipment.requirements["skill_energy"] = 2; equipment.requirements["skill_photons"] = 2;
expect(ship.canEquip(equipment)).toBe(null); expect(ship.canEquip(equipment)).toBe(null);
ship.upgradeSkill("skill_energy"); ship.upgradeSkill("skill_photons");
expect(ship.canEquip(equipment)).toBe(null); expect(ship.canEquip(equipment)).toBe(null);
ship.upgradeSkill("skill_energy"); ship.upgradeSkill("skill_photons");
expect(ship.canEquip(equipment)).toBe(slot); expect(ship.canEquip(equipment)).toBe(slot);
slot.attach(new Equipment(SlotType.Hull)); slot.attach(new Equipment(SlotType.Hull));
@ -446,17 +445,17 @@ module TS.SpaceTac.Specs {
expect(ship.level.get()).toBe(2); expect(ship.level.get()).toBe(2);
expect(ship.getAvailableUpgradePoints()).toBe(15); expect(ship.getAvailableUpgradePoints()).toBe(15);
expect(ship.getAttribute("skill_energy")).toBe(0); expect(ship.getAttribute("skill_photons")).toBe(0);
ship.upgradeSkill("skill_energy"); ship.upgradeSkill("skill_photons");
expect(ship.getAttribute("skill_energy")).toBe(1); expect(ship.getAttribute("skill_photons")).toBe(1);
range(50).forEach(() => ship.upgradeSkill("skill_gravity")); 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.getAttribute("skill_gravity")).toBe(14);
expect(ship.getAvailableUpgradePoints()).toBe(0); expect(ship.getAvailableUpgradePoints()).toBe(0);
ship.updateAttributes(); ship.updateAttributes();
expect(ship.getAttribute("skill_energy")).toBe(1); expect(ship.getAttribute("skill_photons")).toBe(1);
expect(ship.getAttribute("skill_gravity")).toBe(14); expect(ship.getAttribute("skill_gravity")).toBe(14);
}); });

View file

@ -8,30 +8,30 @@ module TS.SpaceTac {
*/ */
export class ShipSkills { export class ShipSkills {
// Skills // Skills
skill_material = new ShipAttribute("material skill") skill_materials = new ShipAttribute("materials skill")
skill_energy = new ShipAttribute("energy skill") skill_photons = new ShipAttribute("photons skill")
skill_electronics = new ShipAttribute("electronics skill") skill_antimatter = new ShipAttribute("antimatter skill")
skill_human = new ShipAttribute("human skill") skill_quantum = new ShipAttribute("quantum skill")
skill_time = new ShipAttribute("time skill")
skill_gravity = new ShipAttribute("gravity skill") skill_gravity = new ShipAttribute("gravity skill")
skill_time = new ShipAttribute("time skill")
} }
/** /**
* Set of ShipAttribute for a ship * Set of ShipAttribute for a ship
*/ */
export class ShipAttributes extends ShipSkills { export class ShipAttributes extends ShipSkills {
// Attribute controlling the play order
initiative = new ShipAttribute("initiative")
// Maximal hull value // Maximal hull value
hull_capacity = new ShipAttribute("hull capacity") hull_capacity = new ShipAttribute("hull capacity")
// Maximal shield value // Maximal shield value
shield_capacity = new ShipAttribute("shield capacity") shield_capacity = new ShipAttribute("shield capacity")
// Maximal power value // Maximal power value
power_capacity = new ShipAttribute("power capacity") 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 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 // Make an initiative throw, to resolve play order in a battle
throwInitiative(gen: RandomGenerator): void { 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 // 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 // If no value is provided, the attribute ap_initial will be used
initializeActionPoints(value: number | null = null): void { initializeActionPoints(value: number | null = null): void {
if (value === null) { if (value === null) {
value = this.attributes.power_initial.get(); value = this.attributes.power_capacity.get();
} }
this.setValue("power", value); this.setValue("power", value);
} }
@ -300,7 +300,7 @@ module TS.SpaceTac {
recoverActionPoints(value: number | null = null): void { recoverActionPoints(value: number | null = null): void {
if (this.alive) { if (this.alive) {
if (value === null) { if (value === null) {
value = this.attributes.power_recovery.get(); value = this.attributes.power_generation.get();
} }
this.setValue("power", value, true); 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[4].type).toBe(SlotType.Weapon);
expect(ship.slots[5].type).toBe(SlotType.Weapon); expect(ship.slots[5].type).toBe(SlotType.Weapon);
expect(ship.slots[6].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(); let ship = new Ship();
expect(ship.getAttribute("power_capacity")).toBe(0); expect(ship.getAttribute("power_capacity")).toBe(0);
expect(ship.getAttribute("power_initial")).toBe(0); expect(ship.getAttribute("power_generation")).toBe(0);
expect(ship.getAttribute("power_recovery")).toBe(0);
expect(ship.getValue("power")).toBe(0); expect(ship.getValue("power")).toBe(0);
TestTools.setShipAP(ship, 12, 4); TestTools.setShipAP(ship, 12, 4);
expect(ship.getAttribute("power_capacity")).toBe(12); expect(ship.getAttribute("power_capacity")).toBe(12);
expect(ship.getAttribute("power_initial")).toBe(12); expect(ship.getAttribute("power_generation")).toBe(4);
expect(ship.getAttribute("power_recovery")).toBe(4);
expect(ship.getValue("power")).toBe(12); expect(ship.getValue("power")).toBe(12);
}); });

View file

@ -59,10 +59,8 @@ module TS.SpaceTac {
if (effect instanceof AttributeEffect) { if (effect instanceof AttributeEffect) {
if (effect.attrcode === "power_capacity") { if (effect.attrcode === "power_capacity") {
effect.value = points; effect.value = points;
} else if (effect.attrcode === "power_recovery") { } else if (effect.attrcode === "power_generation") {
effect.value = recovery; 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(); let ship = battle.fleets[0].addShip();
TestTools.addEngine(ship, 500); TestTools.addEngine(ship, 500);
let drone = new Drone(ship); let drone = new Drone(ship);
drone.effects = [new AttributeEffect("initiative", 1)]; drone.effects = [new AttributeEffect("maneuvrability", 1)];
drone.x = 100; drone.x = 100;
drone.y = 0; drone.y = 0;
drone.radius = 50; drone.radius = 50;
@ -56,7 +56,7 @@ module TS.SpaceTac.Specs {
maneuver = new Maneuver(ship, new MoveAction(new Equipment()), Target.newFromLocation(100, 30)); maneuver = new Maneuver(ship, new MoveAction(new Equipment()), Target.newFromLocation(100, 30));
expect(maneuver.getFinalLocation()).toEqual(jasmine.objectContaining({ x: 100, y: 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 * Evaluate doing nothing, between -1 and 1
*/ */
static evaluateIdling(ship: Ship, battle: Battle, maneuver: Maneuver): number { 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) { if (lost > 0) {
return -lost / ship.getAttribute("power_capacity"); return -lost / ship.getAttribute("power_capacity");
} else if (maneuver.action instanceof FireWeaponAction || maneuver.action instanceof DeployDroneAction) { } else if (maneuver.action instanceof FireWeaponAction || maneuver.action instanceof DeployDroneAction) {

View file

@ -2,20 +2,20 @@ module TS.SpaceTac {
describe("AttributeEffect", function () { describe("AttributeEffect", function () {
it("is not applied directly", function () { it("is not applied directly", function () {
let ship = new Ship(); 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); 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.sticky_effects.push(new StickyEffect(effect, 2));
ship.updateAttributes(); ship.updateAttributes();
expect(ship.getAttribute("initiative")).toBe(20); expect(ship.getAttribute("maneuvrability")).toBe(20);
}); });
it("has a description", function () { it("has a description", function () {
let effect = new AttributeEffect("initiative", 12); let effect = new AttributeEffect("maneuvrability", 12);
expect(effect.getDescription()).toEqual("initiative +12"); expect(effect.getDescription()).toEqual("maneuvrability +12");
effect = new AttributeEffect("shield_capacity", -4); effect = new AttributeEffect("shield_capacity", -4);
expect(effect.getDescription()).toEqual("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 template = new ForceField();
let equipment = template.generate(1); 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)]); expect(equipment.effects).toEqual([new AttributeEffect("shield_capacity", 100)]);
equipment = template.generate(2); 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)]); expect(equipment.effects).toEqual([new AttributeEffect("shield_capacity", 140)]);
equipment = template.generate(3); 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)]); expect(equipment.effects).toEqual([new AttributeEffect("shield_capacity", 180)]);
equipment = template.generate(10); 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)]); expect(equipment.effects).toEqual([new AttributeEffect("shield_capacity", 460)]);
}); });
}); });

View file

@ -5,7 +5,7 @@ module TS.SpaceTac.Equipments {
constructor() { constructor() {
super(SlotType.Shield, "Force Field", "A basic force field, generated by radiating waves of compressed energy"); 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))); this.addAttributeEffect("shield_capacity", istep(100, irepeat(40)));
} }
} }

View file

@ -4,19 +4,19 @@ module TS.SpaceTac.Equipments {
let template = new GatlingGun(); let template = new GatlingGun();
let equipment = template.generate(1); 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)])); expect(equipment.action).toEqual(new FireWeaponAction(equipment, 3, 600, 0, [new DamageEffect(30, 20)]));
equipment = template.generate(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, 3, 600, 0, [new DamageEffect(35, 25)])); expect(equipment.action).toEqual(new FireWeaponAction(equipment, 3, 600, 0, [new DamageEffect(35, 25)]));
equipment = template.generate(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, 3, 600, 0, [new DamageEffect(40, 30)])); expect(equipment.action).toEqual(new FireWeaponAction(equipment, 3, 600, 0, [new DamageEffect(40, 30)]));
equipment = template.generate(10); 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)])); 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() { constructor() {
super(SlotType.Weapon, "Gatling Gun", "Mechanical weapon using loads of metal bullets propelled by guided explosions"); 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.setCooldown(irepeat(2), irepeat(2));
this.addFireAction(irepeat(3), irepeat(600), 0, [ this.addFireAction(irepeat(3), irepeat(600), 0, [
new EffectTemplate(new DamageEffect(), { base: istep(30, irepeat(5)), span: istep(20, irepeat(5)) }) 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 template = new IronHull();
let equipment = template.generate(1); 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)]); expect(equipment.effects).toEqual([new AttributeEffect("hull_capacity", 200)]);
equipment = template.generate(2); 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)]); expect(equipment.effects).toEqual([new AttributeEffect("hull_capacity", 220)]);
equipment = template.generate(3); 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)]); expect(equipment.effects).toEqual([new AttributeEffect("hull_capacity", 240)]);
equipment = template.generate(10); 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)]); expect(equipment.effects).toEqual([new AttributeEffect("hull_capacity", 380)]);
}); });
}); });

View file

@ -5,7 +5,7 @@ module TS.SpaceTac.Equipments {
constructor() { constructor() {
super(SlotType.Hull, "Iron Hull", "Protective hull, based on layered iron alloys"); 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))); this.addAttributeEffect("hull_capacity", istep(200, irepeat(20)));
} }
} }

View file

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

View file

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

View file

@ -4,19 +4,19 @@ module TS.SpaceTac.Equipments {
let template = new PowerDepleter(); let template = new PowerDepleter();
let equipment = template.generate(1); 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)])); expect(equipment.action).toEqual(new FireWeaponAction(equipment, 4, 500, 0, [new StickyEffect(new AttributeLimitEffect("power_capacity", 3), 2, true)]));
equipment = template.generate(2); 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)])); expect(equipment.action).toEqual(new FireWeaponAction(equipment, 4, 520, 0, [new StickyEffect(new AttributeLimitEffect("power_capacity", 3), 2, true)]));
equipment = template.generate(3); 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)])); expect(equipment.action).toEqual(new FireWeaponAction(equipment, 4, 540, 0, [new StickyEffect(new AttributeLimitEffect("power_capacity", 3), 2, true)]));
equipment = template.generate(10); 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)])); 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() { constructor() {
super(SlotType.Weapon, "Power Depleter", "Direct-hit weapon that creates an energy well near the target, sucking its power surplus"); 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.setCooldown(irepeat(2), irepeat(3));
this.addFireAction(irepeat(4), istep(500, irepeat(20)), 0, [ this.addFireAction(irepeat(4), istep(500, irepeat(20)), 0, [
new StickyEffectTemplate(new AttributeLimitEffect("power_capacity"), { "value": irepeat(3) }, irepeat(2)) 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 template = new RepairDrone();
let equipment = template.generate(1); 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)])); expect(equipment.action).toEqual(new DeployDroneAction(equipment, 4, 300, 10, 150, [new ValueEffect("hull", 5)]));
equipment = template.generate(2); 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)])); expect(equipment.action).toEqual(new DeployDroneAction(equipment, 4, 310, 11, 155, [new ValueEffect("hull", 6)]));
equipment = template.generate(3); 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)])); expect(equipment.action).toEqual(new DeployDroneAction(equipment, 4, 320, 12, 160, [new ValueEffect("hull", 7)]));
equipment = template.generate(10); 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)])); 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() { constructor() {
super(SlotType.Weapon, "Repair Drone", "Drone able to repair small hull breaches, remotely controlled by human pilots"); 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.setCooldown(irepeat(1), istep(3, irepeat(0.2)));
this.addDroneAction(irepeat(4), istep(300, irepeat(10)), istep(10, irepeat(1)), istep(150, irepeat(5)), [ this.addDroneAction(irepeat(4), istep(300, irepeat(10)), istep(10, irepeat(1)), istep(150, irepeat(5)), [
new EffectTemplate(new ValueEffect("hull"), { "value": istep(5) }) new EffectTemplate(new ValueEffect("hull"), { "value": istep(5) })

View file

@ -4,23 +4,23 @@ module TS.SpaceTac.Equipments {
let template = new RocketEngine(); let template = new RocketEngine();
let equipment = template.generate(1); 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)]); expect(equipment.effects).toEqual([new AttributeEffect("maneuvrability", 1)]);
expect(equipment.action).toEqual(new MoveAction(equipment, 200)); expect(equipment.action).toEqual(new MoveAction(equipment, 200));
equipment = template.generate(2); 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)]); expect(equipment.effects).toEqual([new AttributeEffect("maneuvrability", 2)]);
expect(equipment.action).toEqual(new MoveAction(equipment, 220)); expect(equipment.action).toEqual(new MoveAction(equipment, 220));
equipment = template.generate(3); 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)]); expect(equipment.effects).toEqual([new AttributeEffect("maneuvrability", 3)]);
expect(equipment.action).toEqual(new MoveAction(equipment, 240)); expect(equipment.action).toEqual(new MoveAction(equipment, 240));
equipment = template.generate(10); 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)]); expect(equipment.effects).toEqual([new AttributeEffect("maneuvrability", 10)]);
expect(equipment.action).toEqual(new MoveAction(equipment, 380)); expect(equipment.action).toEqual(new MoveAction(equipment, 380));
}); });
}); });

View file

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

View file

@ -4,19 +4,19 @@ module TS.SpaceTac.Equipments {
let template = new SubMunitionMissile(); let template = new SubMunitionMissile();
let equipment = template.generate(1); 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)])); expect(equipment.action).toEqual(new FireWeaponAction(equipment, 4, 500, 150, [new DamageEffect(30, 2)]));
equipment = template.generate(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)])); expect(equipment.action).toEqual(new FireWeaponAction(equipment, 4, 520, 155, [new DamageEffect(32, 3)]));
equipment = template.generate(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)])); expect(equipment.action).toEqual(new FireWeaponAction(equipment, 4, 540, 160, [new DamageEffect(34, 4)]));
equipment = template.generate(10); 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)])); 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() { constructor() {
super(SlotType.Weapon, "SubMunition Missile", "Explosive missile releasing small shelled payloads, that will in turn explode on impact"); 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.setCooldown(irepeat(1), 0);
this.addFireAction(irepeat(4), istep(500, irepeat(20)), istep(150, irepeat(5)), [ 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)) }) 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); 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); expect(sprite.effects.children.length).toBe(1);
let t1 = <Phaser.Text>sprite.effects.getChildAt(0); 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)); sprite.displayValueChanged(new ValueChangeEvent(ship, ship.values.shield, 12));

View file

@ -137,16 +137,16 @@ module TS.SpaceTac.UI {
let x1 = 664; let x1 = 664;
let x2 = 1066; let x2 = 1066;
let y = 662; let y = 662;
this.addAttribute("initiative", x1, y); this.addAttribute("hull_capacity", x1, y);
this.addAttribute("hull_capacity", x1, y + 64); this.addAttribute("shield_capacity", x1, y + 64);
this.addAttribute("shield_capacity", x1, y + 128); this.addAttribute("power_capacity", x1, y + 128);
this.addAttribute("power_capacity", x1, y + 192); this.addAttribute("power_generation", x1, y + 192);
this.addAttribute("power_initial", x1, y + 256); this.addAttribute("maneuvrability", x1, y + 256);
this.addAttribute("power_recovery", x1, y + 320); this.addAttribute("precision", x1, y + 320);
this.addAttribute("skill_material", x2, y); this.addAttribute("skill_materials", x2, y);
this.addAttribute("skill_electronics", x2, y + 64); this.addAttribute("skill_photons", x2, y + 64);
this.addAttribute("skill_energy", x2, y + 128); this.addAttribute("skill_antimatter", x2, y + 128);
this.addAttribute("skill_human", x2, y + 192); this.addAttribute("skill_quantum", x2, y + 192);
this.addAttribute("skill_gravity", x2, y + 256); this.addAttribute("skill_gravity", x2, y + 256);
this.addAttribute("skill_time", x2, y + 320); this.addAttribute("skill_time", x2, y + 320);
} }
@ -155,11 +155,18 @@ module TS.SpaceTac.UI {
* Add an attribute display * Add an attribute display
*/ */
private addAttribute(attribute: keyof ShipAttributes, x: number, y: number) { 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); text.anchor.set(0.5, 0.5);
this.addChild(text); this.addChild(text);
this.attributes[SHIP_ATTRIBUTES[attribute].name] = text; this.attributes[attribute] = text;
if (SHIP_SKILLS.hasOwnProperty(attribute)) { if (SHIP_SKILLS.hasOwnProperty(attribute)) {
let button = new Phaser.Button(this.game, x + 54, y - 4, "character-skill-upgrade", () => { 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); button.anchor.set(0.5, 0.5);
this.ship_upgrades.add(button); 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; this.ship_upgrades.visible = upgrade_points > 0;
iteritems(<any>ship.attributes, (key, value: ShipAttribute) => { iteritems(<any>ship.attributes, (key, value: ShipAttribute) => {
let text = this.attributes[value.name]; let text = this.attributes[key];
if (text) { if (text) {
text.setText(value.get().toString()); text.setText(value.get().toString());
} }