Updated attributes and skills
This commit is contained in:
parent
ea13e25c5e
commit
7275288f13
22
README.md
22
README.md
|
@ -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.
|
||||
|
|
|
@ -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 |
|
@ -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);
|
||||
|
||||
|
|
|
@ -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 () {
|
||||
|
|
|
@ -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");
|
||||
});
|
||||
});
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
});
|
||||
|
||||
|
|
|
@ -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"), {})]);
|
||||
|
|
|
@ -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);
|
||||
});
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
});
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
});
|
||||
|
|
|
@ -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)]]);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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");
|
||||
|
|
|
@ -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)]);
|
||||
});
|
||||
});
|
||||
|
|
|
@ -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)));
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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)]));
|
||||
});
|
||||
});
|
||||
|
|
|
@ -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)) })
|
||||
|
|
|
@ -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)]);
|
||||
});
|
||||
});
|
||||
|
|
|
@ -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)));
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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),
|
||||
]);
|
||||
});
|
||||
});
|
||||
|
|
|
@ -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)));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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)]));
|
||||
});
|
||||
|
||||
|
|
|
@ -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))
|
||||
|
|
|
@ -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)]));
|
||||
});
|
||||
|
||||
|
|
|
@ -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) })
|
||||
|
|
|
@ -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));
|
||||
});
|
||||
});
|
||||
|
|
|
@ -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)));
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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)]));
|
||||
});
|
||||
|
||||
|
|
|
@ -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)) })
|
||||
|
|
|
@ -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));
|
||||
|
||||
|
|
|
@ -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());
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue