Merge: gtksourceview: Rewrite the language definition
authorJean Privat <jean@pryen.org>
Wed, 28 Jun 2017 19:58:50 +0000 (15:58 -0400)
committerJean Privat <jean@pryen.org>
Wed, 28 Jun 2017 19:58:50 +0000 (15:58 -0400)
The new definition includes:
* A more accurate and up-to-date grammar
* A more accurate style list
* A list of built-in annotations
* Heuristics for embedded languages
* Spell-checking only enabled for comments
* Styles for operators and lower-case identifiers available if needed
  (but not highlighted by default)

## Previews
Here are the PDF outputs of various black-on-white style schemes for `examples/syntax.nit`:
* [Classic](https://github.com/nitlang/nit/files/1109793/gtksourceview-classic.pdf)
* [Kate](https://github.com/nitlang/nit/files/1109794/gtksourceview-kate.pdf)
* [Solarized Clear](https://github.com/nitlang/nit/files/1109795/gtksourceview-solarized-clear.pdf)
* [Tango](https://github.com/nitlang/nit/files/1109796/gtksourceview-tango.pdf)

Signed-off-by: Jean-Christophe Beaupré <jcbrinfo@users.noreply.github.com>

Pull-Request: #2515
Reviewed-by: Jean Privat <jean@pryen.org>
Reviewed-by: Lucas Bajolet <r4pass@hotmail.com>
Reviewed-by: Alexis Laferrière <alexis.laf@xymus.net>

34 files changed:
contrib/action_nitro/Makefile
contrib/action_nitro/art/icon.svg
contrib/action_nitro/art/icon_background.png [new file with mode: 0644]
contrib/action_nitro/art/planes.svg
contrib/action_nitro/assets/particles/blood07.png
contrib/action_nitro/assets/particles/explosion00.png
contrib/action_nitro/assets/textures/player.png [new file with mode: 0644]
contrib/action_nitro/assets/textures/player/frame_01.png [deleted file]
contrib/action_nitro/assets/textures/player/frame_02.png [deleted file]
contrib/action_nitro/assets/textures/player/frame_03.png [deleted file]
contrib/action_nitro/assets/textures/player/frame_04.png [deleted file]
contrib/action_nitro/assets/textures/player/frame_05.png [deleted file]
contrib/action_nitro/assets/textures/player/frame_06.png [deleted file]
contrib/action_nitro/assets/textures/player/frame_07.png [deleted file]
contrib/action_nitro/assets/textures/player/frame_08.png [deleted file]
contrib/action_nitro/assets/textures/player/frame_09.png [deleted file]
contrib/action_nitro/assets/textures/player/frame_10.png [deleted file]
contrib/action_nitro/assets/textures/player/frame_11.png [deleted file]
contrib/action_nitro/assets/textures/player/frame_12.png [deleted file]
contrib/action_nitro/package.ini
contrib/action_nitro/src/action_nitro.nit
contrib/asteronits/assets/sounds/fire.mp3 [deleted file]
contrib/asteronits/assets/sounds/fire.ogg [new file with mode: 0644]
contrib/asteronits/src/asteronits.nit
contrib/model_viewer/src/globe.nit
lib/gamnit/android19.nit [new file with mode: 0644]
lib/gamnit/depth/more_materials.nit
lib/gamnit/depth/particles.nit
lib/gamnit/display_android.nit
lib/gamnit/flat.nit
lib/gamnit/textures.nit
lib/neo4j/neo4j.nit
misc/docker/Dockerfile
misc/docker/full/Dockerfile

index b3fcebc..81db63b 100644 (file)
@@ -1,14 +1,14 @@
-NITC=nitc
-NITLS=nitls
-
 all: bin/action_nitro
 
-bin/action_nitro: $(shell ${NITLS} -M src/action_nitro.nit -m linux) pre-build
-       ${NITC} src/action_nitro.nit -m linux -o $@
+bin/action_nitro: $(shell nitls -M src/action_nitro.nit -m linux) pre-build
+       nitc src/action_nitro.nit -m linux -o $@
+
+android: bin/action_nitro.apk
+bin/action_nitro.apk: $(shell nitls -M src/action_nitro.nit -m gamnit::android19 -m src/touch_ui.nit) pre-build android/res/
+       nitc src/action_nitro.nit -m gamnit::android19 -m src/touch_ui.nit -o $@
 
-android:
-bin/action_nitro.apk: $(shell ${NITLS} -M src/action_nitro.nit -m android -m src/touch_ui.nit) pre-build android/res/
-       ${NITC} src/action_nitro.nit -m android -m src/touch_ui.nit -o $@
+android-release: $(shell nitls -M src/action_nitro.nit -m gamnit::android19 -m src/touch_ui.nit) pre-build android/res/
+       nitc src/action_nitro.nit -m gamnit::android19 -m src/touch_ui.nit -o bin/action_nitro.apk --release
 
 src/gen/texts.nit: art/texts.svg
        make -C ../inkscape_tools/
index 7383208..a0701e1 100644 (file)
@@ -60,8 +60,8 @@
      id="layer1"
      transform="translate(-286.05811,81.477047)">
     <image
-       sodipodi:absref="/home/xymus/projects/nit/contrib/action_nitro/art/../assets/particles/explosion00.png"
-       xlink:href="../assets/particles/explosion00.png"
+       sodipodi:absref="icon_background.png"
+       xlink:href="icon_background.png"
        width="479.1073"
        height="439.72864"
        id="image3062"
diff --git a/contrib/action_nitro/art/icon_background.png b/contrib/action_nitro/art/icon_background.png
new file mode 100644 (file)
index 0000000..22529ca
Binary files /dev/null and b/contrib/action_nitro/art/icon_background.png differ
index 5835292..690bbdb 100644 (file)
@@ -12,7 +12,7 @@
    xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
    id="svg2998"
    version="1.1"
-   inkscape:version="0.48.5 r10040"
+   inkscape:version="0.92.1 r15371"
    width="524.4095"
    height="372.04725"
    xml:space="preserve"
          rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
            rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title /></cc:Work></rdf:RDF></metadata><defs
      id="defs3002"><inkscape:path-effect
+       effect="spiro"
+       id="path-effect637"
+       is_visible="true" /><inkscape:path-effect
+       effect="spiro"
+       id="path-effect635"
+       is_visible="true" /><inkscape:path-effect
+       is_visible="true"
+       id="path-effect633"
+       effect="spiro" /><inkscape:path-effect
+       is_visible="true"
+       id="path-effect631"
+       effect="spiro" /><inkscape:path-effect
        is_visible="true"
        id="path-effect4413"
        effect="spiro" /><inkscape:path-effect
      guidetolerance="10"
      inkscape:pageopacity="0"
      inkscape:pageshadow="2"
-     inkscape:window-width="1279"
+     inkscape:window-width="2558"
      inkscape:window-height="1379"
      id="namedview3000"
      showgrid="false"
-     inkscape:zoom="1.4024597"
-     inkscape:cx="429.44965"
-     inkscape:cy="25.150576"
+     inkscape:zoom="1.9833775"
+     inkscape:cx="780.35818"
+     inkscape:cy="-272.69605"
      inkscape:window-x="2560"
      inkscape:window-y="27"
-     inkscape:window-maximized="0"
-     inkscape:current-layer="g3006"
+     inkscape:window-maximized="1"
+     inkscape:current-layer="0parachute3"
      showguides="true"
      inkscape:guide-bbox="true" /><g
      id="g3006"
          style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none"
          d="m 484.31028,119.75591 1.152,0.3903 0.78089,-2.3043 -1.152,-0.3903 -0.78089,2.3043 z"
          inkscape:connector-curvature="0" /></g><g
-       id="0parachute"
+       id="0parachute_open"
        inkscape:label="#g4396"
-       transform="matrix(0.72097491,0,0,0.72097491,125.66161,60.334655)"
+       transform="matrix(0.72097491,0,0,0.72097491,270.32536,-199.77977)"
        inkscape:export-filename="/home/xymus/projects/nit/contrib/action_nitro/assets/textures/parachute.png"
        inkscape:export-xdpi="179.97391"
        inkscape:export-ydpi="179.97391"><path
          id="path4292"
          d="m 541.0567,221.46069 c 2.87057,-0.37945 5.69765,-0.87242 8.45,-1.55 2.9644,-0.72978 5.85358,-1.64757 8.675,-2.7 2.82141,-1.05243 5.5776,-2.24898 8.25,-3.6 2.67239,-1.35102 5.28267,-2.84943 7.8,-4.475 2.51732,-1.62557 4.94378,-3.37394 7.3,-5.25 2.35621,-1.87606 4.63594,-3.87249 6.825,-5.975 2.18905,-2.10251 4.28414,-4.3201 6.3,-6.625 2.01585,-2.3049 3.93839,-4.69174 5.775,-7.175 1.8366,-2.48326 3.59868,-5.06245 5.25,-7.7 1.65132,-2.63755 3.19,-5.35721 4.65,-8.125 1.45999,-2.76779 2.83738,-5.57601 4.1,-8.45 1.26261,-2.87399 2.4158,-5.79386 3.475,-8.75 1.05919,-2.95614 2.02527,-5.96077 2.875,-8.975 0.21944,-0.77843 0.36978,-1.5687 0.575,-2.35 0.0162,-0.01 0.0338,-0.0154 0.05,-0.025 1.27244,-0.75576 2.49439,-1.58028 3.7,-2.5 1.2056,-0.91968 2.39336,-1.92636 3.525,-3 1.13163,-1.07362 2.22447,-2.20747 3.275,-3.425 1.05055,-1.21756 2.06268,-2.52352 3.025,-3.875 0.96232,-1.35147 1.85803,-2.7746 2.725,-4.25 0.86698,-1.47537 1.68551,-3.01071 2.45,-4.6 0.41735,-0.86762 0.78984,-1.77575 1.175,-2.675 0.16472,2.28168 0.35,4.55356 0.35,6.875 0,53.6116 -44.69648,97.17487 -100.575,99.175 z"
-         style="fill:#d30000;fill-opacity:1;stroke:#000000;stroke-width:2.11899996;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+         style="fill:#d30000;fill-opacity:1;stroke:#000000;stroke-width:2.11899996;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
          inkscape:connector-curvature="0" /><path
          id="path4290"
          d="m 539.9067,221.51069 c -0.0332,-0.004 -0.0658,5.1e-4 -0.1,0 0.87372,-0.0353 1.78196,-0.23691 2.75,-0.7 2.78422,-0.93873 5.45072,-2.06496 8,-3.35 2.54928,-1.28504 4.98047,-2.73047 7.3,-4.325 2.31952,-1.59453 4.53002,-3.3328 6.625,-5.2 2.09497,-1.8672 4.07438,-3.87194 5.95,-5.975 1.87561,-2.10306 3.66355,-4.29791 5.325,-6.6 1.66144,-2.30209 3.19752,-4.71069 4.65,-7.175 1.45247,-2.46431 2.8013,-4.98528 4.05,-7.575 1.24869,-2.58972 2.39988,-5.2467 3.45,-7.925 1.05012,-2.6783 2.01827,-5.39492 2.875,-8.125 0.85672,-2.73008 1.60646,-5.47997 2.275,-8.225 0.66853,-2.74503 1.23946,-5.47682 1.725,-8.2 0.31028,-1.74021 0.53771,-3.45604 0.775,-5.175 0.41818,0.12546 0.82629,0.28655 1.25,0.4 1.29913,0.34785 2.637,0.62202 3.975,0.8 1.33802,0.17798 2.67894,0.275 4.05,0.275 1.46855,0 2.94479,-0.0961 4.375,-0.3 1.43021,-0.20394 2.81524,-0.50211 4.2,-0.9 1.38473,-0.3979 2.76783,-0.89316 4.1,-1.475 1.3152,-0.57443 2.59316,-1.25556 3.85,-2 -0.20522,0.7813 -0.35556,1.57157 -0.575,2.35 -0.84973,3.01423 -1.81581,6.01886 -2.875,8.975 -1.0592,2.95614 -2.21239,5.87601 -3.475,8.75 -1.26262,2.87399 -2.64001,5.68221 -4.1,8.45 -1.46,2.76779 -2.99868,5.48745 -4.65,8.125 -1.65132,2.63755 -3.4134,5.21674 -5.25,7.7 -1.83661,2.48326 -3.75915,4.8701 -5.775,7.175 -2.01586,2.3049 -4.11095,4.52249 -6.3,6.625 -2.18906,2.10251 -4.46879,4.09894 -6.825,5.975 -2.35622,1.87606 -4.78268,3.62443 -7.3,5.25 -2.51733,1.62557 -5.12761,3.12398 -7.8,4.475 -2.6724,1.35102 -5.42859,2.54757 -8.25,3.6 -2.82142,1.05243 -5.7106,1.97022 -8.675,2.7 -2.75235,0.67758 -5.57943,1.17055 -8.45,1.55 -0.38417,0.0137 -0.76479,0.0402 -1.15,0.05 z"
-         style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:2.11899996;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+         style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:2.11899996;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
          inkscape:connector-curvature="0" /><path
          id="path4283"
          d="m 537.0817,221.66069 c -0.30432,0 -0.59631,-0.0475 -0.9,-0.05 1.25556,-0.0288 2.49999,-0.19732 3.725,-0.575 1.32385,-0.40815 2.64318,-1.00373 3.925,-1.8 1.28181,-0.79627 2.54183,-1.78564 3.775,-2.95 1.23316,-1.16436 2.42207,-2.51257 3.6,-4.025 1.17792,-1.51243 2.33392,-3.18454 3.45,-5.025 1.11608,-1.84046 2.20236,-3.85152 3.25,-6 1.04763,-2.14848 2.05242,-4.43854 3.025,-6.875 0.97257,-2.43646 1.90907,-5.02058 2.8,-7.725 0.89092,-2.70442 1.74733,-5.52266 2.55,-8.475 0.80266,-2.95234 1.56719,-6.01975 2.275,-9.2 0.7078,-3.18025 1.34365,-6.48688 1.95,-9.875 0.60634,-3.38812 1.17672,-6.87404 1.675,-10.45 0.49828,-3.57596 0.94138,-7.23121 1.325,-10.975 0.20438,-1.99465 0.3546,-4.06206 0.525,-6.1 0.77267,-0.8273 1.57324,-1.64553 2.3,-2.525 0.94304,1.19674 1.90798,2.34945 2.925,3.425 1.01703,1.07553 2.08985,2.0788 3.175,3.025 1.08515,0.94624 2.20258,1.81621 3.35,2.625 1.1474,0.8088 2.32116,1.56175 3.525,2.225 1.20383,0.66324 2.42058,1.2654 3.675,1.775 0.84528,0.34342 1.71096,0.59077 2.575,0.85 -0.23729,1.71896 -0.46472,3.43479 -0.775,5.175 -0.48554,2.72318 -1.05647,5.45497 -1.725,8.2 -0.66854,2.74503 -1.41828,5.49492 -2.275,8.225 -0.85673,2.73008 -1.82488,5.4467 -2.875,8.125 -1.05012,2.6783 -2.20131,5.33528 -3.45,7.925 -1.2487,2.58972 -2.59753,5.11069 -4.05,7.575 -1.45248,2.46431 -2.98856,4.87291 -4.65,7.175 -1.66145,2.30209 -3.44939,4.49694 -5.325,6.6 -1.87562,2.10306 -3.85503,4.1078 -5.95,5.975 -2.09498,1.8672 -4.30548,3.60547 -6.625,5.2 -2.31953,1.59453 -4.75072,3.03996 -7.3,4.325 -2.54928,1.28504 -5.21578,2.41127 -8,3.35 -0.96804,0.46309 -1.87628,0.6647 -2.75,0.7 0.0342,5.1e-4 0.0668,-0.004 0.1,0 -0.94675,0.0241 -1.87215,0.15 -2.825,0.15 z"
-         style="fill:#d30000;fill-opacity:1;stroke:#000000;stroke-width:2.11899996;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+         style="fill:#d30000;fill-opacity:1;stroke:#000000;stroke-width:2.11899996;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
          inkscape:connector-curvature="0" /><path
          id="path4281"
          d="m 535.3317,221.58569 c -56.91634,-0.89851 -102.775,-44.97614 -102.775,-99.3 0,-2.30764 0.2122,-4.58164 0.375,-6.85 0.37977,0.88504 0.73903,1.79565 1.15,2.65 0.76449,1.58929 1.58303,3.12462 2.45,4.6 0.86697,1.4754 1.76268,2.89853 2.725,4.25 0.96233,1.35148 1.97445,2.65744 3.025,3.875 1.05054,1.21753 2.14337,2.35138 3.275,3.425 1.13163,1.07364 2.31939,2.08032 3.525,3 1.20561,0.91972 2.42755,1.74424 3.7,2.5 1.27245,0.75577 2.56784,1.44317 3.9,2.025 1.33217,0.58184 2.71526,1.0771 4.1,1.475 1.38475,0.39789 2.76979,0.69606 4.2,0.9 1.43023,0.20394 2.88145,0.3 4.35,0.3 1.37105,0 2.737,-0.097 4.075,-0.275 1.33802,-0.17798 2.67586,-0.45215 3.975,-0.8 1.29913,-0.34785 2.54559,-0.74037 3.8,-1.25 1.25441,-0.5096 2.49617,-1.11176 3.7,-1.775 1.20383,-0.66326 2.37758,-1.4162 3.525,-2.225 1.14741,-0.80879 2.26486,-1.67876 3.35,-2.625 1.08515,-0.9462 2.15797,-1.94947 3.175,-3.025 0.9209,-0.97388 1.7906,-2.02676 2.65,-3.1 0.21475,2.79275 0.42203,5.58636 0.7,8.3 0.38349,3.74379 0.82688,7.39904 1.325,10.975 0.49812,3.57596 1.04383,7.06188 1.65,10.45 0.60617,3.38812 1.26739,6.69475 1.975,9.875 0.70761,3.18025 1.47254,6.24766 2.275,9.2 0.80246,2.95234 1.63429,5.77058 2.525,8.475 0.89071,2.70442 1.82763,5.28854 2.8,7.725 0.97236,2.43646 2.00256,4.72652 3.05,6.875 1.04743,2.14848 2.1091,4.15954 3.225,6 1.11589,1.84046 2.27223,3.51257 3.45,5.025 1.17776,1.51243 2.39196,2.86064 3.625,4.025 1.23304,1.16436 2.49328,2.15373 3.775,2.95 1.28172,0.79627 2.5762,1.39185 3.9,1.8 1.14343,0.35254 2.30476,0.50095 3.475,0.55 z"
-         style="fill:#0028dd;fill-opacity:1;stroke:#000000;stroke-width:2.11899996;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+         style="fill:#0028dd;fill-opacity:1;stroke:#000000;stroke-width:2.11899996;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
          inkscape:connector-curvature="0" /><path
          id="path4297"
          d="m 521.2317,145.56069 c 0.23817,3.79404 0.47632,7.52318 0.75,11.1 0.30019,3.92328 0.63456,7.70788 0.975,11.35 0.34043,3.64213 0.69712,7.11372 1.075,10.45 0.37787,3.33627 0.76248,6.51929 1.175,9.525 0.41251,3.00571 0.85564,5.84955 1.3,8.5 0.44436,2.65045 0.9016,5.12953 1.375,7.4 0.4734,2.27046 0.95035,4.33421 1.45,6.2 0.49964,1.8658 1.0269,3.5136 1.55,4.95 0.52309,1.4364 1.05624,2.66769 1.6,3.65 0.54375,0.98231 1.08839,1.72149 1.65,2.225 0.48508,0.4349 0.97854,0.6145 1.475,0.675 -0.0913,-0.003 -0.18259,0.001 -0.275,0 -1.17024,-0.0491 -2.33157,-0.19746 -3.475,-0.55 -1.3238,-0.40815 -2.61828,-1.00373 -3.9,-1.8 -1.28172,-0.79627 -2.54196,-1.78564 -3.775,-2.95 -1.23304,-1.16436 -2.44724,-2.51257 -3.625,-4.025 -1.17777,-1.51243 -2.33411,-3.18454 -3.45,-5.025 -1.1159,-1.84046 -2.17757,-3.85152 -3.225,-6 -1.04744,-2.14848 -2.07764,-4.43854 -3.05,-6.875 -0.97237,-2.43646 -1.90929,-5.02058 -2.8,-7.725 -0.89071,-2.70442 -1.72254,-5.52266 -2.525,-8.475 -0.80246,-2.95234 -1.56739,-6.01975 -2.275,-9.2 -0.70761,-3.18025 -1.36883,-6.48688 -1.975,-9.875 -0.60617,-3.38812 -1.15188,-6.87404 -1.65,-10.45 -0.49812,-3.57596 -0.94151,-7.23121 -1.325,-10.975 -0.27797,-2.71364 -0.48525,-5.50725 -0.7,-8.3 0.0897,-0.11203 0.18586,-0.21188 0.275,-0.325 1.21986,1.4762 2.504,2.89224 3.85,4.225 1.34599,1.3328 2.76324,2.59737 4.225,3.775 1.46176,1.17764 2.98283,2.26427 4.55,3.275 1.56716,1.01073 3.18778,1.94293 4.85,2.775 1.6622,0.83207 3.35309,1.58333 5.1,2.225 0.26185,0.0962 0.53656,0.15823 0.8,0.25 z"
-         style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:2.11899996;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+         style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:2.11899996;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
          inkscape:connector-curvature="0" /><path
          id="path4295"
          d="m 535.9817,221.61069 c 0.52554,-0.0396 1.06213,-0.24019 1.575,-0.7 0.56164,-0.50351 1.1062,-1.24269 1.65,-2.225 0.5438,-0.98231 1.07684,-2.2136 1.6,-3.65 0.52313,-1.4364 1.02528,-3.0842 1.525,-4.95 0.49972,-1.86579 1.00152,-3.92954 1.475,-6.2 0.47347,-2.27047 0.93055,-4.74955 1.375,-7.4 0.44444,-2.65045 0.86239,-5.49429 1.275,-8.5 0.41259,-3.00571 0.82203,-6.18873 1.2,-9.525 0.37796,-3.33628 0.73448,-6.80787 1.075,-10.45 0.34052,-3.64212 0.67471,-7.42672 0.975,-11.35 0.25464,-3.32714 0.47827,-6.80738 0.7,-10.325 1.12307,-0.32362 2.25546,-0.62294 3.35,-1.025 1.74689,-0.64167 3.43778,-1.39293 5.1,-2.225 1.66222,-0.83207 3.28283,-1.76427 4.85,-2.775 1.56718,-1.01074 3.08823,-2.09736 4.55,-3.275 1.46176,-1.17763 2.85401,-2.4422 4.2,-3.775 0.54409,-0.53875 1.05073,-1.13866 1.575,-1.7 -0.1704,2.03794 -0.32062,4.10535 -0.525,6.1 -0.38362,3.74379 -0.82672,7.39904 -1.325,10.975 -0.49828,3.57596 -1.06866,7.06188 -1.675,10.45 -0.60635,3.38812 -1.2422,6.69475 -1.95,9.875 -0.70781,3.18025 -1.47234,6.24766 -2.275,9.2 -0.80267,2.95234 -1.65908,5.77058 -2.55,8.475 -0.89093,2.70442 -1.82743,5.28854 -2.8,7.725 -0.97258,2.43646 -1.97737,4.72652 -3.025,6.875 -1.04764,2.14848 -2.13392,4.15954 -3.25,6 -1.11608,1.84046 -2.27208,3.51257 -3.45,5.025 -1.17793,1.51243 -2.36684,2.86064 -3.6,4.025 -1.23317,1.16436 -2.49319,2.15373 -3.775,2.95 -1.28182,0.79627 -2.60115,1.39185 -3.925,1.8 -1.22501,0.37768 -2.46944,0.54616 -3.725,0.575 -0.0674,-5.5e-4 -0.13341,0.002 -0.2,0 z"
-         style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:2.11899996;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+         style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:2.11899996;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
          inkscape:connector-curvature="0" /><path
          id="path3452-8"
          d="m 535.8067,221.61069 c -0.0666,-0.002 -0.13338,-0.0226 -0.2,-0.025 -0.49646,-0.0605 -0.98992,-0.2401 -1.475,-0.675 -0.56161,-0.50351 -1.10625,-1.24269 -1.65,-2.225 -0.54376,-0.98231 -1.07691,-2.2136 -1.6,-3.65 -0.5231,-1.4364 -1.05036,-3.0842 -1.55,-4.95 -0.49965,-1.86579 -0.9766,-3.92954 -1.45,-6.2 -0.4734,-2.27047 -0.93064,-4.74955 -1.375,-7.4 -0.44436,-2.65045 -0.88749,-5.49429 -1.3,-8.5 -0.41252,-3.00571 -0.79713,-6.18873 -1.175,-9.525 -0.37788,-3.33628 -0.73457,-6.80787 -1.075,-10.45 -0.34044,-3.64212 -0.67481,-7.42672 -0.975,-11.35 -0.27368,-3.57682 -0.51183,-7.30596 -0.75,-11.1 1.49404,0.52042 3.00178,1.00134 4.55,1.375 1.82122,0.43954 3.68981,0.74936 5.575,0.975 1.88516,0.22565 3.78624,0.35 5.725,0.35 1.93876,0 3.86483,-0.12435 5.75,-0.35 1.88516,-0.22564 3.75377,-0.53546 5.575,-0.975 0.68012,-0.16414 1.33062,-0.40711 2,-0.6 -0.22173,3.51762 -0.44536,6.99786 -0.7,10.325 -0.30029,3.92328 -0.63448,7.70788 -0.975,11.35 -0.34052,3.64213 -0.69704,7.11372 -1.075,10.45 -0.37797,3.33627 -0.78741,6.51929 -1.2,9.525 -0.41261,3.00571 -0.83056,5.84955 -1.275,8.5 -0.44445,2.65045 -0.90153,5.12953 -1.375,7.4 -0.47348,2.27046 -0.97528,4.33421 -1.475,6.2 -0.49972,1.8658 -1.00187,3.5136 -1.525,4.95 -0.52316,1.4364 -1.0562,2.66769 -1.6,3.65 -0.5438,0.98231 -1.08836,1.72149 -1.65,2.225 -0.51287,0.45981 -1.04946,0.66041 -1.575,0.7 -0.0582,-0.002 -0.117,0.002 -0.175,0 z"
-         style="fill:#d30000;fill-opacity:1;stroke:#000000;stroke-width:2.11899996;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+         style="fill:#d30000;fill-opacity:1;stroke:#000000;stroke-width:2.11899996;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
          inkscape:connector-curvature="0" /><path
          inkscape:connector-curvature="0"
          inkscape:original-d="m 433.31594,115.44326 86.3174,-158.517471"
          inkscape:path-effect="#path-effect4264-1"
          id="path4262-2"
          d="m 433.31594,115.44326 86.3174,-158.517471"
-         style="fill:none;stroke:#000000;stroke-width:3.20000005;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /><path
+         style="fill:none;stroke:#000000;stroke-width:3.20000005;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /><path
          inkscape:connector-curvature="0"
          inkscape:original-d="M 498.25567,128.75389 526.89368,-39.040691"
          inkscape:path-effect="#path-effect4268-0"
          id="path4266-0"
          d="M 498.25567,128.75389 526.89368,-39.040691"
-         style="fill:none;stroke:#000000;stroke-width:3.20000005;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /><path
-         style="fill:none;stroke:#000000;stroke-width:3.20000005;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+         style="fill:none;stroke:#000000;stroke-width:3.20000005;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /><path
+         style="fill:none;stroke:#000000;stroke-width:3.20000005;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
          d="M 640.63904,115.44326 554.32164,-43.074211"
          id="path4270-8"
          inkscape:path-effect="#path-effect4274-7"
          inkscape:original-d="M 640.63904,115.44326 554.32164,-43.074211"
          inkscape:connector-curvature="0" /><path
-         style="fill:none;stroke:#000000;stroke-width:3.20000005;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+         style="fill:none;stroke:#000000;stroke-width:3.20000005;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
          d="M 575.69932,128.75389 547.0613,-39.040691"
          id="path4272-6"
          inkscape:path-effect="#path-effect4276-0"
          inkscape:original-d="m 108.35654,25.34938 41.0707,0"
          inkscape:path-effect="#path-effect4400"
          id="path4398"
-         d="m 108.35654,25.34938 41.0707,0"
+         d="m 108.35654,25.34938 h 41.0707"
          style="fill:none;stroke:#000000;stroke-width:2.4000001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /><path
          sodipodi:nodetypes="ccccc"
          inkscape:connector-curvature="0"
              inkscape:connector-curvature="0"
              style="fill:#868383;fill-opacity:1;stroke:none"
              d="m 535.8067,221.61069 c -0.0666,-0.002 -0.13338,-0.0226 -0.2,-0.025 -0.49646,-0.0605 -0.98992,-0.2401 -1.475,-0.675 -0.56161,-0.50351 -1.10625,-1.24269 -1.65,-2.225 -0.54376,-0.98231 -1.07691,-2.2136 -1.6,-3.65 -0.5231,-1.4364 -1.05036,-3.0842 -1.55,-4.95 -0.49965,-1.86579 -0.9766,-3.92954 -1.45,-6.2 -0.4734,-2.27047 -0.93064,-4.74955 -1.375,-7.4 -0.44436,-2.65045 -0.88749,-5.49429 -1.3,-8.5 -0.41252,-3.00571 -0.79713,-6.18873 -1.175,-9.525 -0.37788,-3.33628 -0.73457,-6.80787 -1.075,-10.45 -0.34044,-3.64212 -0.67481,-7.42672 -0.975,-11.35 -0.27368,-3.57682 -0.51183,-7.30596 -0.75,-11.1 1.49404,0.52042 3.00178,1.00134 4.55,1.375 1.82122,0.43954 3.68981,0.74936 5.575,0.975 1.88516,0.22565 3.78624,0.35 5.725,0.35 1.93876,0 3.86483,-0.12435 5.75,-0.35 1.88516,-0.22564 3.75377,-0.53546 5.575,-0.975 0.68012,-0.16414 1.33062,-0.40711 2,-0.6 -0.22173,3.51762 -0.44536,6.99786 -0.7,10.325 -0.30029,3.92328 -0.63448,7.70788 -0.975,11.35 -0.34052,3.64213 -0.69704,7.11372 -1.075,10.45 -0.37797,3.33627 -0.78741,6.51929 -1.2,9.525 -0.41261,3.00571 -0.83056,5.84955 -1.275,8.5 -0.44445,2.65045 -0.90153,5.12953 -1.375,7.4 -0.47348,2.27046 -0.97528,4.33421 -1.475,6.2 -0.49972,1.8658 -1.00187,3.5136 -1.525,4.95 -0.52316,1.4364 -1.0562,2.66769 -1.6,3.65 -0.5438,0.98231 -1.08836,1.72149 -1.65,2.225 -0.51287,0.45981 -1.04946,0.66041 -1.575,0.7 -0.0582,-0.002 -0.117,0.002 -0.175,0 z"
-             id="path3452-8-7" /></g></g></g></g></svg>
\ No newline at end of file
+             id="path3452-8-7" /></g></g></g><g
+       id="0parachute3"
+       inkscape:label="#g1577"
+       transform="translate(217.81027)"><g
+         style="opacity:0"
+         inkscape:export-ydpi="179.97391"
+         inkscape:export-xdpi="179.97391"
+         inkscape:export-filename="/home/xymus/projects/nit/contrib/action_nitro/assets/textures/parachute.png"
+         transform="matrix(0.72097491,0,0,0.72097491,-122.53984,-199.77977)"
+         inkscape:label="#g4396"
+         id="g612"><path
+           inkscape:connector-curvature="0"
+           transform="matrix(1.1096087,0,0,-1.1096087,-417.09708,329.14203)"
+           id="path588"
+           d="m 859.92383,96.863281 c -0.27426,0 -0.53686,0.04462 -0.81055,0.04687 -0.0607,4.96e-4 -0.12163,-0.0018 -0.18164,0 -0.0525,0.0018 -0.10398,-0.0018 -0.15625,0 -0.06,0.0018 -0.1216,0.01932 -0.18164,0.02148 -0.0823,0.0027 -0.16477,-9.02e-4 -0.24805,0 -51.29406,0.809754 -92.62109,40.532559 -92.62109,89.490239 0,2.07968 0.19117,4.12953 0.33789,6.17382 0.34226,-0.79761 0.66478,-1.61871 1.03516,-2.38867 0.68897,-1.4323 1.42765,-2.81489 2.20898,-4.14453 0.78133,-1.32966 1.58782,-2.61211 2.45508,-3.83008 0.86727,-1.21798 1.77979,-2.3949 2.72656,-3.49219 0.94677,-1.09726 1.93133,-2.12032 2.95117,-3.08789 1.01985,-0.96758 2.09122,-1.87429 3.17774,-2.70312 1.08652,-0.82887 2.18723,-1.57085 3.33398,-2.25195 1.14676,-0.68112 2.31311,-1.30182 3.51367,-1.82618 1.20058,-0.52436 2.44736,-0.96953 3.69532,-1.32812 1.24796,-0.35859 2.49622,-0.62871 3.78515,-0.8125 1.28895,-0.1838 2.59644,-0.26953 3.91992,-0.26953 1.23562,0 2.468,0.0876 3.67383,0.24804 1.20585,0.1604 2.41122,0.40722 3.58203,0.72071 1.1708,0.31349 2.29333,0.66766 3.42383,1.12695 1.1305,0.45926 2.25103,1.00189 3.33594,1.59961 1.08491,0.59774 2.1417,1.275 3.17578,2.00391 1.03407,0.72889 2.04158,1.51441 3.01953,2.36718 0.97796,0.85274 1.94476,1.75533 2.86133,2.72461 0.82993,0.87768 1.61416,1.8277 2.38867,2.79493 0.0808,0.10096 0.16771,0.19102 0.24805,0.29296 1.09936,-1.33038 2.25571,-2.60748 3.46875,-3.80859 1.21303,-1.20114 2.49123,-2.34104 3.80859,-3.40234 1.31737,-1.06131 2.68725,-2.04029 4.09961,-2.95118 1.41236,-0.91088 2.87307,-1.75012 4.3711,-2.5 1.498,-0.74987 3.02135,-1.42757 4.5957,-2.00585 0.23598,-0.0867 0.48328,-0.14191 0.7207,-0.22461 1.34646,-0.46902 2.70628,-0.90349 4.10156,-1.24024 1.64132,-0.39612 3.32447,-0.67555 5.02344,-0.87891 1.69894,-0.20335 3.41291,-0.31445 5.16016,-0.31445 1.74724,0 3.48269,0.1111 5.18164,0.31445 1.69894,0.20336 3.38406,0.48279 5.02539,0.87891 0.61294,0.14793 1.19752,0.36718 1.80078,0.54102 1.01213,0.29165 2.03311,0.56148 3.01953,0.92383 1.57433,0.57828 3.09768,1.25598 4.59571,2.00585 1.49802,0.74988 2.95873,1.58912 4.37109,2.5 1.41237,0.9109 2.78419,1.88987 4.10156,2.95118 1.31737,1.0613 2.57213,2.2012 3.78516,3.40234 0.49034,0.48553 0.94744,1.02731 1.41992,1.5332 0.69634,0.74558 1.4173,1.4828 2.07227,2.27539 0.84988,-1.07852 1.7182,-2.11858 2.63476,-3.08789 0.91657,-0.96928 1.88532,-1.87187 2.86328,-2.72461 0.97796,-0.85277 1.9835,-1.63829 3.01758,-2.36718 1.03406,-0.72891 2.09281,-1.40618 3.17773,-2.00391 1.08492,-0.59772 2.182,-1.14035 3.3125,-1.59961 0.76179,-0.3095 1.54163,-0.532 2.32032,-0.76562 0.37687,-0.11307 0.74314,-0.25909 1.125,-0.36133 1.1708,-0.31349 2.37815,-0.56031 3.58398,-0.72071 1.20585,-0.16039 2.41281,-0.24804 3.64844,-0.24804 1.32348,0 2.65443,0.0858 3.94336,0.26953 1.28893,0.18379 2.53718,0.45391 3.78515,0.8125 1.24795,0.35859 2.49474,0.80376 3.69532,1.32812 1.18528,0.51769 2.33606,1.13183 3.46875,1.80274 0.0146,0.009 0.0323,0.0148 0.0469,0.0234 1.14675,0.6811 2.24747,1.42308 3.33399,2.25195 1.08651,0.82883 2.15592,1.73554 3.17578,2.70312 1.01984,0.96757 2.00441,1.99063 2.95117,3.08789 0.94677,1.09729 1.8593,2.27421 2.72656,3.49219 0.86726,1.21797 1.6757,2.50042 2.45703,3.83008 0.78134,1.32963 1.51806,2.71223 2.20703,4.14453 0.37613,0.78192 0.71148,1.60169 1.0586,2.41211 0.14845,-2.05629 0.3164,-4.10514 0.3164,-6.19726 0,-48.31578 -40.28186,-87.574404 -90.64062,-89.376958 -0.34622,-0.01235 -0.68995,-0.03609 -1.03711,-0.04492 -0.85323,-0.02172 -1.6862,-0.136719 -2.54492,-0.136719 z"
+           style="fill:#d30000;fill-opacity:1;stroke:#000000;stroke-width:1.90968227;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /><path
+           style="fill:none;stroke:#000000;stroke-width:3.20000005;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+           d="m 433.31594,115.44326 86.3174,-158.517471"
+           id="path602"
+           inkscape:path-effect="#path-effect4264-1"
+           inkscape:original-d="m 433.31594,115.44326 86.3174,-158.517471"
+           inkscape:connector-curvature="0" /><path
+           style="fill:none;stroke:#000000;stroke-width:3.20000005;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+           d="M 498.25567,128.75389 526.89368,-39.040691"
+           id="path604"
+           inkscape:path-effect="#path-effect4268-0"
+           inkscape:original-d="M 498.25567,128.75389 526.89368,-39.040691"
+           inkscape:connector-curvature="0" /><path
+           inkscape:connector-curvature="0"
+           inkscape:original-d="M 640.63904,115.44326 554.32164,-43.074211"
+           inkscape:path-effect="#path-effect4274-7"
+           id="path606"
+           d="M 640.63904,115.44326 554.32164,-43.074211"
+           style="fill:none;stroke:#000000;stroke-width:3.20000005;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /><path
+           inkscape:connector-curvature="0"
+           inkscape:original-d="M 575.69932,128.75389 547.0613,-39.040691"
+           inkscape:path-effect="#path-effect4276-0"
+           id="path608"
+           d="M 575.69932,128.75389 547.0613,-39.040691"
+           style="fill:none;stroke:#000000;stroke-width:3.20000005;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /></g><g
+         id="g585"
+         inkscape:label="#g4396"
+         transform="matrix(0.72097491,0,0,0.72097491,-122.53984,-199.77977)"
+         inkscape:export-filename="/home/xymus/projects/nit/contrib/action_nitro/assets/textures/parachute.png"
+         inkscape:export-xdpi="179.97391"
+         inkscape:export-ydpi="179.97391"><path
+           id="path561"
+           d="m 540.28987,221.46069 c 2.31507,-0.37945 4.59505,-0.87242 6.81475,-1.55 2.39073,-0.72978 4.72079,-1.64757 6.9962,-2.7 2.27541,-1.05243 4.49822,-2.24898 6.65344,-3.6 2.15523,-1.35102 4.26037,-2.84943 6.29055,-4.475 2.03015,-1.62557 3.98705,-3.37394 5.88728,-5.25 1.90024,-1.87606 3.73879,-3.87249 5.50423,-5.975 1.76541,-2.10251 3.45506,-4.3201 5.0808,-6.625 1.62575,-2.3049 3.17622,-4.69174 4.6574,-7.175 1.48119,-2.48326 2.90226,-5.06245 4.23401,-7.7 1.33176,-2.63755 2.57268,-5.35721 3.75013,-8.125 1.17746,-2.76779 2.2883,-5.57601 3.30657,-8.45 1.01827,-2.87399 1.9483,-5.79386 2.80251,-8.75 0.85422,-2.95614 1.63334,-5.96077 2.31863,-8.975 0.17697,-0.77843 0.29822,-1.5687 0.46372,-2.35 0.0133,-0.01 0.0273,-0.0154 0.0403,-0.025 1.0262,-0.75576 2.01167,-1.58028 2.98396,-2.5 0.97229,-0.91968 1.9302,-1.92636 2.84284,-3 0.91264,-1.07362 1.79399,-2.20747 2.64122,-3.425 0.84724,-1.21756 1.66349,-2.52352 2.4396,-3.875 0.77609,-1.35147 1.49846,-2.7746 2.19766,-4.25 0.69919,-1.47537 1.35933,-3.01071 1.97585,-4.6 0.33661,-0.86762 0.637,-1.77575 0.94763,-2.675 0.13285,2.28168 0.28226,4.55356 0.28226,6.875 0,53.6116 -36.04673,97.17487 -81.11156,99.175 z"
+           style="fill:#d30000;fill-opacity:1;stroke:#000000;stroke-width:1.90294969;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+           inkscape:connector-curvature="0" /><path
+           id="path563"
+           d="m 539.36243,221.51069 c -0.0268,-0.004 -0.053,5.1e-4 -0.0805,0 0.70464,-0.0353 1.43711,-0.23691 2.21783,-0.7 2.2454,-0.93873 4.39588,-2.06496 6.45183,-3.35 2.05593,-1.28504 4.01663,-2.73047 5.88728,-4.325 1.87064,-1.59453 3.65336,-3.3328 5.34292,-5.2 1.68954,-1.8672 3.28589,-3.87194 4.79855,-5.975 1.51264,-2.10306 2.95457,-4.29791 4.29449,-6.6 1.33992,-2.30209 2.57873,-4.71069 3.75012,-7.175 1.1714,-2.46431 2.2592,-4.98528 3.26624,-7.575 1.00703,-2.58972 1.93546,-5.2467 2.78235,-7.925 0.8469,-2.6783 1.62768,-5.39492 2.31864,-8.125 0.6909,-2.73008 1.29557,-5.47997 1.83473,-8.225 0.53916,-2.74503 0.9996,-5.47682 1.39118,-8.2 0.25022,-1.74021 0.43364,-3.45604 0.62502,-5.175 0.33725,0.12546 0.66638,0.28655 1.00809,0.4 1.04771,0.34785 2.12668,0.62202 3.20576,0.8 1.07909,0.17798 2.1605,0.275 3.26622,0.275 1.18437,0 2.37492,-0.0961 3.52836,-0.3 1.15342,-0.20394 2.27042,-0.50211 3.3872,-0.9 1.11677,-0.3979 2.2322,-0.89316 3.30655,-1.475 1.06069,-0.57443 2.09134,-1.25556 3.10496,-2 -0.16552,0.7813 -0.28676,1.57157 -0.46373,2.35 -0.68529,3.01423 -1.46441,6.01886 -2.31863,8.975 -0.85422,2.95614 -1.78423,5.87601 -2.8025,8.75 -1.01828,2.87399 -2.12912,5.68221 -3.30657,8.45 -1.17746,2.76779 -2.41837,5.48745 -3.75012,8.125 -1.33176,2.63755 -2.75284,5.21674 -4.23402,7.7 -1.48118,2.48326 -3.03167,4.8701 -4.65739,7.175 -1.62577,2.3049 -3.31541,4.52249 -5.08082,6.625 -1.76544,2.10251 -3.60399,4.09894 -5.50424,5.975 -1.90022,1.87606 -3.85711,3.62443 -5.88728,5.25 -2.03018,1.62557 -4.13531,3.12398 -6.29054,4.475 -2.15523,1.35102 -4.37803,2.54757 -6.65343,3.6 -2.27543,1.05243 -4.60548,1.97022 -6.99622,2.7 -2.21969,0.67758 -4.49967,1.17055 -6.81474,1.55 -0.30981,0.0137 -0.61677,0.0402 -0.92745,0.05 z"
+           style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1.90294969;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+           inkscape:connector-curvature="0" /><path
+           id="path565"
+           d="m 537.08413,221.66069 c -0.24542,0 -0.48092,-0.0475 -0.72583,-0.05 1.01258,-0.0288 2.01618,-0.19732 3.00413,-0.575 1.06766,-0.40815 2.13166,-1.00373 3.16544,-1.8 1.03374,-0.79627 2.04991,-1.78564 3.04444,-2.95 0.99452,-1.16436 1.95336,-2.51257 2.90333,-4.025 0.94996,-1.51243 1.88226,-3.18454 2.78234,-5.025 0.9001,-1.84046 1.77616,-3.85152 2.62107,-6 0.84489,-2.14848 1.65522,-4.43854 2.4396,-6.875 0.78435,-2.43646 1.53962,-5.02058 2.25813,-7.725 0.7185,-2.70442 1.40918,-5.52266 2.05652,-8.475 0.64733,-2.95234 1.26391,-6.01975 1.83474,-9.2 0.57083,-3.18025 1.08362,-6.48688 1.57263,-9.875 0.489,-3.38812 0.949,-6.87404 1.35084,-10.45 0.40185,-3.57596 0.75922,-7.23121 1.06859,-10.975 0.16482,-1.99465 0.28598,-4.06206 0.42341,-6.1 0.62314,-0.8273 1.26879,-1.64553 1.85489,-2.525 0.76055,1.19674 1.53876,2.34945 2.35895,3.425 0.82022,1.07553 1.68543,2.0788 2.56058,3.025 0.87515,0.94624 1.77632,1.81621 2.70169,2.625 0.92535,0.8088 1.87198,1.56175 2.84285,2.225 0.97085,0.66324 1.95214,1.2654 2.96379,1.775 0.68172,0.34342 1.37986,0.59077 2.07669,0.85 -0.19137,1.71896 -0.37479,3.43479 -0.62502,5.175 -0.39157,2.72318 -0.85202,5.45497 -1.39117,8.2 -0.53916,2.74503 -1.14382,5.49492 -1.83474,8.225 -0.69094,2.73008 -1.47173,5.4467 -2.31864,8.125 -0.84688,2.6783 -1.7753,5.33528 -2.78234,7.925 -1.00704,2.58972 -2.09485,5.11069 -3.26624,7.575 -1.17138,2.46431 -2.4102,4.87291 -3.75011,7.175 -1.33993,2.30209 -2.78187,4.49694 -4.29451,6.6 -1.51265,2.10306 -3.109,4.1078 -4.79855,5.975 -1.68955,1.8672 -3.47226,3.60547 -5.34292,5.2 -1.87065,1.59453 -3.83135,3.03996 -5.88728,4.325 -2.05595,1.28504 -4.20641,2.41127 -6.45183,3.35 -0.78072,0.46309 -1.51319,0.6647 -2.21782,0.7 0.0276,5.1e-4 0.0539,-0.004 0.0805,0 -0.76353,0.0241 -1.50984,0.15 -2.27831,0.15 z"
+           style="fill:#d30000;fill-opacity:1;stroke:#000000;stroke-width:1.90294969;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+           inkscape:connector-curvature="0" /><path
+           id="path567"
+           d="m 535.67279,221.58569 c -45.90179,-0.89851 -82.88581,-44.97614 -82.88581,-99.3 0,-2.30764 0.17113,-4.58164 0.30241,-6.85 0.30629,0.88504 0.59604,1.79565 0.92748,2.65 0.61652,1.58929 1.27666,3.12462 1.97585,4.6 0.6992,1.4754 1.42157,2.89853 2.19766,4.25 0.77611,1.35148 1.59236,2.65744 2.4396,3.875 0.84723,1.21753 1.72858,2.35138 2.64122,3.425 0.91264,1.07364 1.87053,2.08032 2.84284,3 0.97229,0.91972 1.95776,1.74424 2.98396,2.5 1.0262,0.75577 2.0709,1.44317 3.14528,2.025 1.07434,0.58184 2.18979,1.0771 3.30655,1.475 1.11678,0.39789 2.23377,0.69606 3.38721,0.9 1.15344,0.20394 2.32382,0.3 3.50818,0.3 1.10572,0 2.20733,-0.097 3.28639,-0.275 1.0791,-0.17798 2.15803,-0.45215 3.20577,-0.8 1.04771,-0.34785 2.05296,-0.74037 3.06462,-1.25 1.01164,-0.5096 2.01309,-1.11176 2.98395,-1.775 0.97087,-0.66326 1.91747,-1.4162 2.84284,-2.225 0.92537,-0.80879 1.82657,-1.67876 2.7017,-2.625 0.87515,-0.9462 1.74036,-1.94947 2.56058,-3.025 0.74268,-0.97388 1.44407,-2.02676 2.13717,-3.1 0.17318,2.79275 0.34035,5.58636 0.56453,8.3 0.30927,3.74379 0.66687,7.39904 1.06858,10.975 0.40174,3.57596 0.84182,7.06188 1.33069,10.45 0.48886,3.38812 1.02214,6.69475 1.59279,9.875 0.57069,3.18025 1.18758,6.24766 1.83474,9.2 0.64717,2.95234 1.31802,5.77058 2.03637,8.475 0.71833,2.70442 1.47394,5.28854 2.25813,7.725 0.7842,2.43646 1.61503,4.72652 2.45977,6.875 0.84473,2.14848 1.70093,4.15954 2.60088,6 0.89995,1.84046 1.8325,3.51257 2.78236,5.025 0.94983,1.51243 1.92906,2.86064 2.92348,4.025 0.99442,1.16436 2.01077,2.15373 3.04445,2.95 1.03367,0.79627 2.07766,1.39185 3.14528,1.8 0.92214,0.35254 1.85873,0.50095 2.8025,0.55 z"
+           style="fill:#0028dd;fill-opacity:1;stroke:#000000;stroke-width:1.90294969;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+           inkscape:connector-curvature="0" /><path
+           id="path569"
+           d="m 524.30146,145.56069 c 0.19205,3.79404 0.38413,7.52318 0.60484,11.1 0.24211,3.92328 0.51176,7.70788 0.78633,11.35 0.27455,3.64213 0.5622,7.11372 0.86695,10.45 0.30476,3.33627 0.61492,6.51929 0.94762,9.525 0.33269,3.00571 0.69006,5.84955 1.04842,8.5 0.35837,2.65045 0.72712,5.12953 1.10891,7.4 0.38178,2.27046 0.76644,4.33421 1.1694,6.2 0.40294,1.8658 0.82817,3.5136 1.25003,4.95 0.42187,1.4364 0.85183,2.66769 1.29037,3.65 0.43851,0.98231 0.87777,1.72149 1.33068,2.225 0.39122,0.4349 0.78918,0.6145 1.18956,0.675 -0.0737,-0.003 -0.14722,0.001 -0.22178,0 -0.94377,-0.0491 -1.88036,-0.19746 -2.8025,-0.55 -1.06762,-0.40815 -2.11161,-1.00373 -3.14528,-1.8 -1.03368,-0.79627 -2.05003,-1.78564 -3.04445,-2.95 -0.99442,-1.16436 -1.97365,-2.51257 -2.92348,-4.025 -0.94986,-1.51243 -1.88241,-3.18454 -2.78236,-5.025 -0.89995,-1.84046 -1.75615,-3.85152 -2.60088,-6 -0.84474,-2.14848 -1.67557,-4.43854 -2.45977,-6.875 -0.78419,-2.43646 -1.5398,-5.02058 -2.25813,-7.725 -0.71835,-2.70442 -1.3892,-5.52266 -2.03637,-8.475 -0.64716,-2.95234 -1.26405,-6.01975 -1.83474,-9.2 -0.57065,-3.18025 -1.10393,-6.48688 -1.59279,-9.875 -0.48887,-3.38812 -0.92895,-6.87404 -1.33069,-10.45 -0.40171,-3.57596 -0.75931,-7.23121 -1.06858,-10.975 -0.22418,-2.71364 -0.39135,-5.50725 -0.56453,-8.3 0.0723,-0.11203 0.14988,-0.21188 0.22178,-0.325 0.98378,1.4762 2.01942,2.89224 3.10493,4.225 1.08552,1.3328 2.2285,2.59737 3.40737,3.775 1.1789,1.17764 2.40559,2.26427 3.66948,3.275 1.26388,1.01073 2.57089,1.94293 3.91143,2.775 1.34053,0.83207 2.70418,1.58333 4.11302,2.225 0.21119,0.0962 0.43273,0.15823 0.64521,0.25 z"
+           style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1.90294969;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+           inkscape:connector-curvature="0" /><path
+           id="path571"
+           d="m 536.19701,221.61069 c 0.42382,-0.0396 0.85657,-0.24019 1.27019,-0.7 0.45295,-0.50351 0.89213,-1.24269 1.33069,-2.225 0.43858,-0.98231 0.86846,-2.2136 1.29038,-3.65 0.42188,-1.4364 0.82686,-3.0842 1.22987,-4.95 0.40301,-1.86579 0.80771,-3.92954 1.18955,-6.2 0.38184,-2.27047 0.75047,-4.74955 1.10891,-7.4 0.35843,-2.65045 0.69551,-5.49429 1.02826,-8.5 0.33274,-3.00571 0.66295,-6.18873 0.96778,-9.525 0.30481,-3.33628 0.59235,-6.80787 0.86696,-10.45 0.27462,-3.64212 0.54414,-7.42672 0.78632,-11.35 0.20536,-3.32714 0.38571,-6.80738 0.56454,-10.325 0.90573,-0.32362 1.81897,-0.62294 2.7017,-1.025 1.40883,-0.64167 2.77249,-1.39293 4.11304,-2.225 1.34054,-0.83207 2.64753,-1.76427 3.91141,-2.775 1.26389,-1.01074 2.4906,-2.09736 3.66948,-3.275 1.17888,-1.17763 2.3017,-2.4422 3.38721,-3.775 0.43881,-0.53875 0.84739,-1.13866 1.27021,-1.7 -0.13744,2.03794 -0.25859,4.10535 -0.42341,6.1 -0.30937,3.74379 -0.66674,7.39904 -1.06859,10.975 -0.40184,3.57596 -0.86184,7.06188 -1.35084,10.45 -0.48901,3.38812 -1.0018,6.69475 -1.57263,9.875 -0.57083,3.18025 -1.18741,6.24766 -1.83474,9.2 -0.64734,2.95234 -1.33802,5.77058 -2.05652,8.475 -0.71851,2.70442 -1.47378,5.28854 -2.25813,7.725 -0.78438,2.43646 -1.59471,4.72652 -2.4396,6.875 -0.84491,2.14848 -1.72097,4.15954 -2.62107,6 -0.90008,1.84046 -1.83238,3.51257 -2.78234,5.025 -0.94997,1.51243 -1.90881,2.86064 -2.90333,4.025 -0.99453,1.16436 -2.0107,2.15373 -3.04444,2.95 -1.03378,0.79627 -2.09778,1.39185 -3.16544,1.8 -0.98795,0.37768 -1.99155,0.54616 -3.00413,0.575 -0.0543,-5.5e-4 -0.10753,0.002 -0.16129,0 z"
+           style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1.90294969;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+           inkscape:connector-curvature="0" /><path
+           id="path573"
+           d="m 536.05588,221.61069 c -0.0538,-0.002 -0.10754,-0.0226 -0.16131,-0.025 -0.40038,-0.0605 -0.79834,-0.2401 -1.18956,-0.675 -0.45291,-0.50351 -0.89217,-1.24269 -1.33068,-2.225 -0.43854,-0.98231 -0.8685,-2.2136 -1.29037,-3.65 -0.42186,-1.4364 -0.84709,-3.0842 -1.25003,-4.95 -0.40296,-1.86579 -0.78762,-3.92954 -1.1694,-6.2 -0.38179,-2.27047 -0.75054,-4.74955 -1.10891,-7.4 -0.35836,-2.65045 -0.71573,-5.49429 -1.04842,-8.5 -0.3327,-3.00571 -0.64286,-6.18873 -0.94762,-9.525 -0.30475,-3.33628 -0.5924,-6.80787 -0.86695,-10.45 -0.27457,-3.64212 -0.54422,-7.42672 -0.78633,-11.35 -0.22071,-3.57682 -0.41279,-7.30596 -0.60484,-11.1 1.20491,0.52042 2.42085,1.00134 3.66946,1.375 1.46878,0.43954 2.97575,0.74936 4.49613,0.975 1.52033,0.22565 3.05352,0.35 4.61708,0.35 1.56357,0 3.11689,-0.12435 4.63725,-0.35 1.52034,-0.22564 3.02734,-0.53546 4.49612,-0.975 0.54849,-0.16414 1.07311,-0.40711 1.61296,-0.6 -0.17883,3.51762 -0.35918,6.99786 -0.56454,10.325 -0.24218,3.92328 -0.5117,7.70788 -0.78632,11.35 -0.27461,3.64213 -0.56215,7.11372 -0.86696,10.45 -0.30483,3.33627 -0.63504,6.51929 -0.96778,9.525 -0.33275,3.00571 -0.66983,5.84955 -1.02826,8.5 -0.35844,2.65045 -0.72707,5.12953 -1.10891,7.4 -0.38184,2.27046 -0.78654,4.33421 -1.18955,6.2 -0.40301,1.8658 -0.80799,3.5136 -1.22987,4.95 -0.42192,1.4364 -0.8518,2.66769 -1.29038,3.65 -0.43856,0.98231 -0.87774,1.72149 -1.33069,2.225 -0.41362,0.45981 -0.84637,0.66041 -1.27019,0.7 -0.047,-0.002 -0.0943,0.002 -0.14115,0 z"
+           style="fill:#d30000;fill-opacity:1;stroke:#000000;stroke-width:1.90294969;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+           inkscape:connector-curvature="0" /><path
+           sodipodi:nodetypes="cc"
+           inkscape:connector-curvature="0"
+           inkscape:original-d="M 453.08939,115.43569 519.63335,-43.074211"
+           inkscape:path-effect="#path-effect631"
+           id="path575"
+           d="M 453.08939,115.43569 519.63335,-43.074211"
+           style="fill:none;stroke:#000000;stroke-width:3.19999909;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /><path
+           sodipodi:nodetypes="cc"
+           inkscape:connector-curvature="0"
+           inkscape:original-d="M 505.45002,129.03569 526.89369,-39.040691"
+           inkscape:path-effect="#path-effect633"
+           id="path577"
+           d="M 505.45002,129.03569 526.89369,-39.040691"
+           style="fill:none;stroke:#000000;stroke-width:3.19999909;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /><path
+           sodipodi:nodetypes="cc"
+           style="fill:none;stroke:#000000;stroke-width:3.19999909;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+           d="M 621.11915,115.41069 554.32164,-43.074211"
+           id="path579"
+           inkscape:path-effect="#path-effect635"
+           inkscape:original-d="M 621.11915,115.41069 554.32164,-43.074211"
+           inkscape:connector-curvature="0" /><path
+           sodipodi:nodetypes="cc"
+           style="fill:none;stroke:#000000;stroke-width:3.19999909;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+           d="M 568.7384,129.03569 547.0613,-39.040691"
+           id="path581"
+           inkscape:path-effect="#path-effect637"
+           inkscape:original-d="M 568.7384,129.03569 547.0613,-39.040691"
+           inkscape:connector-curvature="0" /><path
+           sodipodi:nodetypes="cccc"
+           inkscape:connector-curvature="0"
+           id="path583"
+           d="m 536.05683,220.24351 c -11.98009,2.50969 -55.62638,-10.17702 -74.82365,-56.89483 27.47707,51.12867 137.46914,25.38397 137.46914,25.38397 -4.55878,3.60894 -22.4821,31.91148 -62.64549,31.51086 z"
+           style="opacity:0.4;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.89804143" /></g></g><g
+       id="0parachute2"
+       inkscape:label="#g1598"
+       transform="translate(-169.32475)"><g
+         id="g649"
+         inkscape:label="#g4396"
+         transform="matrix(0.72097491,0,0,0.72097491,65.700861,-199.77977)"
+         inkscape:export-filename="/home/xymus/projects/nit/contrib/action_nitro/assets/textures/parachute.png"
+         inkscape:export-xdpi="179.97391"
+         inkscape:export-ydpi="179.97391"
+         style="opacity:0"><path
+           inkscape:connector-curvature="0"
+           style="fill:#d30000;fill-opacity:1;stroke:#000000;stroke-width:1.90968227;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+           d="m 859.92383,96.863281 c -0.27426,0 -0.53686,0.04462 -0.81055,0.04687 -0.0607,4.96e-4 -0.12163,-0.0018 -0.18164,0 -0.0525,0.0018 -0.10398,-0.0018 -0.15625,0 -0.06,0.0018 -0.1216,0.01932 -0.18164,0.02148 -0.0823,0.0027 -0.16477,-9.02e-4 -0.24805,0 -51.29406,0.809754 -92.62109,40.532559 -92.62109,89.490239 0,2.07968 0.19117,4.12953 0.33789,6.17382 0.34226,-0.79761 0.66478,-1.61871 1.03516,-2.38867 0.68897,-1.4323 1.42765,-2.81489 2.20898,-4.14453 0.78133,-1.32966 1.58782,-2.61211 2.45508,-3.83008 0.86727,-1.21798 1.77979,-2.3949 2.72656,-3.49219 0.94677,-1.09726 1.93133,-2.12032 2.95117,-3.08789 1.01985,-0.96758 2.09122,-1.87429 3.17774,-2.70312 1.08652,-0.82887 2.18723,-1.57085 3.33398,-2.25195 1.14676,-0.68112 2.31311,-1.30182 3.51367,-1.82618 1.20058,-0.52436 2.44736,-0.96953 3.69532,-1.32812 1.24796,-0.35859 2.49622,-0.62871 3.78515,-0.8125 1.28895,-0.1838 2.59644,-0.26953 3.91992,-0.26953 1.23562,0 2.468,0.0876 3.67383,0.24804 1.20585,0.1604 2.41122,0.40722 3.58203,0.72071 1.1708,0.31349 2.29333,0.66766 3.42383,1.12695 1.1305,0.45926 2.25103,1.00189 3.33594,1.59961 1.08491,0.59774 2.1417,1.275 3.17578,2.00391 1.03407,0.72889 2.04158,1.51441 3.01953,2.36718 0.97796,0.85274 1.94476,1.75533 2.86133,2.72461 0.82993,0.87768 1.61416,1.8277 2.38867,2.79493 0.0808,0.10096 0.16771,0.19102 0.24805,0.29296 1.09936,-1.33038 2.25571,-2.60748 3.46875,-3.80859 1.21303,-1.20114 2.49123,-2.34104 3.80859,-3.40234 1.31737,-1.06131 2.68725,-2.04029 4.09961,-2.95118 1.41236,-0.91088 2.87307,-1.75012 4.3711,-2.5 1.498,-0.74987 3.02135,-1.42757 4.5957,-2.00585 0.23598,-0.0867 0.48328,-0.14191 0.7207,-0.22461 1.34646,-0.46902 2.70628,-0.90349 4.10156,-1.24024 1.64132,-0.39612 3.32447,-0.67555 5.02344,-0.87891 1.69894,-0.20335 3.41291,-0.31445 5.16016,-0.31445 1.74724,0 3.48269,0.1111 5.18164,0.31445 1.69894,0.20336 3.38406,0.48279 5.02539,0.87891 0.61294,0.14793 1.19752,0.36718 1.80078,0.54102 1.01213,0.29165 2.03311,0.56148 3.01953,0.92383 1.57433,0.57828 3.09768,1.25598 4.59571,2.00585 1.49802,0.74988 2.95873,1.58912 4.37109,2.5 1.41237,0.9109 2.78419,1.88987 4.10156,2.95118 1.31737,1.0613 2.57213,2.2012 3.78516,3.40234 0.49034,0.48553 0.94744,1.02731 1.41992,1.5332 0.69634,0.74558 1.4173,1.4828 2.07227,2.27539 0.84988,-1.07852 1.7182,-2.11858 2.63476,-3.08789 0.91657,-0.96928 1.88532,-1.87187 2.86328,-2.72461 0.97796,-0.85277 1.9835,-1.63829 3.01758,-2.36718 1.03406,-0.72891 2.09281,-1.40618 3.17773,-2.00391 1.08492,-0.59772 2.182,-1.14035 3.3125,-1.59961 0.76179,-0.3095 1.54163,-0.532 2.32032,-0.76562 0.37687,-0.11307 0.74314,-0.25909 1.125,-0.36133 1.1708,-0.31349 2.37815,-0.56031 3.58398,-0.72071 1.20585,-0.16039 2.41281,-0.24804 3.64844,-0.24804 1.32348,0 2.65443,0.0858 3.94336,0.26953 1.28893,0.18379 2.53718,0.45391 3.78515,0.8125 1.24795,0.35859 2.49474,0.80376 3.69532,1.32812 1.18528,0.51769 2.33606,1.13183 3.46875,1.80274 0.0146,0.009 0.0323,0.0148 0.0469,0.0234 1.14675,0.6811 2.24747,1.42308 3.33399,2.25195 1.08651,0.82883 2.15592,1.73554 3.17578,2.70312 1.01984,0.96757 2.00441,1.99063 2.95117,3.08789 0.94677,1.09729 1.8593,2.27421 2.72656,3.49219 0.86726,1.21797 1.6757,2.50042 2.45703,3.83008 0.78134,1.32963 1.51806,2.71223 2.20703,4.14453 0.37613,0.78192 0.71148,1.60169 1.0586,2.41211 0.14845,-2.05629 0.3164,-4.10514 0.3164,-6.19726 0,-48.31578 -40.28186,-87.574404 -90.64062,-89.376958 -0.34622,-0.01235 -0.68995,-0.03609 -1.03711,-0.04492 -0.85323,-0.02172 -1.6862,-0.136719 -2.54492,-0.136719 z"
+           id="path639"
+           transform="matrix(1.1096087,0,0,-1.1096087,-417.09708,329.14203)" /><path
+           inkscape:connector-curvature="0"
+           inkscape:original-d="m 433.31594,115.44326 86.3174,-158.517471"
+           inkscape:path-effect="#path-effect4264-1"
+           id="path641"
+           d="m 433.31594,115.44326 86.3174,-158.517471"
+           style="fill:none;stroke:#000000;stroke-width:3.20000005;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /><path
+           inkscape:connector-curvature="0"
+           inkscape:original-d="M 498.25567,128.75389 526.89368,-39.040691"
+           inkscape:path-effect="#path-effect4268-0"
+           id="path643"
+           d="M 498.25567,128.75389 526.89368,-39.040691"
+           style="fill:none;stroke:#000000;stroke-width:3.20000005;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /><path
+           style="fill:none;stroke:#000000;stroke-width:3.20000005;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+           d="M 640.63904,115.44326 554.32164,-43.074211"
+           id="path645"
+           inkscape:path-effect="#path-effect4274-7"
+           inkscape:original-d="M 640.63904,115.44326 554.32164,-43.074211"
+           inkscape:connector-curvature="0" /><path
+           style="fill:none;stroke:#000000;stroke-width:3.20000005;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+           d="M 575.69932,128.75389 547.0613,-39.040691"
+           id="path647"
+           inkscape:path-effect="#path-effect4276-0"
+           inkscape:original-d="M 575.69932,128.75389 547.0613,-39.040691"
+           inkscape:connector-curvature="0" /></g><g
+         inkscape:export-ydpi="179.97391"
+         inkscape:export-xdpi="179.97391"
+         inkscape:export-filename="/home/xymus/projects/nit/contrib/action_nitro/assets/textures/parachute.png"
+         transform="matrix(0.72097491,0,0,0.72097491,65.700861,-199.77977)"
+         inkscape:label="#g4396"
+         id="g675"><path
+           inkscape:connector-curvature="0"
+           style="fill:#d30000;fill-opacity:1;stroke:#000000;stroke-width:1.64575696;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+           d="m 539.48442,215.52678 c 1.73158,-0.37945 3.4369,-0.87242 5.09715,-1.55 1.78816,-0.72978 3.53094,-1.64757 5.23285,-2.7 1.70191,-1.05243 3.36448,-2.24898 4.97649,-3.6 1.61202,-1.35102 3.18658,-2.84943 4.70507,-4.475 1.51846,-1.62557 2.98214,-3.37394 4.40343,-5.25 1.4213,-1.87606 2.79646,-3.87249 4.11693,-5.975 1.32045,-2.10251 2.58424,-4.3201 3.80022,-6.625 1.21599,-2.3049 2.37568,-4.69174 3.48354,-7.175 1.10786,-2.48326 2.17076,-5.06245 3.16686,-7.7 0.99609,-2.63755 1.92425,-5.35721 2.80493,-8.125 0.88069,-2.76779 1.71155,-5.57601 2.47318,-8.45 0.76162,-2.87399 1.45724,-5.79386 2.09615,-8.75 0.63892,-2.95614 1.22167,-5.96077 1.73424,-8.975 0.13237,-0.77843 0.22306,-1.5687 0.34684,-2.35 0.01,-0.01 0.0204,-0.0154 0.0301,-0.025 0.76756,-0.75576 1.50465,-1.58028 2.23188,-2.5 0.72723,-0.91968 1.44371,-1.92636 2.12632,-3 0.68262,-1.07362 1.34183,-2.20747 1.97552,-3.425 0.6337,-1.21756 1.24422,-2.52352 1.82472,-3.875 0.58048,-1.35147 1.12078,-2.7746 1.64375,-4.25 0.52297,-1.47537 1.01673,-3.01071 1.47786,-4.6 0.25177,-0.86762 0.47644,-1.77575 0.70878,-2.675 0.0994,2.28168 0.21112,4.55356 0.21112,6.875 0,53.6116 -26.96141,97.17487 -60.66798,99.175 z"
+           id="path651" /><path
+           inkscape:connector-curvature="0"
+           style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1.64575696;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+           d="m 538.79074,215.57678 c -0.0201,-0.004 -0.0396,5.1e-4 -0.0602,0 0.52704,-0.0353 1.07489,-0.23691 1.65884,-0.7 1.67946,-0.93873 3.28793,-2.06496 4.82569,-3.35 1.53775,-1.28504 3.00427,-2.73047 4.40344,-4.325 1.39916,-1.59453 2.73255,-3.3328 3.99627,-5.2 1.26371,-1.8672 2.45771,-3.87194 3.58911,-5.975 1.13139,-2.10306 2.2099,-4.29791 3.2121,-6.6 1.0022,-2.30209 1.92878,-4.71069 2.80493,-7.175 0.87616,-2.46431 1.68978,-4.98528 2.44301,-7.575 0.75321,-2.58972 1.44764,-5.2467 2.08107,-7.925 0.63345,-2.6783 1.21744,-5.39492 1.73425,-8.125 0.51676,-2.73008 0.96903,-5.47997 1.3723,-8.225 0.40327,-2.74503 0.74766,-5.47682 1.04054,-8.2 0.18716,-1.74021 0.32435,-3.45604 0.46749,-5.175 0.25225,0.12546 0.49842,0.28655 0.75401,0.4 0.78364,0.34785 1.59066,0.62202 2.39777,0.8 0.80711,0.17798 1.61596,0.275 2.44299,0.275 0.88586,0 1.77634,-0.0961 2.63907,-0.3 0.8627,-0.20394 1.69817,-0.50211 2.53348,-0.9 0.83529,-0.3979 1.66959,-0.89316 2.47315,-1.475 0.79336,-0.57443 1.56424,-1.25556 2.32238,-2 -0.1238,0.7813 -0.21448,1.57157 -0.34685,2.35 -0.51257,3.01423 -1.09531,6.01886 -1.73423,8.975 -0.63892,2.95614 -1.33453,5.87601 -2.09615,8.75 -0.76163,2.87399 -1.5925,5.68221 -2.47318,8.45 -0.88069,2.76779 -1.80884,5.48745 -2.80493,8.125 -0.9961,2.63755 -2.059,5.21674 -3.16686,7.7 -1.10786,2.48326 -2.26756,4.8701 -3.48353,7.175 -1.21601,2.3049 -2.47979,4.52249 -3.80024,6.625 -1.32047,2.10251 -2.69563,4.09894 -4.11694,5.975 -1.42128,1.87606 -2.88495,3.62443 -4.40343,5.25 -1.51849,1.62557 -3.09303,3.12398 -4.70505,4.475 -1.61202,1.35102 -3.27458,2.54757 -4.97649,3.6 -1.70192,1.05243 -3.4447,1.97022 -5.23287,2.7 -1.66023,0.67758 -3.36556,1.17055 -5.09713,1.55 -0.23173,0.0137 -0.46132,0.0402 -0.6937,0.05 z"
+           id="path653" /><path
+           inkscape:connector-curvature="0"
+           style="fill:#d30000;fill-opacity:1;stroke:#000000;stroke-width:1.64575696;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+           d="m 537.08667,215.72678 c -0.18357,0 -0.35971,-0.0475 -0.54289,-0.05 0.75736,-0.0288 1.50801,-0.19732 2.24696,-0.575 0.79856,-0.40815 1.59439,-1.00373 2.36761,-1.8 0.7732,-0.79627 1.53325,-1.78564 2.27711,-2.95 0.74386,-1.16436 1.46103,-2.51257 2.17157,-4.025 0.71053,-1.51243 1.40785,-3.18454 2.08107,-5.025 0.67324,-1.84046 1.32849,-3.85152 1.96045,-6 0.63194,-2.14848 1.23803,-4.43854 1.82472,-6.875 0.58666,-2.43646 1.15157,-5.02058 1.68898,-7.725 0.53741,-2.70442 1.05401,-5.52266 1.53819,-8.475 0.48418,-2.95234 0.94535,-6.01975 1.37231,-9.2 0.42695,-3.18025 0.8105,-6.48688 1.17626,-9.875 0.36575,-3.38812 0.70981,-6.87404 1.01037,-10.45 0.30056,-3.57596 0.56786,-7.23121 0.79926,-10.975 0.12328,-1.99465 0.2139,-4.06206 0.31669,-6.1 0.46608,-0.8273 0.949,-1.64553 1.38738,-2.525 0.56886,1.19674 1.15093,2.34945 1.76439,3.425 0.61349,1.07553 1.26063,2.0788 1.91521,3.025 0.65457,0.94624 1.32861,1.81621 2.02075,2.625 0.69212,0.8088 1.40016,1.56175 2.12633,2.225 0.72615,0.66324 1.46011,1.2654 2.21678,1.775 0.5099,0.34342 1.03208,0.59077 1.55328,0.85 -0.14314,1.71896 -0.28033,3.43479 -0.46749,5.175 -0.29288,2.72318 -0.63727,5.45497 -1.04053,8.2 -0.40327,2.74503 -0.85553,5.49492 -1.37231,8.225 -0.51679,2.73008 -1.10079,5.4467 -1.73424,8.125 -0.63343,2.6783 -1.32785,5.33528 -2.08108,7.925 -0.75322,2.58972 -1.56685,5.11069 -2.443,7.575 -0.87615,2.46431 -1.80273,4.87291 -2.80493,7.175 -1.00221,2.30209 -2.08072,4.49694 -3.21211,6.6 -1.13139,2.10306 -2.3254,4.1078 -3.58911,5.975 -1.26371,1.8672 -2.5971,3.60547 -3.99627,5.2 -1.39917,1.59453 -2.86569,3.03996 -4.40344,4.325 -1.53776,1.28504 -3.14621,2.41127 -4.82569,3.35 -0.58395,0.46309 -1.1318,0.6647 -1.65883,0.7 0.0206,5.1e-4 0.0403,-0.004 0.0602,0 -0.57109,0.0241 -1.1293,0.15 -1.70408,0.15 z"
+           id="path655" /><path
+           inkscape:connector-curvature="0"
+           style="fill:#0028dd;fill-opacity:1;stroke:#000000;stroke-width:1.64575696;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+           d="m 536.03104,215.65178 c -34.33257,-0.89851 -61.99504,-44.97614 -61.99504,-99.3 0,-2.30764 0.128,-4.58164 0.22619,-6.85 0.22909,0.88504 0.44581,1.79565 0.69371,2.65 0.46113,1.58929 0.95489,3.12462 1.47786,4.6 0.52297,1.4754 1.06327,2.89853 1.64375,4.25 0.5805,1.35148 1.19102,2.65744 1.82472,3.875 0.63369,1.21753 1.2929,2.35138 1.97552,3.425 0.68261,1.07364 1.39907,2.08032 2.12632,3 0.72723,0.91972 1.46432,1.74424 2.23188,2.5 0.76755,0.75577 1.54894,1.44317 2.35253,2.025 0.80356,0.58184 1.63787,1.0771 2.47316,1.475 0.8353,0.39789 1.67076,0.69606 2.53349,0.9 0.86272,0.20394 1.73812,0.3 2.62397,0.3 0.82703,0 1.65098,-0.097 2.45808,-0.275 0.80712,-0.17798 1.61411,-0.45215 2.39777,-0.8 0.78365,-0.34785 1.53553,-0.74037 2.29221,-1.25 0.75666,-0.5096 1.5057,-1.11176 2.23187,-1.775 0.72617,-0.66326 1.43418,-1.4162 2.12632,-2.225 0.69214,-0.80879 1.3662,-1.67876 2.02076,-2.625 0.65457,-0.9462 1.30171,-1.94947 1.9152,-3.025 0.55549,-0.97388 1.0801,-2.02676 1.59851,-3.1 0.12953,2.79275 0.25457,5.58636 0.42225,8.3 0.23132,3.74379 0.49879,7.39904 0.79925,10.975 0.30048,3.57596 0.62964,7.06188 0.9953,10.45 0.36564,3.38812 0.76451,6.69475 1.19134,9.875 0.42685,3.18025 0.88826,6.24766 1.3723,9.2 0.48406,2.95234 0.98583,5.77058 1.52312,8.475 0.53728,2.70442 1.10245,5.28854 1.68899,7.725 0.58654,2.43646 1.20797,4.72652 1.8398,6.875 0.63182,2.14848 1.27222,4.15954 1.94535,6 0.67312,1.84046 1.37063,3.51257 2.08108,5.025 0.71043,1.51243 1.44286,2.86064 2.18664,4.025 0.74378,1.16436 1.50397,2.15373 2.27712,2.95 0.77314,0.79627 1.554,1.39185 2.35253,1.8 0.68973,0.35254 1.39026,0.50095 2.09615,0.55 z"
+           id="path657" /><path
+           inkscape:connector-curvature="0"
+           style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1.64575696;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+           d="m 527.52578,139.62678 c 0.14364,3.79404 0.28731,7.52318 0.45239,11.1 0.18109,3.92328 0.38277,7.70788 0.58814,11.35 0.20535,3.64213 0.4205,7.11372 0.64844,10.45 0.22795,3.33627 0.45994,6.51929 0.70878,9.525 0.24884,3.00571 0.51614,5.84955 0.78418,8.5 0.26804,2.65045 0.54385,5.12953 0.82941,7.4 0.28556,2.27046 0.57327,4.33421 0.87466,6.2 0.30139,1.8658 0.61944,3.5136 0.93497,4.95 0.31554,1.4364 0.63714,2.66769 0.96514,3.65 0.32799,0.98231 0.65654,1.72149 0.9953,2.225 0.29261,0.4349 0.59027,0.6145 0.88974,0.675 -0.0551,-0.003 -0.11012,0.001 -0.16589,0 -0.70589,-0.0491 -1.40642,-0.19746 -2.09615,-0.55 -0.79853,-0.40815 -1.57939,-1.00373 -2.35253,-1.8 -0.77315,-0.79627 -1.53334,-1.78564 -2.27712,-2.95 -0.74378,-1.16436 -1.47621,-2.51257 -2.18664,-4.025 -0.71045,-1.51243 -1.40796,-3.18454 -2.08108,-5.025 -0.67313,-1.84046 -1.31353,-3.85152 -1.94535,-6 -0.63183,-2.14848 -1.25326,-4.43854 -1.8398,-6.875 -0.58654,-2.43646 -1.15171,-5.02058 -1.68899,-7.725 -0.53729,-2.70442 -1.03906,-5.52266 -1.52312,-8.475 -0.48404,-2.95234 -0.94545,-6.01975 -1.3723,-9.2 -0.42683,-3.18025 -0.8257,-6.48688 -1.19134,-9.875 -0.36566,-3.38812 -0.69482,-6.87404 -0.9953,-10.45 -0.30046,-3.57596 -0.56793,-7.23121 -0.79925,-10.975 -0.16768,-2.71364 -0.29272,-5.50725 -0.42225,-8.3 0.0541,-0.11203 0.11211,-0.21188 0.16588,-0.325 0.73583,1.4762 1.51044,2.89224 2.32236,4.225 0.81192,1.3328 1.66682,2.59737 2.54857,3.775 0.88176,1.17764 1.79927,2.26427 2.74461,3.275 0.94533,1.01073 1.92292,1.94293 2.92558,2.775 1.00266,0.83207 2.02261,1.58333 3.07637,2.225 0.15796,0.0962 0.32366,0.15823 0.48259,0.25 z"
+           id="path659" /><path
+           inkscape:connector-curvature="0"
+           style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1.64575696;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+           d="m 536.42314,215.67678 c 0.317,-0.0396 0.64068,-0.24019 0.95005,-0.7 0.33878,-0.50351 0.66727,-1.24269 0.9953,-2.225 0.32804,-0.98231 0.64957,-2.2136 0.96515,-3.65 0.31554,-1.4364 0.61845,-3.0842 0.91989,-4.95 0.30143,-1.86579 0.60413,-3.92954 0.88973,-6.2 0.2856,-2.27047 0.56132,-4.74955 0.82942,-7.4 0.26809,-2.65045 0.52021,-5.49429 0.76909,-8.5 0.24888,-3.00571 0.49586,-6.18873 0.72386,-9.525 0.22798,-3.33628 0.44305,-6.80787 0.64845,-10.45 0.2054,-3.64212 0.40699,-7.42672 0.58813,-11.35 0.1536,-3.32714 0.2885,-6.80738 0.42225,-10.325 0.67745,-0.32362 1.36051,-0.62294 2.02076,-1.025 1.05374,-0.64167 2.0737,-1.39293 3.07638,-2.225 1.00266,-0.83207 1.98024,-1.76427 2.92556,-2.775 0.94534,-1.01074 1.86287,-2.09736 2.74462,-3.275 0.88175,-1.17763 1.72157,-2.4422 2.53349,-3.775 0.32821,-0.53875 0.63381,-1.13866 0.95006,-1.7 -0.1028,2.03794 -0.19341,4.10535 -0.31669,6.1 -0.2314,3.74379 -0.4987,7.39904 -0.79926,10.975 -0.30056,3.57596 -0.64462,7.06188 -1.01037,10.45 -0.36576,3.38812 -0.74931,6.69475 -1.17626,9.875 -0.42696,3.18025 -0.88813,6.24766 -1.37231,9.2 -0.48418,2.95234 -1.00078,5.77058 -1.53819,8.475 -0.53741,2.70442 -1.10232,5.28854 -1.68898,7.725 -0.58669,2.43646 -1.19278,4.72652 -1.82472,6.875 -0.63196,2.14848 -1.28721,4.15954 -1.96045,6 -0.67322,1.84046 -1.37054,3.51257 -2.08107,5.025 -0.71054,1.51243 -1.42771,2.86064 -2.17157,4.025 -0.74386,1.16436 -1.50391,2.15373 -2.27711,2.95 -0.77322,0.79627 -1.56905,1.39185 -2.36761,1.8 -0.73895,0.37768 -1.4896,0.54616 -2.24696,0.575 -0.0406,-5.5e-4 -0.0804,0.002 -0.12064,0 z"
+           id="path661" /><path
+           inkscape:connector-curvature="0"
+           style="fill:#d30000;fill-opacity:1;stroke:#000000;stroke-width:1.64575696;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+           d="m 536.31758,215.67678 c -0.0402,-0.002 -0.0804,-0.0226 -0.12065,-0.025 -0.29947,-0.0605 -0.59713,-0.2401 -0.88974,-0.675 -0.33876,-0.50351 -0.66731,-1.24269 -0.9953,-2.225 -0.328,-0.98231 -0.6496,-2.2136 -0.96514,-3.65 -0.31553,-1.4364 -0.63358,-3.0842 -0.93497,-4.95 -0.30139,-1.86579 -0.5891,-3.92954 -0.87466,-6.2 -0.28556,-2.27047 -0.56137,-4.74955 -0.82941,-7.4 -0.26804,-2.65045 -0.53534,-5.49429 -0.78418,-8.5 -0.24884,-3.00571 -0.48083,-6.18873 -0.70878,-9.525 -0.22794,-3.33628 -0.44309,-6.80787 -0.64844,-10.45 -0.20537,-3.64212 -0.40705,-7.42672 -0.58814,-11.35 -0.16508,-3.57682 -0.30875,-7.30596 -0.45239,-11.1 0.90122,0.52042 1.81069,1.00134 2.74459,1.375 1.09859,0.43954 2.22574,0.74936 3.36292,0.975 1.13714,0.22565 2.2839,0.35 3.45338,0.35 1.16948,0 2.3313,-0.12435 3.46846,-0.35 1.13715,-0.22564 2.26432,-0.53546 3.36291,-0.975 0.41024,-0.16414 0.80264,-0.40711 1.20642,-0.6 -0.13375,3.51762 -0.26865,6.99786 -0.42225,10.325 -0.18114,3.92328 -0.38273,7.70788 -0.58813,11.35 -0.2054,3.64213 -0.42047,7.11372 -0.64845,10.45 -0.228,3.33627 -0.47498,6.51929 -0.72386,9.525 -0.24888,3.00571 -0.501,5.84955 -0.76909,8.5 -0.2681,2.65045 -0.54382,5.12953 -0.82942,7.4 -0.2856,2.27046 -0.5883,4.33421 -0.88973,6.2 -0.30144,1.8658 -0.60435,3.5136 -0.91989,4.95 -0.31558,1.4364 -0.63711,2.66769 -0.96515,3.65 -0.32803,0.98231 -0.65652,1.72149 -0.9953,2.225 -0.30937,0.45981 -0.63305,0.66041 -0.95005,0.7 -0.0352,-0.002 -0.0705,0.002 -0.10558,0 z"
+           id="path663" /><path
+           style="fill:none;stroke:#000000;stroke-width:2.2192173;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+           d="M 474.26219,109.50178 519.63335,-43.074211"
+           id="path665"
+           inkscape:path-effect="#path-effect631"
+           inkscape:original-d="M 474.26219,109.50178 519.63335,-43.074211"
+           inkscape:connector-curvature="0"
+           sodipodi:nodetypes="cc" /><path
+           style="fill:none;stroke:#000000;stroke-width:2.2192173;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+           d="M 513.4257,123.10178 526.89369,-39.040691"
+           id="path667"
+           inkscape:path-effect="#path-effect633"
+           inkscape:original-d="M 513.4257,123.10178 526.89369,-39.040691"
+           inkscape:connector-curvature="0"
+           sodipodi:nodetypes="cc" /><path
+           inkscape:connector-curvature="0"
+           inkscape:original-d="M 599.94123,109.47678 554.32164,-43.074211"
+           inkscape:path-effect="#path-effect635"
+           id="path669"
+           d="M 599.94123,109.47678 554.32164,-43.074211"
+           style="fill:none;stroke:#000000;stroke-width:2.2192173;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+           sodipodi:nodetypes="cc" /><path
+           inkscape:connector-curvature="0"
+           inkscape:original-d="M 560.76271,123.10178 547.0613,-39.040691"
+           inkscape:path-effect="#path-effect637"
+           id="path671"
+           d="M 560.76271,123.10178 547.0613,-39.040691"
+           style="fill:none;stroke:#000000;stroke-width:2.2192173;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+           sodipodi:nodetypes="cc" /><path
+           style="opacity:0.4;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.77666688"
+           d="m 536.31829,214.3096 c -8.9606,2.50969 -41.60616,-10.17702 -55.96489,-56.89483 20.55167,51.12867 102.82104,25.38397 102.82104,25.38397 -3.40977,3.60894 -16.81565,31.91148 -46.85615,31.51086 z"
+           id="path673"
+           inkscape:connector-curvature="0"
+           sodipodi:nodetypes="cccc" /></g></g><g
+       id="0parachute1"
+       inkscape:label="#g1619"
+       transform="translate(-551.34107)"><g
+         style="opacity:0"
+         inkscape:export-ydpi="179.97391"
+         inkscape:export-xdpi="179.97391"
+         inkscape:export-filename="/home/xymus/projects/nit/contrib/action_nitro/assets/textures/parachute.png"
+         transform="matrix(0.72097491,0,0,0.72097491,248.82283,-199.77977)"
+         inkscape:label="#g4396"
+         id="g687"><path
+           transform="matrix(1.1096087,0,0,-1.1096087,-417.09708,329.14203)"
+           id="path677"
+           d="m 859.92383,96.863281 c -0.27426,0 -0.53686,0.04462 -0.81055,0.04687 -0.0607,4.96e-4 -0.12163,-0.0018 -0.18164,0 -0.0525,0.0018 -0.10398,-0.0018 -0.15625,0 -0.06,0.0018 -0.1216,0.01932 -0.18164,0.02148 -0.0823,0.0027 -0.16477,-9.02e-4 -0.24805,0 -51.29406,0.809754 -92.62109,40.532559 -92.62109,89.490239 0,2.07968 0.19117,4.12953 0.33789,6.17382 0.34226,-0.79761 0.66478,-1.61871 1.03516,-2.38867 0.68897,-1.4323 1.42765,-2.81489 2.20898,-4.14453 0.78133,-1.32966 1.58782,-2.61211 2.45508,-3.83008 0.86727,-1.21798 1.77979,-2.3949 2.72656,-3.49219 0.94677,-1.09726 1.93133,-2.12032 2.95117,-3.08789 1.01985,-0.96758 2.09122,-1.87429 3.17774,-2.70312 1.08652,-0.82887 2.18723,-1.57085 3.33398,-2.25195 1.14676,-0.68112 2.31311,-1.30182 3.51367,-1.82618 1.20058,-0.52436 2.44736,-0.96953 3.69532,-1.32812 1.24796,-0.35859 2.49622,-0.62871 3.78515,-0.8125 1.28895,-0.1838 2.59644,-0.26953 3.91992,-0.26953 1.23562,0 2.468,0.0876 3.67383,0.24804 1.20585,0.1604 2.41122,0.40722 3.58203,0.72071 1.1708,0.31349 2.29333,0.66766 3.42383,1.12695 1.1305,0.45926 2.25103,1.00189 3.33594,1.59961 1.08491,0.59774 2.1417,1.275 3.17578,2.00391 1.03407,0.72889 2.04158,1.51441 3.01953,2.36718 0.97796,0.85274 1.94476,1.75533 2.86133,2.72461 0.82993,0.87768 1.61416,1.8277 2.38867,2.79493 0.0808,0.10096 0.16771,0.19102 0.24805,0.29296 1.09936,-1.33038 2.25571,-2.60748 3.46875,-3.80859 1.21303,-1.20114 2.49123,-2.34104 3.80859,-3.40234 1.31737,-1.06131 2.68725,-2.04029 4.09961,-2.95118 1.41236,-0.91088 2.87307,-1.75012 4.3711,-2.5 1.498,-0.74987 3.02135,-1.42757 4.5957,-2.00585 0.23598,-0.0867 0.48328,-0.14191 0.7207,-0.22461 1.34646,-0.46902 2.70628,-0.90349 4.10156,-1.24024 1.64132,-0.39612 3.32447,-0.67555 5.02344,-0.87891 1.69894,-0.20335 3.41291,-0.31445 5.16016,-0.31445 1.74724,0 3.48269,0.1111 5.18164,0.31445 1.69894,0.20336 3.38406,0.48279 5.02539,0.87891 0.61294,0.14793 1.19752,0.36718 1.80078,0.54102 1.01213,0.29165 2.03311,0.56148 3.01953,0.92383 1.57433,0.57828 3.09768,1.25598 4.59571,2.00585 1.49802,0.74988 2.95873,1.58912 4.37109,2.5 1.41237,0.9109 2.78419,1.88987 4.10156,2.95118 1.31737,1.0613 2.57213,2.2012 3.78516,3.40234 0.49034,0.48553 0.94744,1.02731 1.41992,1.5332 0.69634,0.74558 1.4173,1.4828 2.07227,2.27539 0.84988,-1.07852 1.7182,-2.11858 2.63476,-3.08789 0.91657,-0.96928 1.88532,-1.87187 2.86328,-2.72461 0.97796,-0.85277 1.9835,-1.63829 3.01758,-2.36718 1.03406,-0.72891 2.09281,-1.40618 3.17773,-2.00391 1.08492,-0.59772 2.182,-1.14035 3.3125,-1.59961 0.76179,-0.3095 1.54163,-0.532 2.32032,-0.76562 0.37687,-0.11307 0.74314,-0.25909 1.125,-0.36133 1.1708,-0.31349 2.37815,-0.56031 3.58398,-0.72071 1.20585,-0.16039 2.41281,-0.24804 3.64844,-0.24804 1.32348,0 2.65443,0.0858 3.94336,0.26953 1.28893,0.18379 2.53718,0.45391 3.78515,0.8125 1.24795,0.35859 2.49474,0.80376 3.69532,1.32812 1.18528,0.51769 2.33606,1.13183 3.46875,1.80274 0.0146,0.009 0.0323,0.0148 0.0469,0.0234 1.14675,0.6811 2.24747,1.42308 3.33399,2.25195 1.08651,0.82883 2.15592,1.73554 3.17578,2.70312 1.01984,0.96757 2.00441,1.99063 2.95117,3.08789 0.94677,1.09729 1.8593,2.27421 2.72656,3.49219 0.86726,1.21797 1.6757,2.50042 2.45703,3.83008 0.78134,1.32963 1.51806,2.71223 2.20703,4.14453 0.37613,0.78192 0.71148,1.60169 1.0586,2.41211 0.14845,-2.05629 0.3164,-4.10514 0.3164,-6.19726 0,-48.31578 -40.28186,-87.574404 -90.64062,-89.376958 -0.34622,-0.01235 -0.68995,-0.03609 -1.03711,-0.04492 -0.85323,-0.02172 -1.6862,-0.136719 -2.54492,-0.136719 z"
+           style="fill:#d30000;fill-opacity:1;stroke:#000000;stroke-width:1.90968227;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+           inkscape:connector-curvature="0" /><path
+           style="fill:none;stroke:#000000;stroke-width:3.20000005;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+           d="m 433.31594,115.44326 86.3174,-158.517471"
+           id="path679"
+           inkscape:path-effect="#path-effect4264-1"
+           inkscape:original-d="m 433.31594,115.44326 86.3174,-158.517471"
+           inkscape:connector-curvature="0" /><path
+           style="fill:none;stroke:#000000;stroke-width:3.20000005;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+           d="M 498.25567,128.75389 526.89368,-39.040691"
+           id="path681"
+           inkscape:path-effect="#path-effect4268-0"
+           inkscape:original-d="M 498.25567,128.75389 526.89368,-39.040691"
+           inkscape:connector-curvature="0" /><path
+           inkscape:connector-curvature="0"
+           inkscape:original-d="M 640.63904,115.44326 554.32164,-43.074211"
+           inkscape:path-effect="#path-effect4274-7"
+           id="path683"
+           d="M 640.63904,115.44326 554.32164,-43.074211"
+           style="fill:none;stroke:#000000;stroke-width:3.20000005;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /><path
+           inkscape:connector-curvature="0"
+           inkscape:original-d="M 575.69932,128.75389 547.0613,-39.040691"
+           inkscape:path-effect="#path-effect4276-0"
+           id="path685"
+           d="M 575.69932,128.75389 547.0613,-39.040691"
+           style="fill:none;stroke:#000000;stroke-width:3.20000005;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /></g><g
+         id="g713"
+         inkscape:label="#g4396"
+         transform="matrix(0.72097491,0,0,0.72097491,248.82283,-199.77977)"
+         inkscape:export-filename="/home/xymus/projects/nit/contrib/action_nitro/assets/textures/parachute.png"
+         inkscape:export-xdpi="179.97391"
+         inkscape:export-ydpi="179.97391"><path
+           id="path689"
+           d="m 538.86274,191.55622 c 1.28121,-0.28075 2.54299,-0.64551 3.77142,-1.14685 1.32307,-0.53997 2.61257,-1.21905 3.87183,-1.99776 1.25926,-0.7787 2.4894,-1.66404 3.68214,-2.66367 1.19275,-0.99963 2.35778,-2.10831 3.48132,-3.31109 1.12353,-1.20277 2.20651,-2.4964 3.25814,-3.88451 1.05163,-1.38812 2.06912,-2.86529 3.04615,-4.42095 0.97701,-1.55567 1.9121,-3.19648 2.81181,-4.9019 0.89972,-1.70541 1.75779,-3.47145 2.5775,-5.30884 0.81972,-1.83738 1.60617,-3.74575 2.34319,-5.69729 0.73701,-1.95155 1.42377,-3.96384 2.07539,-6.01175 0.65163,-2.04792 1.26639,-4.12574 1.82992,-6.25223 0.56353,-2.12649 1.07823,-4.28692 1.55096,-6.4742 0.47275,-2.18727 0.90393,-4.41042 1.28318,-6.64067 0.0979,-0.57597 0.16505,-1.1607 0.25663,-1.73879 0.007,-0.007 0.0151,-0.0114 0.0223,-0.0185 0.56793,-0.5592 1.11331,-1.16927 1.65139,-1.84977 0.53808,-0.68048 1.06821,-1.42533 1.57328,-2.21973 0.50508,-0.79438 0.99283,-1.63332 1.4617,-2.53418 0.46888,-0.90089 0.92061,-1.86718 1.35013,-2.86715 0.4295,-0.99996 0.82927,-2.05295 1.21622,-3.14461 0.38695,-1.09164 0.75229,-2.22765 1.09348,-3.40358 0.18629,-0.64196 0.35253,-1.31389 0.52444,-1.97925 0.0735,1.68823 0.15621,3.36922 0.15621,5.08687 0,39.66766 -19.94897,71.90048 -44.88874,73.38039 z"
+           style="fill:#d30000;fill-opacity:1;stroke:#000000;stroke-width:1.21770906;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+           inkscape:connector-curvature="0" /><path
+           id="path691"
+           d="m 538.34948,191.59322 c -0.0149,-0.003 -0.0293,3.8e-4 -0.0445,0 0.38997,-0.0261 0.79532,-0.17529 1.22739,-0.51794 1.24265,-0.69457 2.43277,-1.52788 3.57057,-2.47869 1.1378,-0.95081 2.22289,-2.0203 3.25814,-3.2001 1.03525,-1.17981 2.02184,-2.46597 2.95688,-3.84752 0.93503,-1.38156 1.81848,-2.86489 2.65561,-4.42096 0.83712,-1.55607 1.63512,-3.18006 2.37666,-4.88339 0.74153,-1.70334 1.42712,-3.48548 2.07539,-5.30884 0.64828,-1.82336 1.25028,-3.68865 1.8076,-5.60481 0.55731,-1.91615 1.07112,-3.88207 1.5398,-5.86377 0.4687,-1.98169 0.9008,-3.99174 1.28319,-6.01175 0.38235,-2.02001 0.71699,-4.05468 1.01537,-6.08575 0.29839,-2.03107 0.5532,-4.05234 0.76991,-6.06724 0.13848,-1.2876 0.23999,-2.55716 0.3459,-3.82903 0.18664,0.0928 0.36878,0.21202 0.5579,0.29596 0.57982,0.25738 1.17694,0.46024 1.77412,0.59193 0.59719,0.13169 1.19567,0.20347 1.80759,0.20347 0.65546,0 1.31433,-0.0711 1.95267,-0.22197 0.63832,-0.15089 1.25649,-0.37151 1.87455,-0.66592 0.61803,-0.2944 1.23534,-0.66085 1.8299,-1.09136 0.58701,-0.42503 1.15739,-0.929 1.71835,-1.47982 -0.0916,0.57809 -0.1587,1.16282 -0.25664,1.73879 -0.37925,2.23025 -0.81043,4.4534 -1.28317,6.64067 -0.47274,2.18728 -0.98743,4.34771 -1.55096,6.4742 -0.56354,2.12649 -1.1783,4.20431 -1.82993,6.25223 -0.65163,2.04791 -1.33837,4.0602 -2.07539,6.01175 -0.73702,1.95154 -1.52347,3.85991 -2.34318,5.69729 -0.81972,1.83739 -1.67779,3.60343 -2.57749,5.30884 -0.89974,1.70542 -1.83482,3.34623 -2.81183,4.9019 -0.97703,1.55566 -1.99452,3.03283 -3.04616,4.42095 -1.05162,1.38811 -2.1346,2.68174 -3.25813,3.88451 -1.12355,1.20278 -2.28856,2.31146 -3.48131,3.31109 -1.19275,0.99963 -2.42289,1.88497 -3.68215,2.66367 -1.25926,0.77871 -2.54876,1.45779 -3.87184,1.99776 -1.22842,0.50134 -2.4902,0.8661 -3.77141,1.14685 -0.17146,0.0101 -0.34133,0.0298 -0.51327,0.037 z"
+           style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1.21770906;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+           inkscape:connector-curvature="0" /><path
+           id="path693"
+           d="m 537.08862,191.70421 c -0.13582,0 -0.26615,-0.0352 -0.40169,-0.037 0.56038,-0.0213 1.11579,-0.146 1.66255,-0.42545 0.59086,-0.30199 1.1797,-0.74267 1.75181,-1.33183 0.5721,-0.58917 1.13447,-1.32121 1.68485,-2.18273 0.55039,-0.86152 1.08103,-1.85907 1.60677,-2.97813 0.52572,-1.11906 1.04168,-2.35627 1.5398,-3.71804 0.49813,-1.36177 0.98296,-2.84977 1.45055,-4.43945 0.46758,-1.58968 0.91603,-3.28411 1.35013,-5.08687 0.43407,-1.80276 0.85205,-3.71477 1.24969,-5.71579 0.39763,-2.00102 0.77987,-4.08626 1.13811,-6.27072 0.35825,-2.18446 0.69948,-4.45406 1.01539,-6.80716 0.3159,-2.35309 0.59969,-4.79969 0.87032,-7.30659 0.27062,-2.5069 0.5252,-5.08616 0.74758,-7.73204 0.22239,-2.64588 0.42017,-5.35043 0.59138,-8.12049 0.0912,-1.47586 0.15827,-3.00555 0.23432,-4.51344 0.34486,-0.61213 0.70218,-1.21754 1.02654,-1.86827 0.4209,0.88548 0.85158,1.73838 1.30548,2.53418 0.45393,0.7958 0.93276,1.53813 1.41708,2.23823 0.48433,0.70013 0.98305,1.34383 1.49517,1.94226 0.51211,0.59843 1.03599,1.15555 1.57329,1.64629 0.53729,0.49074 1.08035,0.93628 1.64022,1.31334 0.37728,0.2541 0.76364,0.43711 1.14928,0.62892 -0.10591,1.27187 -0.20742,2.54143 -0.3459,3.82903 -0.2167,2.0149 -0.47152,4.03617 -0.7699,6.06724 -0.29838,2.03107 -0.63301,4.06574 -1.01538,6.08575 -0.38238,2.02001 -0.81448,4.03006 -1.28318,6.01175 -0.46868,1.9817 -0.98248,3.94762 -1.53981,5.86377 -0.55731,1.91616 -1.15932,3.78145 -1.80759,5.60481 -0.64827,1.82336 -1.33386,3.6055 -2.07539,5.30884 -0.74155,1.70333 -1.53954,3.32732 -2.37667,4.88339 -0.83712,1.55607 -1.72058,3.0394 -2.65561,4.42096 -0.93503,1.38155 -1.92162,2.66771 -2.95687,3.84752 -1.03526,1.1798 -2.12035,2.24929 -3.25814,3.2001 -1.13781,0.95081 -2.32791,1.78412 -3.57057,2.47869 -0.43207,0.34265 -0.83743,0.49182 -1.22738,0.51794 0.0152,3.8e-4 0.0298,-0.003 0.0445,0 -0.42256,0.0178 -0.83558,0.11099 -1.26086,0.11099 z"
+           style="fill:#d30000;fill-opacity:1;stroke:#000000;stroke-width:1.21770906;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+           inkscape:connector-curvature="0" /><path
+           id="path695"
+           d="m 536.30755,191.64871 c -25.40295,-0.66481 -45.87064,-33.27821 -45.87064,-73.47288 0,-1.70744 0.0947,-3.38999 0.16736,-5.06837 0.16951,0.65485 0.32986,1.32861 0.51329,1.96075 0.34119,1.17593 0.70653,2.31194 1.09348,3.40358 0.38695,1.09166 0.78672,2.14465 1.21622,3.14461 0.42952,0.99997 0.88125,1.96626 1.35013,2.86715 0.46887,0.90086 0.95662,1.7398 1.4617,2.53418 0.50507,0.7944 1.03518,1.53925 1.57328,2.21973 0.53808,0.6805 1.08346,1.29057 1.65139,1.84977 0.56791,0.5592 1.14607,1.06781 1.74065,1.49831 0.59456,0.43051 1.21188,0.79696 1.82992,1.09136 0.61804,0.29441 1.2362,0.51503 1.87455,0.66592 0.63833,0.1509 1.28604,0.22197 1.94149,0.22197 0.61193,0 1.22158,-0.0718 1.81876,-0.20347 0.59719,-0.13169 1.19429,-0.33455 1.77413,-0.59193 0.57982,-0.25737 1.13615,-0.5478 1.69602,-0.92488 0.55986,-0.37706 1.11408,-0.8226 1.65138,-1.31334 0.5373,-0.49075 1.06116,-1.04786 1.57328,-1.64629 0.51212,-0.59843 1.01086,-1.24213 1.49518,-1.94226 0.48432,-0.7001 0.96314,-1.44243 1.41707,-2.23823 0.41101,-0.72058 0.79917,-1.49961 1.18275,-2.29371 0.0958,2.06638 0.18836,4.13339 0.31243,6.14124 0.17115,2.77006 0.36906,5.47461 0.59137,8.12049 0.22233,2.64588 0.46587,5.22514 0.73643,7.73204 0.27054,2.5069 0.56567,4.9535 0.88148,7.30659 0.31583,2.3531 0.65723,4.6227 1.01538,6.80716 0.35816,2.18446 0.72942,4.2697 1.12697,6.27072 0.39753,2.00102 0.81571,3.91303 1.24969,5.71579 0.43399,1.80276 0.89379,3.49719 1.36129,5.08687 0.46749,1.58968 0.94132,3.07768 1.43938,4.43945 0.49804,1.36177 1.01414,2.59898 1.53981,3.71804 0.52565,1.11906 1.06758,2.11661 1.61791,2.97813 0.55033,0.86152 1.1128,1.59356 1.68486,2.18273 0.57205,0.58916 1.14982,1.02984 1.74065,1.33183 0.51034,0.26085 1.02867,0.37066 1.55096,0.40695 z"
+           style="fill:#0028dd;fill-opacity:1;stroke:#000000;stroke-width:1.21770906;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+           inkscape:connector-curvature="0" /><path
+           id="path697"
+           d="m 530.01444,135.39719 c 0.10628,2.80724 0.21258,5.56646 0.33473,8.21298 0.13399,2.90287 0.28321,5.70313 0.43517,8.39796 0.15194,2.69484 0.31113,5.2635 0.47978,7.73204 0.16867,2.46853 0.34032,4.82368 0.52444,7.04763 0.18411,2.22395 0.38189,4.32813 0.58022,6.28922 0.19832,1.96109 0.4024,3.79538 0.61368,5.47532 0.21129,1.67993 0.42417,3.20691 0.64717,4.58743 0.223,1.38052 0.45833,2.59974 0.69179,3.66254 0.23348,1.06281 0.47143,1.97385 0.71412,2.70067 0.24268,0.72682 0.48578,1.27374 0.73643,1.64629 0.2165,0.32179 0.43675,0.45468 0.65833,0.49944 -0.0408,-0.002 -0.0815,7.4e-4 -0.12275,0 -0.52229,-0.0363 -1.04062,-0.1461 -1.55096,-0.40695 -0.59083,-0.30199 -1.1686,-0.74267 -1.74065,-1.33183 -0.57206,-0.58917 -1.13453,-1.32121 -1.68486,-2.18273 -0.55033,-0.86152 -1.09226,-1.85907 -1.61791,-2.97813 -0.52567,-1.11906 -1.04177,-2.35627 -1.53981,-3.71804 -0.49806,-1.36177 -0.97189,-2.84977 -1.43938,-4.43945 -0.4675,-1.58968 -0.9273,-3.28411 -1.36129,-5.08687 -0.43398,-1.80276 -0.85216,-3.71477 -1.24969,-5.71579 -0.39755,-2.00102 -0.76881,-4.08626 -1.12697,-6.27072 -0.35815,-2.18446 -0.69955,-4.45406 -1.01538,-6.80716 -0.31581,-2.35309 -0.61094,-4.79969 -0.88148,-7.30659 -0.27056,-2.5069 -0.5141,-5.08616 -0.73643,-7.73204 -0.22231,-2.64588 -0.42022,-5.35043 -0.59137,-8.12049 -0.12407,-2.00785 -0.21659,-4.07486 -0.31243,-6.14124 0.04,-0.0829 0.0829,-0.15677 0.12274,-0.24047 0.54444,1.09225 1.11758,2.13999 1.71833,3.12611 0.60075,0.98615 1.23329,1.92182 1.88571,2.79315 0.65242,0.87135 1.33129,1.67536 2.03076,2.4232 0.69945,0.74785 1.42278,1.43759 2.16466,2.05325 0.74187,0.61565 1.49654,1.17152 2.27623,1.64629 0.11687,0.0712 0.23948,0.11708 0.35707,0.18498 z"
+           style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1.21770906;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+           inkscape:connector-curvature="0" /><path
+           id="path699"
+           d="m 536.59767,191.66721 c 0.23455,-0.0293 0.47405,-0.17772 0.70295,-0.51794 0.25067,-0.37255 0.49372,-0.91947 0.73643,-1.64629 0.24272,-0.72682 0.48062,-1.63786 0.71412,-2.70067 0.23347,-1.0628 0.4576,-2.28202 0.68064,-3.66254 0.22303,-1.38052 0.447,-2.9075 0.65832,-4.58743 0.21131,-1.67994 0.41532,-3.51423 0.61369,-5.47532 0.19836,-1.96109 0.38491,-4.06527 0.56906,-6.28922 0.18415,-2.22395 0.36689,-4.5791 0.53559,-7.04763 0.16868,-2.46854 0.32781,-5.0372 0.47979,-7.73204 0.15198,-2.69483 0.30114,-5.49509 0.43516,-8.39796 0.11365,-2.46178 0.21347,-5.03683 0.31243,-7.63955 0.50125,-0.23945 1.00665,-0.46092 1.49518,-0.75841 0.77967,-0.47477 1.53434,-1.03064 2.27623,-1.64629 0.74188,-0.61566 1.4652,-1.3054 2.16465,-2.05325 0.69946,-0.74785 1.37835,-1.55185 2.03077,-2.4232 0.65241,-0.87133 1.2738,-1.807 1.87455,-2.79315 0.24284,-0.39862 0.46896,-0.8425 0.70295,-1.25784 -0.0761,1.50789 -0.1431,3.03758 -0.23432,4.51344 -0.17121,2.77006 -0.36899,5.47461 -0.59138,8.12049 -0.22238,2.64588 -0.47696,5.22514 -0.74758,7.73204 -0.27063,2.5069 -0.55442,4.9535 -0.87032,7.30659 -0.31591,2.3531 -0.65714,4.6227 -1.01539,6.80716 -0.35824,2.18446 -0.74048,4.2697 -1.13811,6.27072 -0.39764,2.00102 -0.81562,3.91303 -1.24969,5.71579 -0.4341,1.80276 -0.88255,3.49719 -1.35013,5.08687 -0.46759,1.58968 -0.95242,3.07768 -1.45055,4.43945 -0.49812,1.36177 -1.01408,2.59898 -1.5398,3.71804 -0.52574,1.11906 -1.05638,2.11661 -1.60677,2.97813 -0.55038,0.86152 -1.11275,1.59356 -1.68485,2.18273 -0.57211,0.58916 -1.16095,1.02984 -1.75181,1.33183 -0.54676,0.27945 -1.10217,0.40411 -1.66255,0.42545 -0.03,-4.1e-4 -0.0595,10e-4 -0.0893,0 z"
+           style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1.21770906;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+           inkscape:connector-curvature="0" /><path
+           id="path701"
+           d="m 536.51957,191.66721 c -0.0298,-0.001 -0.0595,-0.0167 -0.0893,-0.0185 -0.22158,-0.0448 -0.44183,-0.17765 -0.65833,-0.49944 -0.25065,-0.37255 -0.49375,-0.91947 -0.73643,-1.64629 -0.24269,-0.72682 -0.48064,-1.63786 -0.71412,-2.70067 -0.23346,-1.0628 -0.46879,-2.28202 -0.69179,-3.66254 -0.223,-1.38052 -0.43588,-2.9075 -0.64717,-4.58743 -0.21128,-1.67994 -0.41536,-3.51423 -0.61368,-5.47532 -0.19833,-1.96109 -0.39611,-4.06527 -0.58022,-6.28922 -0.18412,-2.22395 -0.35577,-4.5791 -0.52444,-7.04763 -0.16865,-2.46854 -0.32784,-5.0372 -0.47978,-7.73204 -0.15196,-2.69483 -0.30118,-5.49509 -0.43517,-8.39796 -0.12215,-2.64652 -0.22845,-5.40574 -0.33473,-8.21298 0.66682,0.38506 1.33975,0.7409 2.03075,1.01738 0.81285,0.32521 1.64684,0.55445 2.48825,0.72141 0.84138,0.16696 1.68987,0.25896 2.55518,0.25896 0.86531,0 1.72495,-0.092 2.56634,-0.25896 0.84139,-0.16696 1.67539,-0.3962 2.48825,-0.72141 0.30354,-0.12145 0.59388,-0.30123 0.89264,-0.44395 -0.099,2.60272 -0.19878,5.17777 -0.31243,7.63955 -0.13402,2.90287 -0.28318,5.70313 -0.43516,8.39796 -0.15198,2.69484 -0.31111,5.2635 -0.47979,7.73204 -0.1687,2.46853 -0.35144,4.82368 -0.53559,7.04763 -0.18415,2.22395 -0.3707,4.32813 -0.56906,6.28922 -0.19837,1.96109 -0.40238,3.79538 -0.61369,5.47532 -0.21132,1.67993 -0.43529,3.20691 -0.65832,4.58743 -0.22304,1.38052 -0.44717,2.59974 -0.68064,3.66254 -0.2335,1.06281 -0.4714,1.97385 -0.71412,2.70067 -0.24271,0.72682 -0.48576,1.27374 -0.73643,1.64629 -0.2289,0.34022 -0.4684,0.48865 -0.70295,0.51794 -0.026,-0.001 -0.0522,10e-4 -0.0781,0 z"
+           style="fill:#d30000;fill-opacity:1;stroke:#000000;stroke-width:1.21770906;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+           inkscape:connector-curvature="0" /><path
+           sodipodi:nodetypes="cc"
+           inkscape:connector-curvature="0"
+           inkscape:original-d="M 490.60427,113.10746 519.63335,-43.074211"
+           inkscape:path-effect="#path-effect631"
+           id="path703"
+           d="M 490.60427,113.10746 519.63335,-43.074211"
+           style="fill:none;stroke:#000000;stroke-width:1.66441298;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /><path
+           sodipodi:nodetypes="cc"
+           inkscape:connector-curvature="0"
+           inkscape:original-d="m 519.45894,123.41068 7.43475,-162.451371"
+           inkscape:path-effect="#path-effect633"
+           id="path705"
+           d="m 519.45894,123.41068 7.43475,-162.451371"
+           style="fill:none;stroke:#000000;stroke-width:1.66441298;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /><path
+           sodipodi:nodetypes="cc"
+           style="fill:none;stroke:#000000;stroke-width:1.66441298;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+           d="M 583.59526,113.08895 554.32164,-43.074211"
+           id="path707"
+           inkscape:path-effect="#path-effect635"
+           inkscape:original-d="M 583.59526,113.08895 554.32164,-43.074211"
+           inkscape:connector-curvature="0" /><path
+           sodipodi:nodetypes="cc"
+           style="fill:none;stroke:#000000;stroke-width:1.66441298;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+           d="M 553.58018,125.03848 547.0613,-39.040691"
+           id="path709"
+           inkscape:path-effect="#path-effect637"
+           inkscape:original-d="M 553.58018,125.03848 547.0613,-39.040691"
+           inkscape:connector-curvature="0" /><path
+           sodipodi:nodetypes="cccc"
+           inkscape:connector-curvature="0"
+           id="path711"
+           d="m 536.52009,190.65562 c -6.63002,1.85694 -30.78474,-7.53006 -41.40888,-42.09695 15.20635,37.83052 76.07813,18.78181 76.07813,18.78181 -2.52292,2.67028 -12.44204,23.61156 -34.66925,23.31514 z"
+           style="opacity:0.4;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.57466221" /></g></g><g
+       id="0parachute0"
+       inkscape:label="#g1640"
+       transform="translate(-935.77748)"><g
+         id="g725"
+         inkscape:label="#g4396"
+         transform="matrix(0.72097491,0,0,0.72097491,434.36491,-199.77977)"
+         inkscape:export-filename="/home/xymus/projects/nit/contrib/action_nitro/assets/textures/parachute.png"
+         inkscape:export-xdpi="179.97391"
+         inkscape:export-ydpi="179.97391"
+         style="opacity:0"><path
+           inkscape:connector-curvature="0"
+           style="fill:#d30000;fill-opacity:1;stroke:#000000;stroke-width:1.90968227;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+           d="m 859.92383,96.863281 c -0.27426,0 -0.53686,0.04462 -0.81055,0.04687 -0.0607,4.96e-4 -0.12163,-0.0018 -0.18164,0 -0.0525,0.0018 -0.10398,-0.0018 -0.15625,0 -0.06,0.0018 -0.1216,0.01932 -0.18164,0.02148 -0.0823,0.0027 -0.16477,-9.02e-4 -0.24805,0 -51.29406,0.809754 -92.62109,40.532559 -92.62109,89.490239 0,2.07968 0.19117,4.12953 0.33789,6.17382 0.34226,-0.79761 0.66478,-1.61871 1.03516,-2.38867 0.68897,-1.4323 1.42765,-2.81489 2.20898,-4.14453 0.78133,-1.32966 1.58782,-2.61211 2.45508,-3.83008 0.86727,-1.21798 1.77979,-2.3949 2.72656,-3.49219 0.94677,-1.09726 1.93133,-2.12032 2.95117,-3.08789 1.01985,-0.96758 2.09122,-1.87429 3.17774,-2.70312 1.08652,-0.82887 2.18723,-1.57085 3.33398,-2.25195 1.14676,-0.68112 2.31311,-1.30182 3.51367,-1.82618 1.20058,-0.52436 2.44736,-0.96953 3.69532,-1.32812 1.24796,-0.35859 2.49622,-0.62871 3.78515,-0.8125 1.28895,-0.1838 2.59644,-0.26953 3.91992,-0.26953 1.23562,0 2.468,0.0876 3.67383,0.24804 1.20585,0.1604 2.41122,0.40722 3.58203,0.72071 1.1708,0.31349 2.29333,0.66766 3.42383,1.12695 1.1305,0.45926 2.25103,1.00189 3.33594,1.59961 1.08491,0.59774 2.1417,1.275 3.17578,2.00391 1.03407,0.72889 2.04158,1.51441 3.01953,2.36718 0.97796,0.85274 1.94476,1.75533 2.86133,2.72461 0.82993,0.87768 1.61416,1.8277 2.38867,2.79493 0.0808,0.10096 0.16771,0.19102 0.24805,0.29296 1.09936,-1.33038 2.25571,-2.60748 3.46875,-3.80859 1.21303,-1.20114 2.49123,-2.34104 3.80859,-3.40234 1.31737,-1.06131 2.68725,-2.04029 4.09961,-2.95118 1.41236,-0.91088 2.87307,-1.75012 4.3711,-2.5 1.498,-0.74987 3.02135,-1.42757 4.5957,-2.00585 0.23598,-0.0867 0.48328,-0.14191 0.7207,-0.22461 1.34646,-0.46902 2.70628,-0.90349 4.10156,-1.24024 1.64132,-0.39612 3.32447,-0.67555 5.02344,-0.87891 1.69894,-0.20335 3.41291,-0.31445 5.16016,-0.31445 1.74724,0 3.48269,0.1111 5.18164,0.31445 1.69894,0.20336 3.38406,0.48279 5.02539,0.87891 0.61294,0.14793 1.19752,0.36718 1.80078,0.54102 1.01213,0.29165 2.03311,0.56148 3.01953,0.92383 1.57433,0.57828 3.09768,1.25598 4.59571,2.00585 1.49802,0.74988 2.95873,1.58912 4.37109,2.5 1.41237,0.9109 2.78419,1.88987 4.10156,2.95118 1.31737,1.0613 2.57213,2.2012 3.78516,3.40234 0.49034,0.48553 0.94744,1.02731 1.41992,1.5332 0.69634,0.74558 1.4173,1.4828 2.07227,2.27539 0.84988,-1.07852 1.7182,-2.11858 2.63476,-3.08789 0.91657,-0.96928 1.88532,-1.87187 2.86328,-2.72461 0.97796,-0.85277 1.9835,-1.63829 3.01758,-2.36718 1.03406,-0.72891 2.09281,-1.40618 3.17773,-2.00391 1.08492,-0.59772 2.182,-1.14035 3.3125,-1.59961 0.76179,-0.3095 1.54163,-0.532 2.32032,-0.76562 0.37687,-0.11307 0.74314,-0.25909 1.125,-0.36133 1.1708,-0.31349 2.37815,-0.56031 3.58398,-0.72071 1.20585,-0.16039 2.41281,-0.24804 3.64844,-0.24804 1.32348,0 2.65443,0.0858 3.94336,0.26953 1.28893,0.18379 2.53718,0.45391 3.78515,0.8125 1.24795,0.35859 2.49474,0.80376 3.69532,1.32812 1.18528,0.51769 2.33606,1.13183 3.46875,1.80274 0.0146,0.009 0.0323,0.0148 0.0469,0.0234 1.14675,0.6811 2.24747,1.42308 3.33399,2.25195 1.08651,0.82883 2.15592,1.73554 3.17578,2.70312 1.01984,0.96757 2.00441,1.99063 2.95117,3.08789 0.94677,1.09729 1.8593,2.27421 2.72656,3.49219 0.86726,1.21797 1.6757,2.50042 2.45703,3.83008 0.78134,1.32963 1.51806,2.71223 2.20703,4.14453 0.37613,0.78192 0.71148,1.60169 1.0586,2.41211 0.14845,-2.05629 0.3164,-4.10514 0.3164,-6.19726 0,-48.31578 -40.28186,-87.574404 -90.64062,-89.376958 -0.34622,-0.01235 -0.68995,-0.03609 -1.03711,-0.04492 -0.85323,-0.02172 -1.6862,-0.136719 -2.54492,-0.136719 z"
+           id="path715"
+           transform="matrix(1.1096087,0,0,-1.1096087,-417.09708,329.14203)" /><path
+           inkscape:connector-curvature="0"
+           inkscape:original-d="m 433.31594,115.44326 86.3174,-158.517471"
+           inkscape:path-effect="#path-effect4264-1"
+           id="path717"
+           d="m 433.31594,115.44326 86.3174,-158.517471"
+           style="fill:none;stroke:#000000;stroke-width:3.20000005;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /><path
+           inkscape:connector-curvature="0"
+           inkscape:original-d="M 498.25567,128.75389 526.89368,-39.040691"
+           inkscape:path-effect="#path-effect4268-0"
+           id="path719"
+           d="M 498.25567,128.75389 526.89368,-39.040691"
+           style="fill:none;stroke:#000000;stroke-width:3.20000005;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /><path
+           style="fill:none;stroke:#000000;stroke-width:3.20000005;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+           d="M 640.63904,115.44326 554.32164,-43.074211"
+           id="path721"
+           inkscape:path-effect="#path-effect4274-7"
+           inkscape:original-d="M 640.63904,115.44326 554.32164,-43.074211"
+           inkscape:connector-curvature="0" /><path
+           style="fill:none;stroke:#000000;stroke-width:3.20000005;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+           d="M 575.69932,128.75389 547.0613,-39.040691"
+           id="path723"
+           inkscape:path-effect="#path-effect4276-0"
+           inkscape:original-d="M 575.69932,128.75389 547.0613,-39.040691"
+           inkscape:connector-curvature="0" /></g><g
+         inkscape:export-ydpi="179.97391"
+         inkscape:export-xdpi="179.97391"
+         inkscape:export-filename="/home/xymus/projects/nit/contrib/action_nitro/assets/textures/parachute.png"
+         transform="matrix(0.72097491,0,0,0.72097491,434.36491,-199.77977)"
+         inkscape:label="#g4396"
+         id="g751"><path
+           inkscape:connector-curvature="0"
+           style="fill:#d30000;fill-opacity:1;stroke:#000000;stroke-width:0.74889499;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+           d="m 538.18186,76.878137 c 0.78794,-0.172662 1.56395,-0.396991 2.31943,-0.705316 0.81369,-0.332083 1.60674,-0.74972 2.38119,-1.228629 0.77445,-0.478903 1.53099,-1.02339 2.26453,-1.638166 0.73354,-0.614775 1.45004,-1.296617 2.14102,-2.03633 0.69097,-0.739708 1.35702,-1.535295 2.00377,-2.388987 0.64676,-0.853698 1.27252,-1.762162 1.87339,-2.718898 0.60087,-0.956742 1.17595,-1.965845 1.72927,-3.014684 0.55334,-1.048833 1.08105,-2.134953 1.58517,-3.264954 0.50413,-1.129995 0.9878,-2.303648 1.44107,-3.503851 0.45326,-1.20021 0.87562,-2.437775 1.27638,-3.697245 0.40075,-1.259478 0.77883,-2.537344 1.1254,-3.845142 0.34657,-1.307799 0.66312,-2.636469 0.95384,-3.981654 0.29075,-1.345178 0.55593,-2.712423 0.78917,-4.084033 0.0602,-0.354224 0.1015,-0.713834 0.15782,-1.069361 0.004,-0.0043 0.009,-0.007 0.0138,-0.01138 0.34927,-0.343909 0.68468,-0.719105 1.0156,-1.137614 0.33092,-0.418497 0.65696,-0.876583 0.96757,-1.365141 0.31063,-0.488546 0.6106,-1.004497 0.89896,-1.558529 0.28835,-0.554051 0.56617,-1.148321 0.83033,-1.763306 0.26414,-0.614979 0.51,-1.262571 0.74798,-1.933946 0.23797,-0.671361 0.46266,-1.370011 0.67249,-2.093212 0.11457,-0.394808 0.21681,-0.808047 0.32253,-1.217245 0.0452,1.038267 0.0961,2.072081 0.0961,3.128441 0,24.395738 -12.26867,44.219026 -27.60671,45.129174 z"
+           id="path727" /><path
+           inkscape:connector-curvature="0"
+           style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:0.74889499;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+           d="m 537.8662,76.900892 c -0.009,-0.0018 -0.0181,2.34e-4 -0.0273,0 0.23984,-0.01605 0.48914,-0.107804 0.75485,-0.318534 0.76424,-0.427163 1.49617,-0.939651 2.19592,-1.524403 0.69975,-0.584751 1.36708,-1.24249 2.00377,-1.968071 0.63667,-0.725587 1.24344,-1.51658 1.81849,-2.366238 0.57504,-0.849663 1.11837,-1.761916 1.6332,-2.718905 0.51484,-0.956987 1.00561,-1.955746 1.46166,-3.0033 0.45604,-1.04756 0.87768,-2.143581 1.27637,-3.264953 0.3987,-1.121372 0.76893,-2.268532 1.11168,-3.446976 0.34275,-1.178439 0.65874,-2.387486 0.94698,-3.606238 0.28825,-1.218745 0.55399,-2.454932 0.78917,-3.697245 0.23515,-1.242313 0.44095,-2.493641 0.62445,-3.742756 0.18351,-1.249115 0.34022,-2.492202 0.4735,-3.731371 0.0852,-0.791879 0.14759,-1.572663 0.21273,-2.354867 0.11478,0.05707 0.2268,0.130393 0.34311,0.182017 0.35659,0.158289 0.72382,0.283049 1.09109,0.364039 0.36727,0.08099 0.73534,0.125135 1.11167,0.125135 0.40311,0 0.80832,-0.04373 1.2009,-0.136513 0.39257,-0.0928 0.77275,-0.22848 1.15286,-0.409543 0.38008,-0.181056 0.75974,-0.406424 1.12539,-0.67119 0.36102,-0.261394 0.7118,-0.571337 1.05679,-0.910093 -0.0563,0.355527 -0.0976,0.715137 -0.15783,1.069361 -0.23324,1.37161 -0.49842,2.738855 -0.78916,4.084033 -0.29073,1.345185 -0.60727,2.673855 -0.95384,3.981654 -0.34658,1.307798 -0.72466,2.585664 -1.12541,3.845142 -0.40076,1.25947 -0.82311,2.497035 -1.27638,3.697245 -0.45327,1.200203 -0.93694,2.373856 -1.44106,3.503851 -0.50413,1.130001 -1.03184,2.216121 -1.58516,3.264954 -0.55335,1.048839 -1.12842,2.057942 -1.72929,3.014684 -0.60087,0.956736 -1.22663,1.8652 -1.8734,2.718898 -0.64674,0.853692 -1.31279,1.649279 -2.00376,2.388987 -0.69098,0.739713 -1.40747,1.421555 -2.14101,2.03633 -0.73355,0.614776 -1.49009,1.159263 -2.26454,1.638166 -0.77445,0.478909 -1.5675,0.896546 -2.3812,1.228629 -0.75547,0.308325 -1.53148,0.532654 -2.31942,0.705316 -0.10545,0.0062 -0.20992,0.01833 -0.31567,0.02275 z"
+           id="path729" /><path
+           inkscape:connector-curvature="0"
+           style="fill:#d30000;fill-opacity:1;stroke:#000000;stroke-width:0.74889499;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+           d="m 537.09077,76.969152 c -0.0836,0 -0.16369,-0.02165 -0.24704,-0.02275 0.34463,-0.0131 0.68621,-0.08979 1.02247,-0.261654 0.36338,-0.185725 0.72552,-0.456745 1.07737,-0.81908 0.35184,-0.362341 0.6977,-0.812548 1.03619,-1.342386 0.33848,-0.529837 0.66483,-1.143333 0.98817,-1.831559 0.32332,-0.688225 0.64063,-1.449113 0.94698,-2.286606 0.30635,-0.837493 0.60452,-1.752618 0.89209,-2.730276 0.28756,-0.977658 0.56336,-2.019739 0.83034,-3.128442 0.26695,-1.108703 0.52401,-2.284595 0.76856,-3.515229 0.24454,-1.230634 0.47962,-2.513063 0.69994,-3.856513 0.22032,-1.34345 0.43018,-2.739261 0.62447,-4.186425 0.19427,-1.447158 0.36881,-2.951825 0.53525,-4.493576 0.16643,-1.541752 0.32299,-3.128005 0.45976,-4.75523 0.13677,-1.627224 0.25841,-3.290531 0.3637,-4.994126 0.0561,-0.907659 0.0973,-1.848423 0.14411,-2.775781 0.21209,-0.376461 0.43184,-0.748791 0.63132,-1.148991 0.25886,0.544572 0.52373,1.069108 0.80288,1.558528 0.27917,0.48942 0.57365,0.945955 0.8715,1.376519 0.29787,0.430582 0.60458,0.82646 0.91954,1.194496 0.31495,0.368036 0.63714,0.710667 0.96758,1.012474 0.33043,0.301806 0.66442,0.575815 1.00874,0.807708 0.23203,0.156272 0.46964,0.268823 0.70682,0.386787 -0.0652,0.782204 -0.12757,1.562988 -0.21273,2.354867 -0.13328,1.239169 -0.29,2.482256 -0.4735,3.731371 -0.1835,1.249115 -0.3893,2.500443 -0.62446,3.742755 -0.23517,1.242314 -0.50091,2.478501 -0.78916,3.697246 -0.28824,1.218752 -0.60423,2.427799 -0.94699,3.606238 -0.34274,1.178444 -0.71298,2.325604 -1.11167,3.446976 -0.39869,1.121372 -0.82033,2.217393 -1.27637,3.264953 -0.45606,1.047554 -0.94682,2.046312 -1.46167,3.0033 -0.51482,0.956989 -1.05815,1.869241 -1.6332,2.718905 -0.57504,0.849658 -1.18181,1.64065 -1.81848,2.366237 -0.6367,0.725581 -1.30403,1.383321 -2.00377,1.968072 -0.69976,0.584751 -1.43167,1.09724 -2.19592,1.524402 -0.26572,0.210731 -0.51501,0.302471 -0.75484,0.318535 0.009,2.34e-4 0.0183,-0.0018 0.0273,0 -0.25988,0.01094 -0.51389,0.06826 -0.77544,0.06826 z"
+           id="path731" /><path
+           inkscape:connector-curvature="0"
+           style="fill:#0028dd;fill-opacity:1;stroke:#000000;stroke-width:0.74889499;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+           d="m 536.61041,76.935019 c -15.6229,-0.408861 -28.21059,-20.466206 -28.21059,-45.186056 0,-1.050081 0.0582,-2.084855 0.10293,-3.117064 0.10424,0.402735 0.20286,0.8171 0.31567,1.205867 0.20983,0.723201 0.43452,1.421851 0.67249,2.093213 0.23798,0.671375 0.48384,1.318967 0.74798,1.933945 0.26416,0.614985 0.54198,1.209257 0.83033,1.763307 0.28836,0.554031 0.58833,1.069982 0.89896,1.558528 0.31061,0.488559 0.63663,0.946644 0.96757,1.365141 0.33092,0.41851 0.66633,0.793705 1.0156,1.137615 0.34928,0.34391 0.70485,0.656706 1.07051,0.921465 0.36566,0.264766 0.74531,0.490134 1.12541,0.67119 0.3801,0.181063 0.76027,0.316745 1.15286,0.409543 0.39257,0.0928 0.79092,0.136513 1.19402,0.136513 0.37634,0 0.75127,-0.04416 1.11854,-0.125135 0.36727,-0.08099 0.73449,-0.20575 1.0911,-0.364039 0.35659,-0.158284 0.69873,-0.336899 1.04305,-0.568804 0.34432,-0.231893 0.68517,-0.505902 1.01561,-0.807708 0.33043,-0.301813 0.65261,-0.644437 0.96757,-1.012474 0.31495,-0.368036 0.62168,-0.763914 0.91954,-1.194496 0.29786,-0.430564 0.59234,-0.887099 0.8715,-1.376519 0.25278,-0.443159 0.49149,-0.922265 0.7274,-1.410639 0.0589,1.270831 0.11584,2.542048 0.19214,3.776883 0.10526,1.703595 0.22698,3.366902 0.3637,4.994126 0.13673,1.627225 0.28651,3.213478 0.4529,4.75523 0.16638,1.541752 0.34789,3.046418 0.54212,4.493576 0.19423,1.447164 0.4042,2.842975 0.62446,4.186425 0.22027,1.34345 0.4486,2.62588 0.69309,3.856513 0.24448,1.230634 0.50166,2.406526 0.76856,3.515229 0.26691,1.108703 0.54968,2.150784 0.8372,3.128442 0.28751,0.977658 0.57892,1.892783 0.88523,2.730276 0.30629,0.837493 0.62369,1.598381 0.94698,2.286606 0.32327,0.688226 0.65657,1.301722 0.99502,1.831559 0.33845,0.529838 0.68438,0.980045 1.0362,1.342386 0.3518,0.362336 0.70714,0.633355 1.0705,0.81908 0.31386,0.160424 0.63263,0.227957 0.95385,0.250276 z"
+           id="path733" /><path
+           inkscape:connector-curvature="0"
+           style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:0.74889499;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+           d="m 532.74012,42.340154 c 0.0653,1.726461 0.13074,3.423391 0.20586,5.051009 0.0824,1.785274 0.17418,3.507443 0.26764,5.164772 0.0934,1.657336 0.19134,3.23707 0.29506,4.75523 0.10373,1.518154 0.2093,2.966578 0.32254,4.334315 0.11322,1.367736 0.23485,2.661813 0.35683,3.86789 0.12197,1.206077 0.24748,2.334171 0.37742,3.367339 0.12994,1.033162 0.26086,1.97226 0.39801,2.821285 0.13715,0.849024 0.28187,1.598848 0.42545,2.252474 0.14359,0.653631 0.28993,1.213923 0.43919,1.66092 0.14925,0.446996 0.29875,0.783354 0.4529,1.012473 0.13315,0.197903 0.2686,0.27963 0.40488,0.307158 -0.0251,-0.0012 -0.0501,4.54e-4 -0.0755,0 -0.32122,-0.02232 -0.63999,-0.08985 -0.95386,-0.250276 -0.36336,-0.185725 -0.71869,-0.456744 -1.0705,-0.81908 -0.35181,-0.362341 -0.69774,-0.812548 -1.03619,-1.342386 -0.33846,-0.529837 -0.67175,-1.143333 -0.99502,-1.831559 -0.32329,-0.688225 -0.6407,-1.449113 -0.94699,-2.286606 -0.3063,-0.837493 -0.59772,-1.752618 -0.88522,-2.730276 -0.28752,-0.977658 -0.57029,-2.019739 -0.8372,-3.128442 -0.2669,-1.108703 -0.52408,-2.284595 -0.76856,-3.515229 -0.2445,-1.230633 -0.47283,-2.513063 -0.6931,-3.856513 -0.22026,-1.34345 -0.43022,-2.739261 -0.62446,-4.186425 -0.19422,-1.447158 -0.37573,-2.951824 -0.54211,-4.493576 -0.16639,-1.541752 -0.31617,-3.128005 -0.45291,-4.75523 -0.13672,-1.627224 -0.25843,-3.290531 -0.36369,-4.994126 -0.0763,-1.234835 -0.1332,-2.506052 -0.19214,-3.776883 0.0246,-0.05098 0.051,-0.09641 0.0755,-0.147889 0.33483,0.671737 0.68732,1.3161 1.05678,1.922567 0.36947,0.606485 0.75848,1.181925 1.15971,1.717796 0.40125,0.535883 0.81876,1.030352 1.24894,1.490276 0.43016,0.45993 0.87501,0.884122 1.33126,1.262755 0.45626,0.378627 0.92038,0.720489 1.39989,1.012474 0.0719,0.04379 0.14729,0.072 0.2196,0.113763 z"
+           id="path735" /><path
+           inkscape:connector-curvature="0"
+           style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:0.74889499;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+           d="m 536.78883,76.946397 c 0.14425,-0.01802 0.29154,-0.109299 0.43232,-0.318536 0.15416,-0.229119 0.30363,-0.565477 0.45291,-1.012473 0.14927,-0.446997 0.29558,-1.007289 0.43918,-1.66092 0.14359,-0.653626 0.28143,-1.40345 0.4186,-2.252474 0.13716,-0.849025 0.2749,-1.788123 0.40487,-2.821285 0.12996,-1.033168 0.25542,-2.161262 0.37741,-3.367339 0.122,-1.206077 0.23673,-2.500154 0.34998,-3.86789 0.11326,-1.367737 0.22564,-2.816161 0.32939,-4.334315 0.10374,-1.51816 0.20161,-3.097894 0.29507,-4.75523 0.0935,-1.657329 0.18521,-3.379498 0.26763,-5.164772 0.0699,-1.514002 0.13128,-3.097667 0.19214,-4.698347 0.30828,-0.147263 0.6191,-0.283467 0.91954,-0.466425 0.47951,-0.291985 0.94362,-0.633847 1.39989,-1.012474 0.45626,-0.378633 0.90111,-0.802825 1.33127,-1.262755 0.43017,-0.45993 0.84768,-0.954393 1.24893,-1.490276 0.40123,-0.535871 0.78339,-1.111311 1.15285,-1.717796 0.14935,-0.245153 0.28841,-0.51814 0.43232,-0.773576 -0.0468,0.927358 -0.088,1.868122 -0.14411,2.775781 -0.10529,1.703595 -0.22693,3.366902 -0.3637,4.994126 -0.13677,1.627225 -0.29333,3.213478 -0.45976,4.75523 -0.16644,1.541752 -0.34098,3.046418 -0.53525,4.493576 -0.19429,1.447164 -0.40415,2.842975 -0.62447,4.186425 -0.22032,1.34345 -0.4554,2.62588 -0.69994,3.856513 -0.24455,1.230634 -0.50161,2.406526 -0.76856,3.515229 -0.26698,1.108703 -0.54278,2.150784 -0.83034,3.128442 -0.28757,0.977658 -0.58574,1.892783 -0.89209,2.730276 -0.30635,0.837493 -0.62366,1.598381 -0.94698,2.286606 -0.32334,0.688226 -0.64969,1.301722 -0.98817,1.831559 -0.33849,0.529838 -0.68435,0.980045 -1.03619,1.342386 -0.35185,0.362336 -0.71399,0.633355 -1.07737,0.81908 -0.33626,0.171863 -0.67784,0.248529 -1.02247,0.261654 -0.0185,-2.53e-4 -0.0366,6.14e-4 -0.0549,0 z"
+           id="path737" /><path
+           inkscape:connector-curvature="0"
+           style="fill:#d30000;fill-opacity:1;stroke:#000000;stroke-width:0.74889499;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+           d="m 536.7408,76.946397 c -0.0183,-6.16e-4 -0.0366,-0.01027 -0.0549,-0.01138 -0.13627,-0.02755 -0.27172,-0.109255 -0.40488,-0.307157 -0.15414,-0.229119 -0.30365,-0.565477 -0.4529,-1.012474 -0.14926,-0.446996 -0.29559,-1.007289 -0.43918,-1.66092 -0.14359,-0.653626 -0.28831,-1.40345 -0.42546,-2.252474 -0.13715,-0.849025 -0.26807,-1.788122 -0.39802,-2.821284 -0.12993,-1.033168 -0.25544,-2.161262 -0.37741,-3.367339 -0.12197,-1.206077 -0.24361,-2.500154 -0.35684,-3.867891 -0.11323,-1.367736 -0.2188,-2.816161 -0.32253,-4.334315 -0.10372,-1.518159 -0.20162,-3.097894 -0.29506,-4.755229 -0.0935,-1.657329 -0.18523,-3.379498 -0.26763,-5.164773 -0.0751,-1.627617 -0.1405,-3.324547 -0.20587,-5.051008 0.4101,0.236813 0.82396,0.455656 1.24893,0.625692 0.4999,0.200005 1.01281,0.340988 1.53027,0.443669 0.51746,0.102681 1.03928,0.159261 1.57145,0.159261 0.53217,0 1.06085,-0.05658 1.57831,-0.159261 0.51746,-0.102681 1.03036,-0.243664 1.53028,-0.443669 0.18668,-0.07469 0.36524,-0.185258 0.54897,-0.273031 -0.0609,1.600681 -0.12224,3.184345 -0.19214,4.698347 -0.0824,1.785275 -0.17416,3.507444 -0.26762,5.164773 -0.0935,1.657335 -0.19134,3.23707 -0.29508,4.755229 -0.10374,1.518154 -0.21613,2.966579 -0.32939,4.334315 -0.11325,1.367737 -0.22797,2.661814 -0.34997,3.867891 -0.122,1.206077 -0.24747,2.334171 -0.37742,3.367339 -0.12996,1.033162 -0.26771,1.972259 -0.40487,2.821284 -0.13717,0.849024 -0.27501,1.598848 -0.4186,2.252474 -0.1436,0.653631 -0.28991,1.213924 -0.43918,1.66092 -0.14927,0.446997 -0.29875,0.783355 -0.45291,1.012474 -0.14078,0.209236 -0.28806,0.300521 -0.43232,0.318535 -0.016,-6.15e-4 -0.0321,6.15e-4 -0.048,0 z"
+           id="path739" /><path
+           style="fill:none;stroke:#000000;stroke-width:1.10960865;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+           d="m 508.50275,28.631899 11.1306,-71.70611"
+           id="path741"
+           inkscape:path-effect="#path-effect631"
+           inkscape:original-d="m 508.50275,28.631899 11.1306,-71.70611"
+           inkscape:connector-curvature="0"
+           sodipodi:nodetypes="cc" /><path
+           style="fill:none;stroke:#000000;stroke-width:1.10960865;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+           d="m 526.24846,34.968412 0.64523,-74.009103"
+           id="path743"
+           inkscape:path-effect="#path-effect633"
+           inkscape:original-d="m 526.24846,34.968412 0.64523,-74.009103"
+           inkscape:connector-curvature="0"
+           sodipodi:nodetypes="cc" /><path
+           inkscape:connector-curvature="0"
+           inkscape:original-d="M 565.69257,28.620514 554.32164,-43.074211"
+           inkscape:path-effect="#path-effect635"
+           id="path745"
+           d="M 565.69257,28.620514 554.32164,-43.074211"
+           style="fill:none;stroke:#000000;stroke-width:1.10960865;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+           sodipodi:nodetypes="cc" /><path
+           inkscape:connector-curvature="0"
+           inkscape:original-d="m 547.23313,35.969519 -0.17183,-75.01021"
+           inkscape:path-effect="#path-effect637"
+           id="path747"
+           d="m 547.23313,35.969519 -0.17183,-75.01021"
+           style="fill:none;stroke:#000000;stroke-width:1.10960865;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+           sodipodi:nodetypes="cc" /><path
+           style="opacity:0.4;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.3534191"
+           d="m 536.74112,76.324266 c -4.07748,1.142023 -18.93272,-4.631012 -25.46659,-25.889759 9.35195,23.26589 46.78829,11.550872 46.78829,11.550872 -1.55161,1.642232 -7.65189,14.521185 -21.3217,14.338887 z"
+           id="path749"
+           inkscape:connector-curvature="0"
+           sodipodi:nodetypes="cccc" /></g></g></g></svg>
\ No newline at end of file
index 584e6d1..4c590d5 100644 (file)
Binary files a/contrib/action_nitro/assets/particles/blood07.png and b/contrib/action_nitro/assets/particles/blood07.png differ
index 22529ca..16a484f 100644 (file)
Binary files a/contrib/action_nitro/assets/particles/explosion00.png and b/contrib/action_nitro/assets/particles/explosion00.png differ
diff --git a/contrib/action_nitro/assets/textures/player.png b/contrib/action_nitro/assets/textures/player.png
new file mode 100644 (file)
index 0000000..bbd402f
Binary files /dev/null and b/contrib/action_nitro/assets/textures/player.png differ
diff --git a/contrib/action_nitro/assets/textures/player/frame_01.png b/contrib/action_nitro/assets/textures/player/frame_01.png
deleted file mode 100644 (file)
index eb6f0ac..0000000
Binary files a/contrib/action_nitro/assets/textures/player/frame_01.png and /dev/null differ
diff --git a/contrib/action_nitro/assets/textures/player/frame_02.png b/contrib/action_nitro/assets/textures/player/frame_02.png
deleted file mode 100644 (file)
index e4c1311..0000000
Binary files a/contrib/action_nitro/assets/textures/player/frame_02.png and /dev/null differ
diff --git a/contrib/action_nitro/assets/textures/player/frame_03.png b/contrib/action_nitro/assets/textures/player/frame_03.png
deleted file mode 100644 (file)
index 1d63a6e..0000000
Binary files a/contrib/action_nitro/assets/textures/player/frame_03.png and /dev/null differ
diff --git a/contrib/action_nitro/assets/textures/player/frame_04.png b/contrib/action_nitro/assets/textures/player/frame_04.png
deleted file mode 100644 (file)
index 9c331fd..0000000
Binary files a/contrib/action_nitro/assets/textures/player/frame_04.png and /dev/null differ
diff --git a/contrib/action_nitro/assets/textures/player/frame_05.png b/contrib/action_nitro/assets/textures/player/frame_05.png
deleted file mode 100644 (file)
index 8948eb1..0000000
Binary files a/contrib/action_nitro/assets/textures/player/frame_05.png and /dev/null differ
diff --git a/contrib/action_nitro/assets/textures/player/frame_06.png b/contrib/action_nitro/assets/textures/player/frame_06.png
deleted file mode 100644 (file)
index 84e30d9..0000000
Binary files a/contrib/action_nitro/assets/textures/player/frame_06.png and /dev/null differ
diff --git a/contrib/action_nitro/assets/textures/player/frame_07.png b/contrib/action_nitro/assets/textures/player/frame_07.png
deleted file mode 100644 (file)
index a9cd3e5..0000000
Binary files a/contrib/action_nitro/assets/textures/player/frame_07.png and /dev/null differ
diff --git a/contrib/action_nitro/assets/textures/player/frame_08.png b/contrib/action_nitro/assets/textures/player/frame_08.png
deleted file mode 100644 (file)
index 2cdbbeb..0000000
Binary files a/contrib/action_nitro/assets/textures/player/frame_08.png and /dev/null differ
diff --git a/contrib/action_nitro/assets/textures/player/frame_09.png b/contrib/action_nitro/assets/textures/player/frame_09.png
deleted file mode 100644 (file)
index 5f70296..0000000
Binary files a/contrib/action_nitro/assets/textures/player/frame_09.png and /dev/null differ
diff --git a/contrib/action_nitro/assets/textures/player/frame_10.png b/contrib/action_nitro/assets/textures/player/frame_10.png
deleted file mode 100644 (file)
index a122246..0000000
Binary files a/contrib/action_nitro/assets/textures/player/frame_10.png and /dev/null differ
diff --git a/contrib/action_nitro/assets/textures/player/frame_11.png b/contrib/action_nitro/assets/textures/player/frame_11.png
deleted file mode 100644 (file)
index 231eef8..0000000
Binary files a/contrib/action_nitro/assets/textures/player/frame_11.png and /dev/null differ
diff --git a/contrib/action_nitro/assets/textures/player/frame_12.png b/contrib/action_nitro/assets/textures/player/frame_12.png
deleted file mode 100644 (file)
index ccf5003..0000000
Binary files a/contrib/action_nitro/assets/textures/player/frame_12.png and /dev/null differ
index b9ae919..bcd9ef0 100644 (file)
@@ -9,3 +9,4 @@ git=https://github.com/nitlang/nit.git
 git.directory=contrib/action_nitro/
 homepage=http://nitlanguage.org
 issues=https://github.com/nitlang/nit/issues
+apk=http://nitlanguage.org/fdroid/apk/action_nitro.apk
index 5a2c3bc..2c6afdc 100644 (file)
@@ -18,7 +18,6 @@ module action_nitro is
        app_version(1, 0, git_revision)
 
        android_manifest_activity """android:screenOrientation="sensorLandscape""""
-       android_api_target 10
 end
 
 import gamnit::depth
@@ -41,9 +40,12 @@ redef class App
        # Textures of the biplane, jet, helicopter, parachute and powerups
        var planes_sheet = new PlanesImages
 
+       # Animation when opening the parachute
+       var parachute_animation = new Animation(planes_sheet.parachute, 16.0)
+
        # Animation for the player movement
-       private var player_textures: Array[Texture] =
-               [for f in [1..12] do new Texture("textures/player/frame_{f.pad(2)}.png")]
+       private var running_texture = new Texture("textures/player.png")
+       private var running_animation: Animation = running_texture.to_animation(10.0, 12, 0)
 
        # Boss 3D model
        private var iss_model = new Model("models/iss.obj")
@@ -77,11 +79,11 @@ redef class App
        # Particle effects
 
        # Explosion particles
-       var explosions = new ParticleSystem(20, explosion_program,
+       var explosions = new ParticleSystem(100, explosion_program,
                new Texture("particles/explosion00.png"))
 
        # Blood explosion particles
-       var blood = new ParticleSystem(20, explosion_program,
+       var blood = new ParticleSystem(100, explosion_program,
                new Texture("particles/blood07.png"))
 
        # Smoke for the background
@@ -134,6 +136,9 @@ redef class App
 
        redef fun on_create
        do
+               blood.texture.as(RootTexture).premultiply_alpha = false
+               explosions.texture.as(RootTexture).premultiply_alpha = false
+
                super
 
                show_splash_screen new Texture("textures/splash.jpg")
@@ -147,10 +152,10 @@ redef class App
                ui_camera.reset_height 1080.0
 
                # Register particle systems
-               particle_systems.add explosions
-               particle_systems.add blood
                particle_systems.add smoke
                particle_systems.add clouds
+               particle_systems.add blood
+               particle_systems.add explosions
 
                # Stars background
                sprites.add stars
@@ -276,7 +281,6 @@ redef class App
                        player.moving = 0.0
                        if pressed_keys.has("left") then player.moving -= 1.0
                        if pressed_keys.has("right") then player.moving += 1.0
-                       player.sprite.as(PlayerSprite).update
                end
 
                # Try to fire as long as a key is pressed
@@ -404,16 +408,12 @@ redef class App
                                        if event.name == "left" then
                                                var mod = if event.is_down then -1.0 else 1.0
                                                player.moving += mod
-                                       end
-
-                                       if event.name == "right" then
+                                               player.animate_move
+                                       else if event.name == "right" then
                                                var mod = if event.is_down then 1.0 else -1.0
                                                player.moving += mod
+                                               player.animate_move
                                        end
-
-                                       if player.moving == 0.0 then
-                                       player.sprite.as(PlayerSprite).stop_running
-                                       else player.sprite.as(PlayerSprite).start_running
                                end
                        end
                end
@@ -470,12 +470,12 @@ redef class Human
        # Show death animation (explosion)
        fun death_animation
        do
-               var force = 4.0
+               var force = 2.0
                health = 0.0
-               for i in 32.times do
+               for i in 16.times do
                        app.blood.add(
                                new Point3d[Float](center.x & force, center.y & force, center.z & force),
-                               (2048.0 & 4096.0) * force, 0.3 & 0.1)
+                               (4096.0 & 2048.0) * force, 0.3 & 0.1)
                end
        end
 end
@@ -525,19 +525,31 @@ redef class Boss
 end
 
 redef class Enemy
-       redef var sprite = new Sprite(app.player_textures.rand, center) is lazy
+       redef var sprite = new Sprite(app.running_animation.frames.rand, center) is lazy
        init do sprite.scale = width/sprite.texture.width * 2.0
 end
 
 redef class Parachute
-       redef var sprite = new Sprite(app.planes_sheet.parachute, center) is lazy
-       init do sprite.scale = width / sprite.texture.width
+       redef var sprite = new Sprite(app.planes_sheet.parachute_open, center) is lazy
+       init
+       do
+               sprite.scale = width / sprite.texture.width
+               sprite.animate app.parachute_animation
+       end
 end
 
 redef class Player
-       redef var sprite = new PlayerSprite(app.player_textures[1], center, app.player_textures, 0.08) is lazy
+       redef var sprite = new Sprite(app.running_animation.frames.last, center) is lazy
        init do sprite.scale = width/sprite.texture.width * 2.0
 
+       # Update current animation
+       fun animate_move
+       do
+               if moving == 0.0 then
+                       sprite.animate_stop
+               else sprite.animate(app.running_animation, -1.0)
+       end
+
        redef fun update(dt, world)
        do
                super
@@ -612,60 +624,12 @@ redef class World
                super
 
                # Particles
-               app.explosions.add(center, 8192.0 * force, 0.3)
-               for i in (4.0*force).to_i.times do
+               var range = 0.5 * force
+               app.explosions.add(center, 4096.0 * force, 0.3)
+               for i in (2.0*force).to_i.times do
                        app.explosions.add(
-                               new Point3d[Float](center.x & force, center.y & force/2.0, center.z & force),
-                               (4096.0 & 2048.0) * force, 0.3 & 0.3, 0.5.rand)
-               end
-       end
-end
-
-redef class Int
-       # Pad a number with `0`s on the left side to reach `size` digits
-       private fun pad(size: Int): String
-       do
-               var s = to_s
-               var d = size - s.length
-               if d > 0 then s = "0"*d + s
-               return s
-       end
-end
-
-# Special `Sprite` for the player character which is animated
-class PlayerSprite
-       super Sprite
-
-       # Animation of the running character
-       var running_animation: Array[Texture]
-
-       # Seconds per frame of the animations
-       var time_per_frame: Float
-
-       # Currently playing animation
-       private var current_animation: nullable Array[Texture] = null
-
-       # Second at witch `current_animation` started
-       private var anim_ot = 0.0
-
-       # Start the running animation
-       fun start_running
-       do
-               anim_ot = app.world.t
-               current_animation = running_animation
-       end
-
-       # Stop the running animation
-       fun stop_running do current_animation = null
-
-       # Update `texture` from `current_animation`
-       fun update
-       do
-               var anim = current_animation
-               if anim != null then
-                       var dt = app.world.t - anim_ot
-                       var i = (dt / time_per_frame).to_i+2
-                       texture = anim.modulo(i)
+                               new Point3d[Float](center.x & range, center.y & range, center.z & range),
+                               (2048.0 & 1024.0) * force, 0.3 & 0.3, 0.5.rand)
                end
        end
 end
@@ -722,8 +686,8 @@ redef class SmokeProgram
                gl_PointSize = scale / gl_Position.z * (pt+0.1);
 
                if (pt < 0.1)
-                       v_color.a = pt / 0.1;
+                       v_color *= pt / 0.1;
                else
-                       v_color.a = 1.0 - pt*0.9;
+                       v_color *= 1.0 - pt*0.9;
        """
 end
diff --git a/contrib/asteronits/assets/sounds/fire.mp3 b/contrib/asteronits/assets/sounds/fire.mp3
deleted file mode 100644 (file)
index d1f2ba2..0000000
Binary files a/contrib/asteronits/assets/sounds/fire.mp3 and /dev/null differ
diff --git a/contrib/asteronits/assets/sounds/fire.ogg b/contrib/asteronits/assets/sounds/fire.ogg
new file mode 100644 (file)
index 0000000..a56e01a
Binary files /dev/null and b/contrib/asteronits/assets/sounds/fire.ogg differ
index 006d1e1..02cb3f4 100644 (file)
@@ -61,7 +61,7 @@ redef class App
        var world = new World(12, 2, display.aspect_ratio) is lazy
 
        # Sound effects
-       private var fx_fire = new Sound("sounds/fire.mp3")
+       private var fx_fire = new Sound("sounds/fire.ogg")
        private var fx_explosion_ship = new Sound("sounds/explosion_ship.wav")
        private var fx_explosion_asteroids = new Sound("sounds/explosion_asteroids.wav")
 
index a5a9a62..12c6ffc 100644 (file)
@@ -91,10 +91,12 @@ class GlobeMaterial
        init surface do init(0, true, [1.0, 1.0, 1.0, 1.0])
 
        # Create and configure a material for the cloud layer
-       init clouds do init(4, false, [1.0, 1.0, 1.0, 0.5])
+       init clouds do init(4, false, [1.0*clouds_a, 1.0*clouds_a, 1.0*clouds_a, clouds_a])
+       private var clouds_a = 0.5
 
        # Create and configure a material for the visible atmosphere
-       init atmo do init(null, false, [0.0, 0.8, 1.0, 0.05])
+       init atmo do init(null, false, [0.0, 0.8*atmo_a, 1.0*atmo_a, atmo_a])
+       private var atmo_a = 0.05
 
        redef fun draw(actor, model)
        do
@@ -228,7 +230,6 @@ class GlobeProgram
                                s += 0.05 * texture2D(tex_displace, tex_coord).r;
 
                        gl_Position = (vec4(coord.xyz * s, 1.0) * rotation + translation) * mvp;
-
                }
                """ @ glsl_vertex_shader
 
diff --git a/lib/gamnit/android19.nit b/lib/gamnit/android19.nit
new file mode 100644 (file)
index 0000000..3325ece
--- /dev/null
@@ -0,0 +1,55 @@
+# This file is part of NIT ( http://www.nitlanguage.org ).
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Variation using features from Android API 19
+#
+# Add support for `TextureAsset::premultiply_alpha = false` on Android.
+module android19 is
+       android_api_min 19
+       android_api_target 22
+end
+
+import android
+intrude import display_android
+intrude import android::load_image
+
+in "Java" `{
+       import android.graphics.Bitmap;
+       import android.graphics.BitmapFactory;
+`}
+
+redef class TextureAsset
+
+       redef fun load_bitmap(asset_manager, path)
+       do
+               var stream = asset_manager.native_assets_manager.open(path.to_java_string)
+               return new NativeBitmap.from_stream_ex(stream, premultiply_alpha)
+       end
+end
+
+redef class NativeCByteArray
+
+       # The data was not premultiplied, don't unmultiply it
+       redef fun unmultiply(w, h) do end
+end
+
+redef class NativeBitmap
+
+       # Load from `input_stream` with optional `premultiply_alpha`
+       new from_stream_ex(input_stream: NativeInputStream, premultiply_alpha: Bool) in "Java" `{
+               BitmapFactory.Options opts = new BitmapFactory.Options();
+               opts.inPremultiplied = premultiply_alpha; // API 19
+               return BitmapFactory.decodeStream(input_stream, null, opts);
+       `}
+end
index 746a952..3b320f9 100644 (file)
@@ -31,12 +31,18 @@ class SmoothMaterial
        super Material
 
        # Ambient color, always visible
+       #
+       # The RGB values should be premultiplied by the alpha value.
        var ambient_color: Array[Float] is writable
 
        # Diffuse color when covered by a light source
+       #
+       # The RGB values should be premultiplied by the alpha value.
        var diffuse_color: Array[Float] is writable
 
        # Specular color affecting reflections
+       #
+       # The RGB values should be premultiplied by the alpha value.
        var specular_color: Array[Float] is writable
 
        redef fun draw(actor, model)
@@ -71,9 +77,13 @@ class SmoothMaterial
                program.camera.uniform(app.world_camera.position.x, app.world_camera.position.y, app.world_camera.position.z)
 
                # Colors from the material
-               program.ambient_color.uniform(ambient_color[0], ambient_color[1], ambient_color[2], ambient_color[3]*actor.alpha)
-               program.diffuse_color.uniform(diffuse_color[0], diffuse_color[1], diffuse_color[2], diffuse_color[3]*actor.alpha)
-               program.specular_color.uniform(specular_color[0], specular_color[1], specular_color[2], specular_color[3]*actor.alpha)
+               var a = actor.alpha
+               program.ambient_color.uniform(ambient_color[0]*a, ambient_color[1]*a,
+                                             ambient_color[2]*a, ambient_color[3]*a)
+               program.diffuse_color.uniform(diffuse_color[0]*a, diffuse_color[1]*a,
+                                             diffuse_color[2]*a, diffuse_color[3]*a)
+               program.specular_color.uniform(specular_color[0]*a, specular_color[1]*a,
+                                              specular_color[2]*a, specular_color[3]*a)
 
                # Execute draw
                if mesh.indices.is_empty then
@@ -188,9 +198,13 @@ class TexturedMaterial
 
                program.rotation.uniform new Matrix.gamnit_euler_rotation(actor.pitch, actor.yaw, actor.roll)
 
-               program.ambient_color.uniform(ambient_color[0], ambient_color[1], ambient_color[2], ambient_color[3]*actor.alpha)
-               program.diffuse_color.uniform(diffuse_color[0], diffuse_color[1], diffuse_color[2], diffuse_color[3]*actor.alpha)
-               program.specular_color.uniform(specular_color[0], specular_color[1], specular_color[2], specular_color[3]*actor.alpha)
+               var a = actor.alpha
+               program.ambient_color.uniform(ambient_color[0]*a, ambient_color[1]*a,
+                                             ambient_color[2]*a, ambient_color[3]*a)
+               program.diffuse_color.uniform(diffuse_color[0]*a, diffuse_color[1]*a,
+                                             diffuse_color[2]*a, diffuse_color[3]*a)
+               program.specular_color.uniform(specular_color[0]*a, specular_color[1]*a,
+                                              specular_color[2]*a, specular_color[3]*a)
 
                program.normal.array_enabled = true
                program.normal.array(mesh.normals, 3)
index 3c40ac1..bfe3392 100644 (file)
@@ -258,7 +258,6 @@ class ParticleProgram
                {
                        if (use_texture) {
                                gl_FragColor = texture2D(texture0, gl_PointCoord) * v_color;
-                               if (gl_FragColor.a <= 0.01) discard;
                        } else {
                                gl_FragColor = v_color;
                        }
@@ -301,7 +300,7 @@ class ExplosionProgram
                gl_Position = center * mvp;
                gl_PointSize = scale / gl_Position.z * pt;
 
-               if (pt > 0.8) v_color.a = (1.0-pt)/0.2;
+               if (pt > 0.8) v_color *= (1.0-pt)/0.2;
        """
 end
 
@@ -318,8 +317,8 @@ class SmokeProgram
                gl_PointSize = scale / gl_Position.z * (pt+0.1);
 
                if (pt < 0.1)
-                       v_color.a = pt / 0.1;
+                       v_color *= pt / 0.1;
                else
-                       v_color.a = 1.0 - pt*0.9;
+                       v_color *= 1.0 - pt*0.9;
        """
 end
index e9d1b4a..8e5566c 100644 (file)
@@ -50,19 +50,24 @@ end
 
 redef class TextureAsset
 
+       private fun load_bitmap(asset_manager: AssetManager, path: String): NativeBitmap
+       do
+               return asset_manager.bitmap(path)
+       end
+
        redef fun load_from_platform
        do
                jni_env.push_local_frame 4
 
                var asset_manager = app.asset_manager
-               var bmp = asset_manager.bitmap(path)
+               var bmp = load_bitmap(asset_manager, path)
                if bmp.is_java_null then
                        error = new Error("Failed to load texture at '{path}'")
                        jni_env.pop_local_frame
                        return
                end
 
-               var buf = bmp.copy_pixels
+               var buf = bmp.copy_pixels(unmultiply=not premultiply_alpha)
                loaded = true
                width = bmp.width.to_f
                height = bmp.height.to_f
index b278029..3911092 100644 (file)
@@ -123,6 +123,55 @@ class Sprite
                center_direct = value
        end
 
+       # Last animation set with `animate`
+       var animation: nullable Animation = null
+
+       # Animation on the shader, if this changes it `needs_remap`
+       private var shader_animation: nullable Animation = null
+
+       # Animation start time, relative to `sprite_set.time`
+       #
+       # At -1.0 if animation started before being assigned a `sprite_set`.
+       private var animation_start = 0.0
+
+       # Number of loops to show `animation`
+       private var animation_loops = 0.0
+
+       # Start the `animation` for `n_loops`, replacing the static `texture`
+       #
+       # By default, if `n_loops` is not set, the animation plays once.
+       # If `n_loops == -1.0` then the animation loops infinitely.
+       # Otherwise, the animation repeats, e.g. it repeats twice and a half
+       # if `n_loops == 2.5`.
+       #
+       # The animation can be stopped using `animate_stop`.
+       fun animate(animation: Animation, n_loops: nullable Float)
+       do
+               if not animation.valid then print_error "{class_name}::animate: invalid animation {animation}"
+
+               var shader_animation = shader_animation
+               if shader_animation == null or animation.frames.first.root != shader_animation.frames.first.root then
+                       # Resort with the new animation texture
+                       needs_remap
+               else
+                       needs_update
+               end
+
+               var sprite_set = sprite_set
+               animation_start = if sprite_set != null then sprite_set.time else -1.0
+               animation_loops = n_loops or else 1.0
+               self.shader_animation = animation
+               self.animation = animation
+       end
+
+       # Stop any active `animation` to display the static `texture`
+       fun animate_stop
+       do
+               if animation == null then return
+               needs_update
+               animation = null
+       end
+
        # Rotation on the Z axis, positive values turn counterclockwise
        var rotation = 0.0 is writable(rotation_direct=)
 
@@ -235,7 +284,10 @@ class Sprite
        fun needs_update
        do
                var c = context
-               if c != null then c.sprites_to_update.add self
+               if c == null then return
+               if c.last_sprite_to_update == self then return
+               c.sprites_to_update.add self
+               c.last_sprite_to_update = self
        end
 
        # Request a resorting of this sprite in its sprite list
@@ -253,10 +305,51 @@ class Sprite
        # Current context to which `self` was sorted
        private var context: nullable SpriteContext = null
 
+       # Index in `context`
+       private var context_index: Int = -1
+
        # Current context to which `self` belongs
        private var sprite_set: nullable SpriteSet = null
 end
 
+# Animation for sprites, set with `Sprite.animate`
+#
+# Two main services create animations:
+# * The constructors accepts an array of textures and the number of frames per
+#   seconds: `new Animation(array_of_subtextures, 10.0)`
+# * The method `Texture::to_animation` uses the whole texture
+#   dividing it in frames either on X or Y:
+#   `new Texture("path/in/assets.png").to_animation(30.0, 0, 12)`
+class Animation
+
+       # Frames composing this animation
+       #
+       # All frames must share the same `Texture::root`, be on a vertical or
+       # horizontal line, be spaced equally and share the same dimensions.
+       var frames: SequenceRead[Texture]
+
+       # Frames per seconds, a higher value makes this animation faster
+       #
+       # The animation speed is also affected by `SpriteSet::time_mod`.
+       var fps: Float
+
+       # Are the `frames` valid for an animation? (see the requirements in `frames`)
+       var valid: Bool is lazy do
+               var r: nullable RootTexture = null
+               for f in frames do
+                       if r == null then
+                               r = f.root
+                       else
+                               if r != f.root then return false
+                       end
+               end
+
+               # TODO check for line, constant distance, and same aspect ratio.
+
+               return true
+       end
+end
+
 redef class App
        # Default graphic program to draw `sprites`
        private var simple_2d_program = new Simple2dProgram is lazy
@@ -337,7 +430,7 @@ redef class App
 
                # Enable blending
                gl.capabilities.blend.enable
-               glBlendFunc(gl_SRC_ALPHA, gl_ONE_MINUS_SRC_ALPHA)
+               glBlendFunc(gl_ONE, gl_ONE_MINUS_SRC_ALPHA)
 
                # Enable depth test
                gl.capabilities.depth_test.enable
@@ -393,6 +486,7 @@ redef class App
                perf_clock_main.lapse
                var dt = clock.lapse.to_f
                update dt
+               frame_dt = dt
                sys.perfs["gamnit flat update client"].add perf_clock_main.lapse
 
                # Draw and flip screen
@@ -404,6 +498,8 @@ redef class App
                assert gl_error == gl_NO_ERROR else print_error gl_error
        end
 
+       private var frame_dt = 0.0
+
        # Draw the whole screen, all `glDraw...` calls should be executed here
        protected fun frame_core_draw(display: GamnitDisplay)
        do
@@ -425,6 +521,9 @@ redef class App
                simple_2d_program.use
                simple_2d_program.mvp.uniform camera.mvp_matrix
 
+               sprite_set.time += frame_dt*sprite_set.time_mod
+               simple_2d_program.time.uniform sprite_set.time
+
                # draw
                sprite_set.draw
        end
@@ -482,6 +581,34 @@ redef class Texture
                        r, b,
                        l, b]
        end
+
+       # Convert to a sprite animation at `fps` speed with `x` or `y` frames
+       #
+       # The arguments `x` and `y` set the number of frames in the texture.
+       # Use `x` for an horizontal arrangement or `y` for vertical.
+       # One and only one of the arguments must be different than 0,
+       # as an animation can only be on a line and cannot wrap.
+       fun to_animation(fps: Float, x, y: Int): Animation
+       do
+               assert (x == 0) != (y == 0)
+
+               var n_frames = x.max(y)
+               var frames = new Array[Texture]
+
+               var dx = (x/n_frames).to_f/n_frames.to_f
+               var dy = (y/n_frames).to_f/n_frames.to_f
+               var w = if x == 0 then 1.0 else dx
+               var h = if y == 0 then 1.0 else dy
+               var left = 0.0
+               var top = 0.0
+               for i in n_frames.times do
+                       frames.add new RelativeSubtexture(root, left, top, left+w, top+h)
+                       left += dx
+                       top += dy
+               end
+
+               return new Animation(frames, fps)
+       end
 end
 
 # Graphic program to display simple models with a texture, translation, rotation and scale
@@ -507,12 +634,36 @@ private class Simple2dProgram
                // Model view projection matrix
                uniform mat4 mvp;
 
+               // Current world time, in seconds
+               uniform float time;
+
                // Rotation matrix
                attribute vec4 rotation_row0;
                attribute vec4 rotation_row1;
                attribute vec4 rotation_row2;
                attribute vec4 rotation_row3;
 
+               // Animation speed, frames per seconds
+               attribute float a_fps;
+
+               // Number of frames in the animation
+               attribute float a_n_frames;
+
+               // World coordinate of the animation (for aspect ratio)
+               attribute vec2 a_coord;
+
+               // Animation texture coordinates of the first frame
+               attribute vec2 a_tex_coord;
+
+               // Animation texture coordinates difference between frames
+               attribute vec2 a_tex_diff;
+
+               // Animation start time, in reference to `time`
+               attribute float a_start;
+
+               // Number of loops to play of the animation
+               attribute float a_loops;
+
                mat4 rotation()
                {
                        return mat4(rotation_row0, rotation_row1, rotation_row2, rotation_row3);
@@ -522,11 +673,29 @@ private class Simple2dProgram
                varying vec4 v_color;
                varying vec2 v_coord;
 
+               // Is there an active animation?
+               varying float v_animated;
+
                void main()
                {
-                       gl_Position = (vec4(coord.xyz * scale, 1.0) * rotation() + translation)* mvp;
-                       v_color = color;
-                       v_coord = tex_coord;
+                       vec3 c; // coords
+
+                       float end = a_start + a_loops/a_fps*a_n_frames;
+                       if (a_loops == -1.0 || time < end) {
+                               // in animation
+                               float frame = mod(floor((time-a_start)*a_fps), a_n_frames);
+                               v_coord = a_tex_coord + a_tex_diff*frame;
+                               c = vec3(a_coord, coord.z);
+                               v_animated = 1.0;
+                       } else {
+                               // static
+                               v_coord = tex_coord;
+                               c = coord.xyz;
+                               v_animated = 0.0;
+                       }
+
+                       gl_Position = (vec4(c * scale, 1.0) * rotation() + translation)* mvp;
+                       v_color = vec4(color.rgb*color.a, color.a);
                }
                """ @ glsl_vertex_shader
 
@@ -539,13 +708,20 @@ private class Simple2dProgram
                // Texture to apply on this object
                uniform sampler2D texture0;
 
+               // Texture to apply on this object
+               uniform sampler2D animation;
+
                // Input from the vertex shader
                varying vec4 v_color;
                varying vec2 v_coord;
+               varying float v_animated;
 
                void main()
                {
-                       if(use_texture) {
+                       if (v_animated > 0.5) {
+                               gl_FragColor = v_color * texture2D(animation, v_coord);
+                               if (gl_FragColor.a <= 0.01) discard;
+                       } else if (use_texture) {
                                gl_FragColor = v_color * texture2D(texture0, v_coord);
                                if (gl_FragColor.a <= 0.01) discard;
                        } else {
@@ -589,6 +765,36 @@ private class Simple2dProgram
 
        # Model view projection matrix
        var mvp = uniforms["mvp"].as(UniformMat4) is lazy
+
+       # World time, in seconds
+       var time = uniforms["time"].as(UniformFloat) is lazy
+
+       # ---
+       # Animations
+
+       # Texture of all the frames of the animation
+       var animation_texture = uniforms["animation"].as(UniformSampler2D) is lazy
+
+       # Frame per second of the animation
+       var animation_fps = attributes["a_fps"].as(AttributeFloat) is lazy
+
+       # Number of frames in the animation
+       var animation_n_frames = attributes["a_n_frames"].as(AttributeFloat) is lazy
+
+       # Coordinates of each frame (mush be shared by all frames)
+       var animation_coord = attributes["a_coord"].as(AttributeVec2) is lazy
+
+       # Texture coordinates of the first frame
+       var animation_tex_coord = attributes["a_tex_coord"].as(AttributeVec2) is lazy
+
+       # Coordinate difference between each frame
+       var animation_tex_diff = attributes["a_tex_diff"].as(AttributeVec2) is lazy
+
+       # Animation start time, in seconds and in reference to `dt`
+       var animation_start = attributes["a_start"].as(AttributeFloat) is lazy
+
+       # Number of loops of the animation, -1 for infinite
+       var animation_loops = attributes["a_loops"].as(AttributeFloat) is lazy
 end
 
 redef class Point3d[N]
@@ -667,7 +873,7 @@ private class SpriteSet
        super HashSet[Sprite]
 
        # Map texture then static vs dynamic to a `SpriteContext`
-       var contexts_map = new HashMap2[RootTexture, Bool, SpriteContext]
+       var contexts_map = new HashMap3[RootTexture, nullable RootTexture, Bool, Array[SpriteContext]]
 
        # Contexts in `contexts_map`
        var contexts_items = new Array[SpriteContext]
@@ -675,27 +881,59 @@ private class SpriteSet
        # Sprites needing resorting in `contexts_map`
        var sprites_to_remap = new Array[Sprite]
 
+       # Animation speed multiplier (0.0 to pause, 1.0 for normal speed, etc.)
+       var time_mod = 1.0 is writable
+
+       # Seconds elapsed since the launch of the program, in world time responding to `time_mod`
+       var time = 0.0
+
        # Add a sprite to the appropriate context
        fun map_sprite(sprite: Sprite)
        do
                assert sprite.context == null else print_error "Sprite {sprite} belongs to another SpriteSet"
 
+               # Sort by texture and animation texture
                var texture = sprite.texture.root
-               var context = contexts_map[texture, sprite.static]
+               var animation = sprite.animation
+               var animation_texture = if animation != null then
+                       animation.frames.first.root else null
+               var contexts = contexts_map[texture, animation_texture, sprite.static]
+
+               var context = null
+               if contexts != null then
+                       for c in contexts.reverse_iterator do
+                               var size = c.sprites.length + 1
+                               if size * 4 <= 0xffff then
+                                       context = c
+                                       break
+                               end
+                       end
+               end
 
                if context == null then
                        var usage = if sprite.static then gl_STATIC_DRAW else gl_DYNAMIC_DRAW
-                       context = new SpriteContext(texture, usage)
+                       context = new SpriteContext(texture, animation_texture, usage)
 
-                       contexts_map[texture, sprite.static] = context
+                       if contexts == null then
+                               contexts = new Array[SpriteContext]
+                               contexts_map[texture, animation_texture, sprite.static] = contexts
+                       end
+
+                       contexts.add context
                        contexts_items.add context
                end
 
                context.sprites.add sprite
                context.sprites_to_update.add sprite
+               context.last_sprite_to_update = sprite
 
                sprite.context = context
                sprite.sprite_set = self
+
+               if animation != null and sprite.animation_start == -1.0 then
+                       # Start animation
+                       sprite.animation_start = time
+               end
        end
 
        # Remove a sprite from its context
@@ -764,15 +1002,21 @@ private class SpriteContext
        # Only root texture drawn by this context
        var texture: nullable RootTexture
 
+       # Only animation texture drawn by this context
+       var animation_texture: nullable RootTexture
+
        # OpenGL ES usage of `buffer_array` and `buffer_element`
        var usage: GLBufferUsage
 
        # Sprites drawn by this context
-       var sprites = new GroupedArray[Sprite]
+       var sprites = new GroupedSprites
 
        # Sprites to update since last `draw`
        var sprites_to_update = new Set[Sprite]
 
+       # Cache of the last `Sprite` added to `sprites_to_update` since the last call to `draw`
+       var last_sprite_to_update: nullable Sprite = null
+
        # Sprites that have been update and for which `needs_update` can be set to false
        var updated_sprites = new Array[Sprite]
 
@@ -802,10 +1046,11 @@ private class SpriteContext
 
        # Number of GL_FLOAT per vertex of `Simple2dProgram`
        var float_per_vertex: Int is lazy do
-               # vec4 translation, vec4 color, vec4 coord,
-               # float scale, vec2 tex_coord, vec4 rotation_row*
-               return 4 + 4 + 4 +
-                      1 + 2 + 4*4
+               return 4 + 4 + 4 +   # vec4 translation, vec4 color, vec4 coord,
+                      1 + 2 + 4*4 + # float scale, vec2 tex_coord, vec4 rotation_row*,
+                      1 + 1 +       # float a_fps, float a_n_frames,
+                      2 + 2 + 2 +   # vec2 a_coord, vec2 a_tex_coord, vec2 a_tex_diff,
+                      1 + 1         # float a_start, float a_loops
        end
 
        # Number of bytes per vertex of `Simple2dProgram`
@@ -878,8 +1123,11 @@ private class SpriteContext
        # Update GPU data of `sprite`
        fun update_sprite(sprite: Sprite)
        do
-               var sprite_index = sprites.index_of(sprite)
-               if sprite_index == -1 then return
+               var context = sprite.context
+               if context != self then return
+
+               var sprite_index = sprite.context_index
+               assert sprite_index != -1
 
                # Vertices data
 
@@ -927,6 +1175,40 @@ private class SpriteContext
                        end
                        data.fill_from_matrix(rot, o+15)
 
+                       var animation = sprite.animation
+                       if animation == null then
+                               for i in [31..40] do data[o+i] = 0.0
+                       else
+                               # a_fps
+                               data[o+31] = animation.fps
+
+                               # a_n_frames
+                               data[o+32] = animation.frames.length.to_f
+
+                               # a_coord
+                               data[o+33] = animation.frames.first.vertices[v*3+0]
+                               data[o+34] = animation.frames.first.vertices[v*3+1]
+
+                               # a_tex_coord
+                               var tc = if sprite.invert_x then
+                                               animation.frames.first.texture_coords_invert_x
+                                       else animation.frames.first.texture_coords
+                               data[o+35] = tc[v*2]
+                               data[o+36] = tc[v*2+1]
+
+                               # a_tex_diff
+                               var dx = animation.frames[1].texture_coords[0] - animation.frames[0].texture_coords[0]
+                               var dy = animation.frames[1].texture_coords[1] - animation.frames[0].texture_coords[1]
+                               data[o+37] = dx
+                               data[o+38] = dy
+
+                               # a_start
+                               data[o+39] = sprite.animation_start
+
+                               # a_loops
+                               data[o+40] = sprite.animation_loops
+                       end
+
                        o += float_per_vertex
                end
 
@@ -977,6 +1259,7 @@ private class SpriteContext
                glBindBuffer(gl_ELEMENT_ARRAY_BUFFER, buffer_element)
 
                # Resize GPU buffers?
+               var update_everything = false
                if sprites.capacity > buffer_capacity then
                        # Try to defragment first
                        var moved = sprites.defragment
@@ -986,6 +1269,7 @@ private class SpriteContext
                                resize
 
                                # We must update everything
+                               update_everything = true
                                for s in sprites.items do if s != null then sprites_to_update.add s
                        else
                                # Just update the moved sprites
@@ -999,11 +1283,19 @@ private class SpriteContext
                end
 
                # Update GPU sprites data
-               if sprites_to_update.not_empty then
+               if sprites_to_update.not_empty or update_everything then
                        app.perf_clock_sprites.lapse
 
-                       for sprite in sprites_to_update do update_sprite(sprite)
+                       if update_everything then
+                               for sprite in sprites.items do if sprite != null then
+                                       update_sprite(sprite)
+                               end
+                       else
+                               for sprite in sprites_to_update do update_sprite(sprite)
+                       end
+
                        sprites_to_update.clear
+                       last_sprite_to_update = null
 
                        sys.perfs["gamnit flat gpu update"].add app.perf_clock_sprites.lapse
                end
@@ -1019,8 +1311,19 @@ private class SpriteContext
                var gl_error = glGetError
                assert gl_error == gl_NO_ERROR else print_error gl_error
 
+               var animation = animation_texture
+               if animation != null then
+                       glActiveTexture gl_TEXTURE1
+                       glBindTexture(gl_TEXTURE_2D, animation.gl_texture)
+                       app.simple_2d_program.animation_texture.uniform 1
+               end
+               gl_error = glGetError
+               assert gl_error == gl_NO_ERROR else print_error gl_error
+
                # Configure attributes, in order:
-               # vec4 translation, vec4 color, float scale, vec4 coord, vec2 tex_coord, vec4 rotation_row*
+               # vec4 translation, vec4 color, float scale, vec4 coord, vec2 tex_coord, vec4 rotation_row*,
+               # a_fps, a_n_frames, a_coord, a_tex_coord, a_tex_diff, a_start, a_loops
+
                var offset = 0
                var p = app.simple_2d_program
                var sizeof_gl_float = 4 # sizeof(GL_FLOAT)
@@ -1071,6 +1374,55 @@ private class SpriteContext
                        assert gl_error == gl_NO_ERROR else print_error gl_error
                end
 
+               size = 1
+               glEnableVertexAttribArray p.animation_fps.location
+               glVertexAttribPointeri(p.animation_fps.location, size, gl_FLOAT, false, bytes_per_vertex, offset)
+               offset += size * sizeof_gl_float
+               gl_error = glGetError
+               assert gl_error == gl_NO_ERROR else print_error gl_error
+
+               size = 1
+               glEnableVertexAttribArray p.animation_n_frames.location
+               glVertexAttribPointeri(p.animation_n_frames.location, size, gl_FLOAT, false, bytes_per_vertex, offset)
+               offset += size * sizeof_gl_float
+               gl_error = glGetError
+               assert gl_error == gl_NO_ERROR else print_error gl_error
+
+               size = 2
+               glEnableVertexAttribArray p.animation_coord.location
+               glVertexAttribPointeri(p.animation_coord.location, size, gl_FLOAT, false, bytes_per_vertex, offset)
+               offset += size * sizeof_gl_float
+               gl_error = glGetError
+               assert gl_error == gl_NO_ERROR else print_error gl_error
+
+               size = 2
+               glEnableVertexAttribArray p.animation_tex_coord.location
+               glVertexAttribPointeri(p.animation_tex_coord.location, size, gl_FLOAT, false, bytes_per_vertex, offset)
+               offset += size * sizeof_gl_float
+               gl_error = glGetError
+               assert gl_error == gl_NO_ERROR else print_error gl_error
+
+               size = 2
+               glEnableVertexAttribArray p.animation_tex_diff.location
+               glVertexAttribPointeri(p.animation_tex_diff.location, size, gl_FLOAT, false, bytes_per_vertex, offset)
+               offset += size * sizeof_gl_float
+               gl_error = glGetError
+               assert gl_error == gl_NO_ERROR else print_error gl_error
+
+               size = 1
+               glEnableVertexAttribArray p.animation_start.location
+               glVertexAttribPointeri(p.animation_start.location, size, gl_FLOAT, false, bytes_per_vertex, offset)
+               offset += size * sizeof_gl_float
+               gl_error = glGetError
+               assert gl_error == gl_NO_ERROR else print_error gl_error
+
+               size = 1
+               glEnableVertexAttribArray p.animation_loops.location
+               glVertexAttribPointeri(p.animation_loops.location, size, gl_FLOAT, false, bytes_per_vertex, offset)
+               offset += size * sizeof_gl_float
+               gl_error = glGetError
+               assert gl_error == gl_NO_ERROR else print_error gl_error
+
                # Actual draw
                for s in sprites.starts, e in sprites.ends do
                        var l = e-s
@@ -1169,9 +1521,6 @@ private class GroupedArray[E]
        # Number of item slots in the array
        fun capacity: Int do return items.length
 
-       # Index of `item`
-       fun index_of(item: E): Int do return items.index_of(item)
-
        # List of available slots
        var available = new MinHeap[Int].default
 
@@ -1181,8 +1530,8 @@ private class GroupedArray[E]
        # Index of the spots after filled chunks
        var ends = new List[Int]
 
-       # Add `item` to the first available slot
-       fun add(item: E)
+       # Add `item` to the first available slot and return its index
+       fun add(item: E): Int
        do
                length += 1
 
@@ -1207,7 +1556,7 @@ private class GroupedArray[E]
                                # at end of first chunk
                                ends.first += 1
                        end
-                       return
+                       return i
                end
 
                items.add item
@@ -1215,13 +1564,20 @@ private class GroupedArray[E]
                        starts.add 0
                        ends.add 1
                else ends.last += 1
+               return ends.last - 1
        end
 
        # Remove the first instance of `item`
        fun remove(item: E)
        do
-               var i = items.index_of(item)
-               assert i != -1
+               var index = items.index_of(item)
+               remove_at(item, index)
+       end
+
+       # Remove `item` at `index`
+       fun remove_at(item: E, index: Int)
+       do
+               var i = index
                length -= 1
                items[i] = null
 
@@ -1296,6 +1652,7 @@ private class GroupedArray[E]
                while max > 0 and (starts.length > 1 or starts.first != 0) do
                        var i = ends.last - 1
                        var e = items[i]
+                       assert e != null
                        remove e
                        add e
                        moved.add e
@@ -1328,6 +1685,20 @@ private class GroupedArray[E]
        end
 end
 
+# Optimized `GroupedArray` to use `Sprite::context_index` and avoid using `index_of`
+private class GroupedSprites
+       super GroupedArray[Sprite]
+
+       redef fun add(item)
+       do
+               var index = super
+               item.context_index = index
+               return index
+       end
+
+       redef fun remove(item) do remove_at(item, item.context_index)
+end
+
 redef class GLfloatArray
        private fun fill_from_matrix(matrix: Matrix, dst_offset: nullable Int)
        do
index 4bc95cb..4fb98ac 100644 (file)
@@ -80,9 +80,7 @@ abstract class Texture
        # Prepare a subtexture from this texture, from the given pixel offsets
        fun subtexture(left, top, width, height: Numeric): Subtexture
        do
-               # Setup the subtexture
-               var subtex = new Subtexture(root, self, left.to_f, top.to_f, width.to_f, height.to_f)
-               return subtex
+               return new AbsoluteSubtexture(self, left.to_f, top.to_f, width.to_f, height.to_f)
        end
 
        # Offset of the left border on `root` from 0.0 to 1.0
@@ -210,7 +208,7 @@ class CustomTexture
        end
 end
 
-# Texture with its own pixels
+# Texture with its own pixel data
 class RootTexture
        super Texture
 
@@ -223,6 +221,18 @@ class RootTexture
 
        init do all_root_textures.add self
 
+       # Should the pixels RGB values be premultiplied by their alpha value at loading?
+       #
+       # All gamnit textures must have premultiplied alpha, it provides a better
+       # alpha blending, avoids artifacts and allows for additive blending.
+       #
+       # When at `true`, the default, pixels RGB values are premultiplied
+       # at loading. Set to `false` if pixels RGB values are already
+       # premultiplied in the source data.
+       #
+       # This value must be set before calling `load`.
+       var premultiply_alpha = true is writable
+
        private fun load_from_pixels(pixels: Pointer, width, height: Int, format: GLPixelFormat)
        do
                var max_texture_size = glGetIntegerv(gl_MAX_TEXTURE_SIZE, 0)
@@ -231,6 +241,11 @@ class RootTexture
                        return
                end
 
+               # Premultiply alpha?
+               if premultiply_alpha and format == gl_RGBA then
+                       pixels.premultiply_alpha(width, height)
+               end
+
                glPixelStorei(gl_UNPACK_ALIGNEMENT, 1)
                var tex = glGenTextures(1)[0]
                gl_texture = tex
@@ -240,6 +255,9 @@ class RootTexture
 
                glHint(gl_GENERATE_MIPMAP_HINT, gl_NICEST)
                glGenerateMipmap(gl_TEXTURE_2D)
+               glTexParameteri(gl_TEXTURE_2D, gl_TEXTURE_MIN_FILTER, gl_LINEAR_MIPMAP_LINEAR)
+
+               glBindTexture(gl_TEXTURE_2D, 0)
        end
 
        private fun load_checker(size: Int)
@@ -309,18 +327,25 @@ class TextureAsset
 end
 
 # Texture derived from another texture, does not own its pixels
-class Subtexture
+abstract class Subtexture
        super Texture
 
-       redef var root
-
        # Parent texture, from which this texture was created
        var parent: Texture
 
-       # Left border of this texture compared to `parent`
+       redef var root = parent.root is lateinit
+
+       redef fun load(force) do root.load(force)
+end
+
+# Subtexture created from pixel coordinates within `parent`
+class AbsoluteSubtexture
+       super Subtexture
+
+       # Left border of this texture relative to `parent`
        var left: Float
 
-       # Top border of this texture compared to `parent`
+       # Top border of this texture relative to `parent`
        var top: Float
 
        private fun set_wh(width, height: Float)
@@ -329,14 +354,25 @@ class Subtexture
                self.height = height
        end
 
-       redef fun load(force) do root.load(force)
-
        redef var offset_left = parent.offset_left + left / root.width is lazy
        redef var offset_top = parent.offset_top + top / root.height is lazy
        redef var offset_right = offset_left + width / root.width is lazy
        redef var offset_bottom = offset_top + height / root.height is lazy
 end
 
+# Subtexture created from relative coordinates ([0..1]) out of the `root` texture
+class RelativeSubtexture
+       super Subtexture
+
+       redef var offset_left
+       redef var offset_top
+       redef var offset_right
+       redef var offset_bottom
+
+       redef fun width do return root.width * (offset_right - offset_left)
+       redef fun height do return root.height * (offset_bottom - offset_top)
+end
+
 redef class Sys
        # All declared root textures
        var all_root_textures = new TextureSet
@@ -349,3 +385,20 @@ class TextureSet
        # Load all texture of this set
        fun load_all do for t in self do t.load
 end
+
+redef class Pointer
+       # Multiply RBG values by their alpha value
+       private fun premultiply_alpha(width, height: Int) `{
+               uint8_t *bytes = (uint8_t *)self;
+               int x, y, i = 0;
+               for(y = 0; y < height; y ++) {
+                       for(x = 0; x < width; x ++) {
+                               int a = bytes[i+3];
+                               bytes[i  ] = bytes[i  ] * a / 255;
+                               bytes[i+1] = bytes[i+1] * a / 255;
+                               bytes[i+2] = bytes[i+2] * a / 255;
+                               i += 4;
+                       }
+               }
+       `}
+end
index d512462..665ecdb 100644 (file)
@@ -290,7 +290,7 @@ class Neo4jClient
 
                # Build the query.
                var buffer = new Buffer
-               buffer.append "match n where \{label_0\} in labels(n)"
+               buffer.append "match (n) where \{label_0\} in labels(n)"
                for i in [1..labels.length[ do
                        buffer.append " and \{label_{i}\} in labels(n)"
                end
index ee34149..3d795c2 100644 (file)
@@ -1,6 +1,6 @@
 # This is a basic install of Nit on a debian base.
 
-FROM debian:jessie
+FROM debian:stretch
 MAINTAINER Jean Privat <jean@pryen.org>
 
 # Install dependencies
index e6bfe66..eb7f26d 100644 (file)
@@ -14,8 +14,10 @@ RUN dpkg --add-architecture i386 \
                libgles1-mesa-dev \
                libgles2-mesa-dev \
                libgtk-3-dev \
+               libgmp-dev \
                libncurses5-dev \
                libpq-dev \
+               libreadline-dev \
                libsdl-image1.2-dev \
                libsdl-ttf2.0-dev \
                libsdl1.2-dev \
@@ -29,6 +31,7 @@ RUN dpkg --add-architecture i386 \
                # Packages needed for contrib, platforms and FFI
                ant \
                clang \
+               cmake \
                default-jdk \
                file \
                inkscape \
@@ -50,15 +53,27 @@ RUN mkdir -p /opt \
        && rm android-sdk-linux.tgz \
        && echo y | android-sdk-linux/tools/android update sdk -a --no-ui --filter \
                # Hardcode minimal known working things
-               platform-tools,build-tools-22.0.1,android-22,android-10 \
+               platform-tools,build-tools-22.0.1,android-22,android-21,android-19,android-16,android-15,android-10 \
        # Android NDK
        && curl http://dl.google.com/android/repository/android-ndk-r11c-linux-x86_64.zip -o android-ndk.zip \
        && unzip -q android-ndk.zip \
+       && chmod -R a+X /opt \
        && ln -s android-ndk-r11c android-ndk \
        && rm android-ndk.zip \
        && printf "PATH=$PATH:$ANDROID_HOME/tools:$ANDROID_HOME/platform-tools:$ANDROID_NDK\nexport PATH\n" >> "/etc/profile.d/android.sh"
 
+# Install OpenGL validator
+RUN git clone https://github.com/KhronosGroup/glslang.git \
+       && mkdir -p glslang/build \
+       && cd glslang/build \
+       && cmake .. \
+       && make \
+       && make
+
 # Setup environment variables
 ENV ANDROID_HOME /opt/android-sdk-linux
 ENV ANDROID_NDK /opt/android-ndk
 ENV PATH $PATH:$ANDROID_HOME/tools:$ANDROID_HOME/platform-tools:$ANDROID_NDK
+ENV JAVA_HOME=/usr/lib/jvm/default-java/
+ENV JNI_LIB_PATH=$JAVA_HOME/jre/lib/amd64/server/
+ENV LD_LIBRARY_PATH=$JAVA_HOME/jre/lib/amd64/server/