Browse Source

chore: initial commit with sensible .gitignore

Generated using
https://www.toptal.com/developers/gitignore/api/sbt,playframework

and also ignored the game sprites / other UI images
main
Rob Hallam 9 months ago
commit
29a425de45
100 changed files with 57558 additions and 0 deletions
  1. +665
    -0
      .classpath
  2. +36
    -0
      .gitignore
  3. +13
    -0
      .project
  4. +3
    -0
      .settings/org.eclipse.core.resources.prefs
  5. +6
    -0
      .settings/org.scala-ide.sdt.core.prefs
  6. +116
    -0
      LICENSE
  7. +8
    -0
      NOTICE
  8. +2
    -0
      README.md
  9. +121
    -0
      app/actors/GameActor.java
  10. +1038
    -0
      app/assets/js/cardgame.js
  11. +2304
    -0
      app/assets/js/core.js
  12. +1
    -0
      app/assets/js/core.js.map
  13. +40422
    -0
      app/assets/js/hexi.js
  14. +18
    -0
      app/assets/js/hexi.min.js
  15. +1
    -0
      app/assets/js/jquery.3.4.1.js
  16. +9082
    -0
      app/assets/js/modules.js
  17. +22
    -0
      app/assets/js/pixi.min.js
  18. +417
    -0
      app/commands/BasicCommands.java
  19. +14
    -0
      app/commands/CheckMessageIsNotNullOnTell.java
  20. +19
    -0
      app/commands/DummyTell.java
  21. +60
    -0
      app/controllers/GameScreenController.java
  22. +242
    -0
      app/demo/CommandDemo.java
  23. +149
    -0
      app/demo/Loaders_2024_Check.java
  24. +31
    -0
      app/events/CardClicked.java
  25. +26
    -0
      app/events/EndTurnClicked.java
  26. +27
    -0
      app/events/EventProcessor.java
  27. +28
    -0
      app/events/Heartbeat.java
  28. +38
    -0
      app/events/Initalize.java
  29. +29
    -0
      app/events/OtherClicked.java
  30. +37
    -0
      app/events/TileClicked.java
  31. +29
    -0
      app/events/UnitMoving.java
  32. +30
    -0
      app/events/UnitStopped.java
  33. +17
    -0
      app/structures/GameState.java
  34. +39
    -0
      app/structures/User.java
  35. +39
    -0
      app/structures/basic/BetterUnit.java
  36. +62
    -0
      app/structures/basic/BigCard.java
  37. +89
    -0
      app/structures/basic/Card.java
  38. +49
    -0
      app/structures/basic/EffectAnimation.java
  39. +115
    -0
      app/structures/basic/ImageCorrection.java
  40. +68
    -0
      app/structures/basic/MiniCard.java
  41. +40
    -0
      app/structures/basic/Player.java
  42. +57
    -0
      app/structures/basic/Position.java
  43. +119
    -0
      app/structures/basic/Tile.java
  44. +111
    -0
      app/structures/basic/Unit.java
  45. +57
    -0
      app/structures/basic/UnitAnimation.java
  46. +95
    -0
      app/structures/basic/UnitAnimationSet.java
  47. +19
    -0
      app/structures/basic/UnitAnimationType.java
  48. +223
    -0
      app/utils/BasicObjectBuilders.java
  49. +85
    -0
      app/utils/ImageListForPreLoad.java
  50. +63
    -0
      app/utils/OrderedCardLoader.java
  51. +30
    -0
      app/utils/StaticConfFiles.java
  52. +161
    -0
      app/views/gamescreen.scala.html
  53. +32
    -0
      build.sbt
  54. +38
    -0
      conf/application.conf
  55. +1
    -0
      conf/gameconfs/avatars/avatar1.json
  56. +1
    -0
      conf/gameconfs/avatars/avatar2.json
  57. +28
    -0
      conf/gameconfs/cards/1_1_c_u_bad_omen.json
  58. +46
    -0
      conf/gameconfs/cards/1_2_c_s_hornoftheforsaken.json
  59. +29
    -0
      conf/gameconfs/cards/1_3_c_u_gloom_chaser.json
  60. +28
    -0
      conf/gameconfs/cards/1_4_c_u_shadow_watcher.json
  61. +37
    -0
      conf/gameconfs/cards/1_5_c_s_wraithling_swarm.json
  62. +29
    -0
      conf/gameconfs/cards/1_6_c_u_nightsorrow_assassin.json
  63. +28
    -0
      conf/gameconfs/cards/1_7_c_u_rock_pulveriser.json
  64. +38
    -0
      conf/gameconfs/cards/1_8_c_s_dark_terminus.json
  65. +29
    -0
      conf/gameconfs/cards/1_9_c_u_bloodmoon_priestess.json
  66. +27
    -0
      conf/gameconfs/cards/1_a1_c_u_shadowdancer.json
  67. +24
    -0
      conf/gameconfs/cards/2_1_c_u_skyrock_golem.json
  68. +26
    -0
      conf/gameconfs/cards/2_2_c_u_swamp_entangler.json
  69. +30
    -0
      conf/gameconfs/cards/2_3_c_u_silverguard_knight.json
  70. +24
    -0
      conf/gameconfs/cards/2_4_c_u_saberspine_tiger.json
  71. +36
    -0
      conf/gameconfs/cards/2_5_c_s_beamshock.json
  72. +24
    -0
      conf/gameconfs/cards/2_6_c_u_young_flamewing.json
  73. +27
    -0
      conf/gameconfs/cards/2_7_c_u_silverguard_squire.json
  74. +28
    -0
      conf/gameconfs/cards/2_8_c_u_ironcliff_guardian.json
  75. +33
    -0
      conf/gameconfs/cards/2_9_c_s_sundrop_elixir.json
  76. +46
    -0
      conf/gameconfs/cards/2_a1_c_s_truestrike.json
  77. +28
    -0
      conf/gameconfs/effects/f1_buff.json
  78. +38
    -0
      conf/gameconfs/effects/f1_inmolation.json
  79. +34
    -0
      conf/gameconfs/effects/f1_martyrdom.json
  80. +29
    -0
      conf/gameconfs/effects/f1_projectiles.json
  81. +36
    -0
      conf/gameconfs/effects/f1_soulshatter.json
  82. +25
    -0
      conf/gameconfs/effects/f1_summon.json
  83. +36
    -0
      conf/gameconfs/effects/f1_wraithsummon.json
  84. +36
    -0
      conf/gameconfs/f1_soulshatter.json
  85. +8
    -0
      conf/gameconfs/grid.json
  86. +13
    -0
      conf/gameconfs/tile.json
  87. +1
    -0
      conf/gameconfs/units/bad_omen.json
  88. +1
    -0
      conf/gameconfs/units/bloodmoon_priestess.json
  89. +1
    -0
      conf/gameconfs/units/gloom_chaser.json
  90. +1
    -0
      conf/gameconfs/units/ironcliff_guardian.json
  91. +1
    -0
      conf/gameconfs/units/nightsorrow_assassin.json
  92. +1
    -0
      conf/gameconfs/units/rock_pulveriser.json
  93. +1
    -0
      conf/gameconfs/units/saberspine_tiger.json
  94. +1
    -0
      conf/gameconfs/units/shadow_watcher.json
  95. +1
    -0
      conf/gameconfs/units/shadowdancer.json
  96. +1
    -0
      conf/gameconfs/units/silverguard_knight.json
  97. +1
    -0
      conf/gameconfs/units/silverguard_squire.json
  98. +1
    -0
      conf/gameconfs/units/skyrock_golem.json
  99. +1
    -0
      conf/gameconfs/units/swamp_entangler.json
  100. +1
    -0
      conf/gameconfs/units/wraithling.json

+ 665
- 0
.classpath View File

@@ -0,0 +1,665 @@
<classpath>
<classpathentry kind="src" path="app"/>
<classpathentry kind="src" path="conf"/>
<classpathentry kind="src" path="target\scala-2.13\twirl\main"/>
<classpathentry kind="src" path="target\scala-2.13\routes\main"/>
<classpathentry excluding="resources\" kind="src" path="test"/>
<classpathentry sourcepath=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\net\sourceforge\htmlunit\htmlunit-core-js\2.36.0\htmlunit-core-js-2.36.0-sources.jar" kind="lib" path=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\net\sourceforge\htmlunit\htmlunit-core-js\2.36.0\htmlunit-core-js-2.36.0.jar">
<attributes>
<attribute name="javadoc_location" value="jar:file:.\null\Coursier\cache\v1\https\repo1.maven.org\maven2\net\sourceforge\htmlunit\htmlunit-core-js\2.36.0\htmlunit-core-js-2.36.0-javadoc.jar!/"/>
</attributes>
</classpathentry>
<classpathentry sourcepath=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\org\scala-sbt\test-interface\1.0\test-interface-1.0-sources.jar" kind="lib" path=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\org\scala-sbt\test-interface\1.0\test-interface-1.0.jar">
<attributes>
<attribute name="javadoc_location" value="jar:file:.\null\Coursier\cache\v1\https\repo1.maven.org\maven2\org\scala-sbt\test-interface\1.0\test-interface-1.0-javadoc.jar!/"/>
</attributes>
</classpathentry>
<classpathentry sourcepath=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\com\typesafe\play\play-ahc-ws_2.13\2.8.1\play-ahc-ws_2.13-2.8.1-sources.jar" kind="lib" path=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\com\typesafe\play\play-ahc-ws_2.13\2.8.1\play-ahc-ws_2.13-2.8.1.jar">
<attributes>
<attribute name="javadoc_location" value="jar:file:.\null\Coursier\cache\v1\https\repo1.maven.org\maven2\com\typesafe\play\play-ahc-ws_2.13\2.8.1\play-ahc-ws_2.13-2.8.1-javadoc.jar!/"/>
</attributes>
</classpathentry>
<classpathentry sourcepath=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\com\google\errorprone\error_prone_annotations\2.3.2\error_prone_annotations-2.3.2-sources.jar" kind="lib" path=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\com\google\errorprone\error_prone_annotations\2.3.2\error_prone_annotations-2.3.2.jar">
<attributes>
<attribute name="javadoc_location" value="jar:file:.\null\Coursier\cache\v1\https\repo1.maven.org\maven2\com\google\errorprone\error_prone_annotations\2.3.2\error_prone_annotations-2.3.2-javadoc.jar!/"/>
</attributes>
</classpathentry>
<classpathentry sourcepath=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\commons-codec\commons-codec\1.6\commons-codec-1.6-sources.jar" kind="lib" path=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\commons-codec\commons-codec\1.6\commons-codec-1.6.jar">
<attributes>
<attribute name="javadoc_location" value="jar:file:.\null\Coursier\cache\v1\https\repo1.maven.org\maven2\commons-codec\commons-codec\1.6\commons-codec-1.6-javadoc.jar!/"/>
</attributes>
</classpathentry>
<classpathentry sourcepath=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\org\apache\commons\commons-lang3\3.9\commons-lang3-3.9-sources.jar" kind="lib" path=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\org\apache\commons\commons-lang3\3.9\commons-lang3-3.9.jar">
<attributes>
<attribute name="javadoc_location" value="jar:file:.\null\Coursier\cache\v1\https\repo1.maven.org\maven2\org\apache\commons\commons-lang3\3.9\commons-lang3-3.9-javadoc.jar!/"/>
</attributes>
</classpathentry>
<classpathentry sourcepath=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\org\jboss\logging\jboss-logging\3.3.2.Final\jboss-logging-3.3.2.Final-sources.jar" kind="lib" path=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\org\jboss\logging\jboss-logging\3.3.2.Final\jboss-logging-3.3.2.Final.jar">
<attributes>
<attribute name="javadoc_location" value="jar:file:.\null\Coursier\cache\v1\https\repo1.maven.org\maven2\org\jboss\logging\jboss-logging\3.3.2.Final\jboss-logging-3.3.2.Final-javadoc.jar!/"/>
</attributes>
</classpathentry>
<classpathentry sourcepath=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\javax\inject\javax.inject\1\javax.inject-1-sources.jar" kind="lib" path=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\javax\inject\javax.inject\1\javax.inject-1.jar">
<attributes>
<attribute name="javadoc_location" value="jar:file:.\null\Coursier\cache\v1\https\repo1.maven.org\maven2\javax\inject\javax.inject\1\javax.inject-1-javadoc.jar!/"/>
</attributes>
</classpathentry>
<classpathentry sourcepath=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\org\scala-lang\modules\scala-xml_2.13\1.2.0\scala-xml_2.13-1.2.0-sources.jar" kind="lib" path=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\org\scala-lang\modules\scala-xml_2.13\1.2.0\scala-xml_2.13-1.2.0.jar">
<attributes>
<attribute name="javadoc_location" value="jar:file:.\null\Coursier\cache\v1\https\repo1.maven.org\maven2\org\scala-lang\modules\scala-xml_2.13\1.2.0\scala-xml_2.13-1.2.0-javadoc.jar!/"/>
</attributes>
</classpathentry>
<classpathentry sourcepath=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\org\springframework\spring-core\5.2.2.RELEASE\spring-core-5.2.2.RELEASE-sources.jar" kind="lib" path=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\org\springframework\spring-core\5.2.2.RELEASE\spring-core-5.2.2.RELEASE.jar">
<attributes>
<attribute name="javadoc_location" value="jar:file:.\null\Coursier\cache\v1\https\repo1.maven.org\maven2\org\springframework\spring-core\5.2.2.RELEASE\spring-core-5.2.2.RELEASE-javadoc.jar!/"/>
</attributes>
</classpathentry>
<classpathentry sourcepath=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\org\seleniumhq\selenium\selenium-firefox-driver\3.141.59\selenium-firefox-driver-3.141.59-sources.jar" kind="lib" path=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\org\seleniumhq\selenium\selenium-firefox-driver\3.141.59\selenium-firefox-driver-3.141.59.jar">
<attributes>
<attribute name="javadoc_location" value="jar:file:.\null\Coursier\cache\v1\https\repo1.maven.org\maven2\org\seleniumhq\selenium\selenium-firefox-driver\3.141.59\selenium-firefox-driver-3.141.59-javadoc.jar!/"/>
</attributes>
</classpathentry>
<classpathentry sourcepath=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\com\typesafe\config\1.4.0\config-1.4.0-sources.jar" kind="lib" path=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\com\typesafe\config\1.4.0\config-1.4.0.jar">
<attributes>
<attribute name="javadoc_location" value="jar:file:.\null\Coursier\cache\v1\https\repo1.maven.org\maven2\com\typesafe\config\1.4.0\config-1.4.0-javadoc.jar!/"/>
</attributes>
</classpathentry>
<classpathentry sourcepath=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\com\typesafe\play\play-ws_2.13\2.8.1\play-ws_2.13-2.8.1-sources.jar" kind="lib" path=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\com\typesafe\play\play-ws_2.13\2.8.1\play-ws_2.13-2.8.1.jar">
<attributes>
<attribute name="javadoc_location" value="jar:file:.\null\Coursier\cache\v1\https\repo1.maven.org\maven2\com\typesafe\play\play-ws_2.13\2.8.1\play-ws_2.13-2.8.1-javadoc.jar!/"/>
</attributes>
</classpathentry>
<classpathentry sourcepath=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\jakarta\validation\jakarta.validation-api\2.0.2\jakarta.validation-api-2.0.2-sources.jar" kind="lib" path=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\jakarta\validation\jakarta.validation-api\2.0.2\jakarta.validation-api-2.0.2.jar">
<attributes>
<attribute name="javadoc_location" value="jar:file:.\null\Coursier\cache\v1\https\repo1.maven.org\maven2\jakarta\validation\jakarta.validation-api\2.0.2\jakarta.validation-api-2.0.2-javadoc.jar!/"/>
</attributes>
</classpathentry>
<classpathentry sourcepath=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\org\checkerframework\checker-qual\2.8.1\checker-qual-2.8.1-sources.jar" kind="lib" path=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\org\checkerframework\checker-qual\2.8.1\checker-qual-2.8.1.jar">
<attributes>
<attribute name="javadoc_location" value="jar:file:.\null\Coursier\cache\v1\https\repo1.maven.org\maven2\org\checkerframework\checker-qual\2.8.1\checker-qual-2.8.1-javadoc.jar!/"/>
</attributes>
</classpathentry>
<classpathentry sourcepath=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\io\jsonwebtoken\jjwt\0.9.1\jjwt-0.9.1-sources.jar" kind="lib" path=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\io\jsonwebtoken\jjwt\0.9.1\jjwt-0.9.1.jar">
<attributes>
<attribute name="javadoc_location" value="jar:file:.\null\Coursier\cache\v1\https\repo1.maven.org\maven2\io\jsonwebtoken\jjwt\0.9.1\jjwt-0.9.1-javadoc.jar!/"/>
</attributes>
</classpathentry>
<classpathentry sourcepath=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\org\scala-lang\modules\scala-java8-compat_2.13\0.9.0\scala-java8-compat_2.13-0.9.0-sources.jar" kind="lib" path=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\org\scala-lang\modules\scala-java8-compat_2.13\0.9.0\scala-java8-compat_2.13-0.9.0.jar">
<attributes>
<attribute name="javadoc_location" value="jar:file:.\null\Coursier\cache\v1\https\repo1.maven.org\maven2\org\scala-lang\modules\scala-java8-compat_2.13\0.9.0\scala-java8-compat_2.13-0.9.0-javadoc.jar!/"/>
</attributes>
</classpathentry>
<classpathentry sourcepath=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\org\hibernate\validator\hibernate-validator\6.1.0.Final\hibernate-validator-6.1.0.Final-sources.jar" kind="lib" path=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\org\hibernate\validator\hibernate-validator\6.1.0.Final\hibernate-validator-6.1.0.Final.jar"/>
<classpathentry sourcepath=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\org\eclipse\jetty\websocket\websocket-api\9.4.20.v20190813\websocket-api-9.4.20.v20190813-sources.jar" kind="lib" path=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\org\eclipse\jetty\websocket\websocket-api\9.4.20.v20190813\websocket-api-9.4.20.v20190813.jar">
<attributes>
<attribute name="javadoc_location" value="jar:file:.\null\Coursier\cache\v1\https\repo1.maven.org\maven2\org\eclipse\jetty\websocket\websocket-api\9.4.20.v20190813\websocket-api-9.4.20.v20190813-javadoc.jar!/"/>
</attributes>
</classpathentry>
<classpathentry sourcepath=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\net\bytebuddy\byte-buddy\1.8.15\byte-buddy-1.8.15-sources.jar" kind="lib" path=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\net\bytebuddy\byte-buddy\1.8.15\byte-buddy-1.8.15.jar">
<attributes>
<attribute name="javadoc_location" value="jar:file:.\null\Coursier\cache\v1\https\repo1.maven.org\maven2\net\bytebuddy\byte-buddy\1.8.15\byte-buddy-1.8.15-javadoc.jar!/"/>
</attributes>
</classpathentry>
<classpathentry sourcepath=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\org\apache\httpcomponents\httpmime\4.5.9\httpmime-4.5.9-sources.jar" kind="lib" path=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\org\apache\httpcomponents\httpmime\4.5.9\httpmime-4.5.9.jar">
<attributes>
<attribute name="javadoc_location" value="jar:file:.\null\Coursier\cache\v1\https\repo1.maven.org\maven2\org\apache\httpcomponents\httpmime\4.5.9\httpmime-4.5.9-javadoc.jar!/"/>
</attributes>
</classpathentry>
<classpathentry sourcepath=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\com\typesafe\play\play-akka-http-server_2.13\2.8.1\play-akka-http-server_2.13-2.8.1-sources.jar" kind="lib" path=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\com\typesafe\play\play-akka-http-server_2.13\2.8.1\play-akka-http-server_2.13-2.8.1.jar">
<attributes>
<attribute name="javadoc_location" value="jar:file:.\null\Coursier\cache\v1\https\repo1.maven.org\maven2\com\typesafe\play\play-akka-http-server_2.13\2.8.1\play-akka-http-server_2.13-2.8.1-javadoc.jar!/"/>
</attributes>
</classpathentry>
<classpathentry kind="con" path="org.scala-ide.sdt.launching.SCALA_CONTAINER"></classpathentry>
<classpathentry sourcepath=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\com\typesafe\play\play-exceptions\2.8.1\play-exceptions-2.8.1-sources.jar" kind="lib" path=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\com\typesafe\play\play-exceptions\2.8.1\play-exceptions-2.8.1.jar">
<attributes>
<attribute name="javadoc_location" value="jar:file:.\null\Coursier\cache\v1\https\repo1.maven.org\maven2\com\typesafe\play\play-exceptions\2.8.1\play-exceptions-2.8.1-javadoc.jar!/"/>
</attributes>
</classpathentry>
<classpathentry sourcepath=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\com\typesafe\play\twirl-api_2.13\1.5.0\twirl-api_2.13-1.5.0-sources.jar" kind="lib" path=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\com\typesafe\play\twirl-api_2.13\1.5.0\twirl-api_2.13-1.5.0.jar">
<attributes>
<attribute name="javadoc_location" value="jar:file:.\null\Coursier\cache\v1\https\repo1.maven.org\maven2\com\typesafe\play\twirl-api_2.13\1.5.0\twirl-api_2.13-1.5.0-javadoc.jar!/"/>
</attributes>
</classpathentry>
<classpathentry sourcepath=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\org\webjars\webjars-play_2.13\2.8.0\webjars-play_2.13-2.8.0-sources.jar" kind="lib" path=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\org\webjars\webjars-play_2.13\2.8.0\webjars-play_2.13-2.8.0.jar">
<attributes>
<attribute name="javadoc_location" value="jar:file:.\null\Coursier\cache\v1\https\repo1.maven.org\maven2\org\webjars\webjars-play_2.13\2.8.0\webjars-play_2.13-2.8.0-javadoc.jar!/"/>
</attributes>
</classpathentry>
<classpathentry sourcepath=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\org\apache\commons\commons-text\1.7\commons-text-1.7-sources.jar" kind="lib" path=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\org\apache\commons\commons-text\1.7\commons-text-1.7.jar">
<attributes>
<attribute name="javadoc_location" value="jar:file:.\null\Coursier\cache\v1\https\repo1.maven.org\maven2\org\apache\commons\commons-text\1.7\commons-text-1.7-javadoc.jar!/"/>
</attributes>
</classpathentry>
<classpathentry sourcepath=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\net\jodah\typetools\0.5.0\typetools-0.5.0-sources.jar" kind="lib" path=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\net\jodah\typetools\0.5.0\typetools-0.5.0.jar">
<attributes>
<attribute name="javadoc_location" value="jar:file:.\null\Coursier\cache\v1\https\repo1.maven.org\maven2\net\jodah\typetools\0.5.0\typetools-0.5.0-javadoc.jar!/"/>
</attributes>
</classpathentry>
<classpathentry sourcepath=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\com\novocode\junit-interface\0.11\junit-interface-0.11-sources.jar" kind="lib" path=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\com\novocode\junit-interface\0.11\junit-interface-0.11.jar">
<attributes>
<attribute name="javadoc_location" value="jar:file:.\null\Coursier\cache\v1\https\repo1.maven.org\maven2\com\novocode\junit-interface\0.11\junit-interface-0.11-javadoc.jar!/"/>
</attributes>
</classpathentry>
<classpathentry sourcepath=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\org\scala-lang\modules\scala-parser-combinators_2.13\1.1.2\scala-parser-combinators_2.13-1.1.2-sources.jar" kind="lib" path=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\org\scala-lang\modules\scala-parser-combinators_2.13\1.1.2\scala-parser-combinators_2.13-1.1.2.jar">
<attributes>
<attribute name="javadoc_location" value="jar:file:.\null\Coursier\cache\v1\https\repo1.maven.org\maven2\org\scala-lang\modules\scala-parser-combinators_2.13\1.1.2\scala-parser-combinators_2.13-1.1.2-javadoc.jar!/"/>
</attributes>
</classpathentry>
<classpathentry sourcepath=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\commons-io\commons-io\2.1\commons-io-2.1-sources.jar" kind="lib" path=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\commons-io\commons-io\2.1\commons-io-2.1.jar">
<attributes>
<attribute name="javadoc_location" value="jar:file:.\null\Coursier\cache\v1\https\repo1.maven.org\maven2\commons-io\commons-io\2.1\commons-io-2.1-javadoc.jar!/"/>
</attributes>
</classpathentry>
<classpathentry sourcepath=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\jakarta\activation\jakarta.activation-api\1.2.1\jakarta.activation-api-1.2.1-sources.jar" kind="lib" path=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\jakarta\activation\jakarta.activation-api\1.2.1\jakarta.activation-api-1.2.1.jar">
<attributes>
<attribute name="javadoc_location" value="jar:file:.\null\Coursier\cache\v1\https\repo1.maven.org\maven2\jakarta\activation\jakarta.activation-api\1.2.1\jakarta.activation-api-1.2.1-javadoc.jar!/"/>
</attributes>
</classpathentry>
<classpathentry sourcepath=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\com\fasterxml\classmate\1.3.4\classmate-1.3.4-sources.jar" kind="lib" path=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\com\fasterxml\classmate\1.3.4\classmate-1.3.4.jar">
<attributes>
<attribute name="javadoc_location" value="jar:file:.\null\Coursier\cache\v1\https\repo1.maven.org\maven2\com\fasterxml\classmate\1.3.4\classmate-1.3.4-javadoc.jar!/"/>
</attributes>
</classpathentry>
<classpathentry sourcepath=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\org\eclipse\jetty\jetty-io\9.4.20.v20190813\jetty-io-9.4.20.v20190813-sources.jar" kind="lib" path=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\org\eclipse\jetty\jetty-io\9.4.20.v20190813\jetty-io-9.4.20.v20190813.jar">
<attributes>
<attribute name="javadoc_location" value="jar:file:.\null\Coursier\cache\v1\https\repo1.maven.org\maven2\org\eclipse\jetty\jetty-io\9.4.20.v20190813\jetty-io-9.4.20.v20190813-javadoc.jar!/"/>
</attributes>
</classpathentry>
<classpathentry sourcepath=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\com\fasterxml\jackson\module\jackson-module-paranamer\2.10.2\jackson-module-paranamer-2.10.2-sources.jar" kind="lib" path=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\com\fasterxml\jackson\module\jackson-module-paranamer\2.10.2\jackson-module-paranamer-2.10.2.jar">
<attributes>
<attribute name="javadoc_location" value="jar:file:.\null\Coursier\cache\v1\https\repo1.maven.org\maven2\com\fasterxml\jackson\module\jackson-module-paranamer\2.10.2\jackson-module-paranamer-2.10.2-javadoc.jar!/"/>
</attributes>
</classpathentry>
<classpathentry sourcepath=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\com\fasterxml\jackson\core\jackson-databind\2.10.3\jackson-databind-2.10.3-sources.jar" kind="lib" path=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\com\fasterxml\jackson\core\jackson-databind\2.10.3\jackson-databind-2.10.3.jar">
<attributes>
<attribute name="javadoc_location" value="jar:file:.\null\Coursier\cache\v1\https\repo1.maven.org\maven2\com\fasterxml\jackson\core\jackson-databind\2.10.3\jackson-databind-2.10.3-javadoc.jar!/"/>
</attributes>
</classpathentry>
<classpathentry sourcepath=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\com\typesafe\akka\akka-stream_2.13\2.6.3\akka-stream_2.13-2.6.3-sources.jar" kind="lib" path=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\com\typesafe\akka\akka-stream_2.13\2.6.3\akka-stream_2.13-2.6.3.jar">
<attributes>
<attribute name="javadoc_location" value="jar:file:.\null\Coursier\cache\v1\https\repo1.maven.org\maven2\com\typesafe\akka\akka-stream_2.13\2.6.3\akka-stream_2.13-2.6.3-javadoc.jar!/"/>
</attributes>
</classpathentry>
<classpathentry sourcepath=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\com\typesafe\play\play-ahc-ws-standalone_2.13\2.1.2\play-ahc-ws-standalone_2.13-2.1.2-sources.jar" kind="lib" path=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\com\typesafe\play\play-ahc-ws-standalone_2.13\2.1.2\play-ahc-ws-standalone_2.13-2.1.2.jar">
<attributes>
<attribute name="javadoc_location" value="jar:file:.\null\Coursier\cache\v1\https\repo1.maven.org\maven2\com\typesafe\play\play-ahc-ws-standalone_2.13\2.1.2\play-ahc-ws-standalone_2.13-2.1.2-javadoc.jar!/"/>
</attributes>
</classpathentry>
<classpathentry sourcepath=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\com\fasterxml\jackson\dataformat\jackson-dataformat-yaml\2.10.3\jackson-dataformat-yaml-2.10.3-sources.jar" kind="lib" path=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\com\fasterxml\jackson\dataformat\jackson-dataformat-yaml\2.10.3\jackson-dataformat-yaml-2.10.3.jar">
<attributes>
<attribute name="javadoc_location" value="jar:file:.\null\Coursier\cache\v1\https\repo1.maven.org\maven2\com\fasterxml\jackson\dataformat\jackson-dataformat-yaml\2.10.3\jackson-dataformat-yaml-2.10.3-javadoc.jar!/"/>
</attributes>
</classpathentry>
<classpathentry sourcepath=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\net\sourceforge\htmlunit\neko-htmlunit\2.36.0\neko-htmlunit-2.36.0-sources.jar" kind="lib" path=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\net\sourceforge\htmlunit\neko-htmlunit\2.36.0\neko-htmlunit-2.36.0.jar">
<attributes>
<attribute name="javadoc_location" value="jar:file:.\null\Coursier\cache\v1\https\repo1.maven.org\maven2\net\sourceforge\htmlunit\neko-htmlunit\2.36.0\neko-htmlunit-2.36.0-javadoc.jar!/"/>
</attributes>
</classpathentry>
<classpathentry sourcepath=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\org\hamcrest\hamcrest\2.1\hamcrest-2.1-sources.jar" kind="lib" path=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\org\hamcrest\hamcrest\2.1\hamcrest-2.1.jar">
<attributes>
<attribute name="javadoc_location" value="jar:file:.\null\Coursier\cache\v1\https\repo1.maven.org\maven2\org\hamcrest\hamcrest\2.1\hamcrest-2.1-javadoc.jar!/"/>
</attributes>
</classpathentry>
<classpathentry sourcepath=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\net\sourceforge\htmlunit\htmlunit\2.36.0\htmlunit-2.36.0-sources.jar" kind="lib" path=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\net\sourceforge\htmlunit\htmlunit\2.36.0\htmlunit-2.36.0.jar">
<attributes>
<attribute name="javadoc_location" value="jar:file:.\null\Coursier\cache\v1\https\repo1.maven.org\maven2\net\sourceforge\htmlunit\htmlunit\2.36.0\htmlunit-2.36.0-javadoc.jar!/"/>
</attributes>
</classpathentry>
<classpathentry sourcepath=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\com\typesafe\play\play_2.13\2.8.1\play_2.13-2.8.1-sources.jar" kind="lib" path=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\com\typesafe\play\play_2.13\2.8.1\play_2.13-2.8.1.jar">
<attributes>
<attribute name="javadoc_location" value="jar:file:.\null\Coursier\cache\v1\https\repo1.maven.org\maven2\com\typesafe\play\play_2.13\2.8.1\play_2.13-2.8.1-javadoc.jar!/"/>
</attributes>
</classpathentry>
<classpathentry sourcepath=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\com\typesafe\akka\akka-http-core_2.13\10.1.11\akka-http-core_2.13-10.1.11-sources.jar" kind="lib" path=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\com\typesafe\akka\akka-http-core_2.13\10.1.11\akka-http-core_2.13-10.1.11.jar">
<attributes>
<attribute name="javadoc_location" value="jar:file:.\null\Coursier\cache\v1\https\repo1.maven.org\maven2\com\typesafe\akka\akka-http-core_2.13\10.1.11\akka-http-core_2.13-10.1.11-javadoc.jar!/"/>
</attributes>
</classpathentry>
<classpathentry sourcepath=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\com\typesafe\play\play-streams_2.13\2.8.1\play-streams_2.13-2.8.1-sources.jar" kind="lib" path=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\com\typesafe\play\play-streams_2.13\2.8.1\play-streams_2.13-2.8.1.jar">
<attributes>
<attribute name="javadoc_location" value="jar:file:.\null\Coursier\cache\v1\https\repo1.maven.org\maven2\com\typesafe\play\play-streams_2.13\2.8.1\play-streams_2.13-2.8.1-javadoc.jar!/"/>
</attributes>
</classpathentry>
<classpathentry sourcepath=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\com\fasterxml\jackson\module\jackson-module-parameter-names\2.10.2\jackson-module-parameter-names-2.10.2-sources.jar" kind="lib" path=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\com\fasterxml\jackson\module\jackson-module-parameter-names\2.10.2\jackson-module-parameter-names-2.10.2.jar">
<attributes>
<attribute name="javadoc_location" value="jar:file:.\null\Coursier\cache\v1\https\repo1.maven.org\maven2\com\fasterxml\jackson\module\jackson-module-parameter-names\2.10.2\jackson-module-parameter-names-2.10.2-javadoc.jar!/"/>
</attributes>
</classpathentry>
<classpathentry sourcepath=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\ch\qos\logback\logback-classic\1.2.3\logback-classic-1.2.3-sources.jar" kind="lib" path=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\ch\qos\logback\logback-classic\1.2.3\logback-classic-1.2.3.jar">
<attributes>
<attribute name="javadoc_location" value="jar:file:.\null\Coursier\cache\v1\https\repo1.maven.org\maven2\ch\qos\logback\logback-classic\1.2.3\logback-classic-1.2.3-javadoc.jar!/"/>
</attributes>
</classpathentry>
<classpathentry sourcepath=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\com\typesafe\play\play-ws-standalone-xml_2.13\2.1.2\play-ws-standalone-xml_2.13-2.1.2-sources.jar" kind="lib" path=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\com\typesafe\play\play-ws-standalone-xml_2.13\2.1.2\play-ws-standalone-xml_2.13-2.1.2.jar">
<attributes>
<attribute name="javadoc_location" value="jar:file:.\null\Coursier\cache\v1\https\repo1.maven.org\maven2\com\typesafe\play\play-ws-standalone-xml_2.13\2.1.2\play-ws-standalone-xml_2.13-2.1.2-javadoc.jar!/"/>
</attributes>
</classpathentry>
<classpathentry sourcepath=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\io\github\classgraph\classgraph\4.8.53\classgraph-4.8.53-sources.jar" kind="lib" path=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\io\github\classgraph\classgraph\4.8.53\classgraph-4.8.53.jar">
<attributes>
<attribute name="javadoc_location" value="jar:file:.\null\Coursier\cache\v1\https\repo1.maven.org\maven2\io\github\classgraph\classgraph\4.8.53\classgraph-4.8.53-javadoc.jar!/"/>
</attributes>
</classpathentry>
<classpathentry sourcepath=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\org\apache\httpcomponents\httpcore\4.4.11\httpcore-4.4.11-sources.jar" kind="lib" path=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\org\apache\httpcomponents\httpcore\4.4.11\httpcore-4.4.11.jar">
<attributes>
<attribute name="javadoc_location" value="jar:file:.\null\Coursier\cache\v1\https\repo1.maven.org\maven2\org\apache\httpcomponents\httpcore\4.4.11\httpcore-4.4.11-javadoc.jar!/"/>
</attributes>
</classpathentry>
<classpathentry sourcepath=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\com\squareup\okio\okio\1.14.0\okio-1.14.0-sources.jar" kind="lib" path=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\com\squareup\okio\okio\1.14.0\okio-1.14.0.jar">
<attributes>
<attribute name="javadoc_location" value="jar:file:.\null\Coursier\cache\v1\https\repo1.maven.org\maven2\com\squareup\okio\okio\1.14.0\okio-1.14.0-javadoc.jar!/"/>
</attributes>
</classpathentry>
<classpathentry sourcepath=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\com\typesafe\play\filters-helpers_2.13\2.8.1\filters-helpers_2.13-2.8.1-sources.jar" kind="lib" path=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\com\typesafe\play\filters-helpers_2.13\2.8.1\filters-helpers_2.13-2.8.1.jar">
<attributes>
<attribute name="javadoc_location" value="jar:file:.\null\Coursier\cache\v1\https\repo1.maven.org\maven2\com\typesafe\play\filters-helpers_2.13\2.8.1\filters-helpers_2.13-2.8.1-javadoc.jar!/"/>
</attributes>
</classpathentry>
<classpathentry sourcepath=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\com\google\code\findbugs\jsr305\3.0.2\jsr305-3.0.2-sources.jar" kind="lib" path=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\com\google\code\findbugs\jsr305\3.0.2\jsr305-3.0.2.jar">
<attributes>
<attribute name="javadoc_location" value="jar:file:.\null\Coursier\cache\v1\https\repo1.maven.org\maven2\com\google\code\findbugs\jsr305\3.0.2\jsr305-3.0.2-javadoc.jar!/"/>
</attributes>
</classpathentry>
<classpathentry sourcepath=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\org\slf4j\slf4j-api\1.7.30\slf4j-api-1.7.30-sources.jar" kind="lib" path=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\org\slf4j\slf4j-api\1.7.30\slf4j-api-1.7.30.jar">
<attributes>
<attribute name="javadoc_location" value="jar:file:.\null\Coursier\cache\v1\https\repo1.maven.org\maven2\org\slf4j\slf4j-api\1.7.30\slf4j-api-1.7.30-javadoc.jar!/"/>
</attributes>
</classpathentry>
<classpathentry sourcepath=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\commons-net\commons-net\3.6\commons-net-3.6-sources.jar" kind="lib" path=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\commons-net\commons-net\3.6\commons-net-3.6.jar">
<attributes>
<attribute name="javadoc_location" value="jar:file:.\null\Coursier\cache\v1\https\repo1.maven.org\maven2\commons-net\commons-net\3.6\commons-net-3.6-javadoc.jar!/"/>
</attributes>
</classpathentry>
<classpathentry sourcepath=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\org\fluentlenium\fluentlenium-core\3.7.1\fluentlenium-core-3.7.1-sources.jar" kind="lib" path=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\org\fluentlenium\fluentlenium-core\3.7.1\fluentlenium-core-3.7.1.jar">
<attributes>
<attribute name="javadoc_location" value="jar:file:.\null\Coursier\cache\v1\https\repo1.maven.org\maven2\org\fluentlenium\fluentlenium-core\3.7.1\fluentlenium-core-3.7.1-javadoc.jar!/"/>
</attributes>
</classpathentry>
<classpathentry sourcepath=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\com\typesafe\akka\akka-protobuf-v3_2.13\2.6.3\akka-protobuf-v3_2.13-2.6.3-sources.jar" kind="lib" path=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\com\typesafe\akka\akka-protobuf-v3_2.13\2.6.3\akka-protobuf-v3_2.13-2.6.3.jar">
<attributes>
<attribute name="javadoc_location" value="jar:file:.\null\Coursier\cache\v1\https\repo1.maven.org\maven2\com\typesafe\akka\akka-protobuf-v3_2.13\2.6.3\akka-protobuf-v3_2.13-2.6.3-javadoc.jar!/"/>
</attributes>
</classpathentry>
<classpathentry kind="lib" path=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\com\google\guava\listenablefuture\9999.0-empty-to-avoid-conflict-with-guava\listenablefuture-9999.0-empty-to-avoid-conflict-with-guava.jar"/>
<classpathentry sourcepath=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\org\webjars\jquery\1.11.1\jquery-1.11.1-sources.jar" kind="lib" path=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\org\webjars\jquery\1.11.1\jquery-1.11.1.jar"/>
<classpathentry sourcepath=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\commons-logging\commons-logging\1.2\commons-logging-1.2-sources.jar" kind="lib" path=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\commons-logging\commons-logging\1.2\commons-logging-1.2.jar">
<attributes>
<attribute name="javadoc_location" value="jar:file:.\null\Coursier\cache\v1\https\repo1.maven.org\maven2\commons-logging\commons-logging\1.2\commons-logging-1.2-javadoc.jar!/"/>
</attributes>
</classpathentry>
<classpathentry sourcepath=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\org\apache\httpcomponents\httpclient\4.5.9\httpclient-4.5.9-sources.jar" kind="lib" path=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\org\apache\httpcomponents\httpclient\4.5.9\httpclient-4.5.9.jar">
<attributes>
<attribute name="javadoc_location" value="jar:file:.\null\Coursier\cache\v1\https\repo1.maven.org\maven2\org\apache\httpcomponents\httpclient\4.5.9\httpclient-4.5.9-javadoc.jar!/"/>
</attributes>
</classpathentry>
<classpathentry sourcepath=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\xerces\xercesImpl\2.12.0\xercesImpl-2.12.0-sources.jar" kind="lib" path=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\xerces\xercesImpl\2.12.0\xercesImpl-2.12.0.jar">
<attributes>
<attribute name="javadoc_location" value="jar:file:.\null\Coursier\cache\v1\https\repo1.maven.org\maven2\xerces\xercesImpl\2.12.0\xercesImpl-2.12.0-javadoc.jar!/"/>
</attributes>
</classpathentry>
<classpathentry sourcepath=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\joda-time\joda-time\2.10.5\joda-time-2.10.5-sources.jar" kind="lib" path=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\joda-time\joda-time\2.10.5\joda-time-2.10.5.jar">
<attributes>
<attribute name="javadoc_location" value="jar:file:.\null\Coursier\cache\v1\https\repo1.maven.org\maven2\joda-time\joda-time\2.10.5\joda-time-2.10.5-javadoc.jar!/"/>
</attributes>
</classpathentry>
<classpathentry sourcepath=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\com\fasterxml\jackson\datatype\jackson-datatype-jdk8\2.10.2\jackson-datatype-jdk8-2.10.2-sources.jar" kind="lib" path=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\com\fasterxml\jackson\datatype\jackson-datatype-jdk8\2.10.2\jackson-datatype-jdk8-2.10.2.jar">
<attributes>
<attribute name="javadoc_location" value="jar:file:.\null\Coursier\cache\v1\https\repo1.maven.org\maven2\com\fasterxml\jackson\datatype\jackson-datatype-jdk8\2.10.2\jackson-datatype-jdk8-2.10.2-javadoc.jar!/"/>
</attributes>
</classpathentry>
<classpathentry sourcepath=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\xml-apis\xml-apis\1.4.01\xml-apis-1.4.01-sources.jar" kind="lib" path=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\xml-apis\xml-apis\1.4.01\xml-apis-1.4.01.jar">
<attributes>
<attribute name="javadoc_location" value="jar:file:.\null\Coursier\cache\v1\https\repo1.maven.org\maven2\xml-apis\xml-apis\1.4.01\xml-apis-1.4.01-javadoc.jar!/"/>
</attributes>
</classpathentry>
<classpathentry sourcepath=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\com\typesafe\play\play-ws-standalone_2.13\2.1.2\play-ws-standalone_2.13-2.1.2-sources.jar" kind="lib" path=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\com\typesafe\play\play-ws-standalone_2.13\2.1.2\play-ws-standalone_2.13-2.1.2.jar">
<attributes>
<attribute name="javadoc_location" value="jar:file:.\null\Coursier\cache\v1\https\repo1.maven.org\maven2\com\typesafe\play\play-ws-standalone_2.13\2.1.2\play-ws-standalone_2.13-2.1.2-javadoc.jar!/"/>
</attributes>
</classpathentry>
<classpathentry sourcepath=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\org\seleniumhq\selenium\htmlunit-driver\2.36.0\htmlunit-driver-2.36.0-sources.jar" kind="lib" path=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\org\seleniumhq\selenium\htmlunit-driver\2.36.0\htmlunit-driver-2.36.0.jar">
<attributes>
<attribute name="javadoc_location" value="jar:file:.\null\Coursier\cache\v1\https\repo1.maven.org\maven2\org\seleniumhq\selenium\htmlunit-driver\2.36.0\htmlunit-driver-2.36.0-javadoc.jar!/"/>
</attributes>
</classpathentry>
<classpathentry kind="lib" path=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\org\webjars\requirejs\2.3.6\requirejs-2.3.6.jar"/>
<classpathentry sourcepath=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\xalan\xalan\2.7.2\xalan-2.7.2-sources.jar" kind="lib" path=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\xalan\xalan\2.7.2\xalan-2.7.2.jar">
<attributes>
<attribute name="javadoc_location" value="jar:file:.\null\Coursier\cache\v1\https\repo1.maven.org\maven2\xalan\xalan\2.7.2\xalan-2.7.2-javadoc.jar!/"/>
</attributes>
</classpathentry>
<classpathentry sourcepath=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\com\typesafe\play\shaded-asynchttpclient\2.1.2\shaded-asynchttpclient-2.1.2-sources.jar" kind="lib" path=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\com\typesafe\play\shaded-asynchttpclient\2.1.2\shaded-asynchttpclient-2.1.2.jar">
<attributes>
<attribute name="javadoc_location" value="jar:file:.\null\Coursier\cache\v1\https\repo1.maven.org\maven2\com\typesafe\play\shaded-asynchttpclient\2.1.2\shaded-asynchttpclient-2.1.2-javadoc.jar!/"/>
</attributes>
</classpathentry>
<classpathentry sourcepath=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\com\typesafe\play\play-server_2.13\2.8.1\play-server_2.13-2.8.1-sources.jar" kind="lib" path=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\com\typesafe\play\play-server_2.13\2.8.1\play-server_2.13-2.8.1.jar">
<attributes>
<attribute name="javadoc_location" value="jar:file:.\null\Coursier\cache\v1\https\repo1.maven.org\maven2\com\typesafe\play\play-server_2.13\2.8.1\play-server_2.13-2.8.1-javadoc.jar!/"/>
</attributes>
</classpathentry>
<classpathentry sourcepath=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\com\google\protobuf\protobuf-java\3.10.0\protobuf-java-3.10.0-sources.jar" kind="lib" path=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\com\google\protobuf\protobuf-java\3.10.0\protobuf-java-3.10.0.jar">
<attributes>
<attribute name="javadoc_location" value="jar:file:.\null\Coursier\cache\v1\https\repo1.maven.org\maven2\com\google\protobuf\protobuf-java\3.10.0\protobuf-java-3.10.0-javadoc.jar!/"/>
</attributes>
</classpathentry>
<classpathentry sourcepath=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\com\typesafe\play\play-guice_2.13\2.8.1\play-guice_2.13-2.8.1-sources.jar" kind="lib" path=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\com\typesafe\play\play-guice_2.13\2.8.1\play-guice_2.13-2.8.1.jar">
<attributes>
<attribute name="javadoc_location" value="jar:file:.\null\Coursier\cache\v1\https\repo1.maven.org\maven2\com\typesafe\play\play-guice_2.13\2.8.1\play-guice_2.13-2.8.1-javadoc.jar!/"/>
</attributes>
</classpathentry>
<classpathentry sourcepath=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\aopalliance\aopalliance\1.0\aopalliance-1.0-sources.jar" kind="lib" path=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\aopalliance\aopalliance\1.0\aopalliance-1.0.jar"/>
<classpathentry sourcepath=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\jakarta\transaction\jakarta.transaction-api\1.3.3\jakarta.transaction-api-1.3.3-sources.jar" kind="lib" path=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\jakarta\transaction\jakarta.transaction-api\1.3.3\jakarta.transaction-api-1.3.3.jar">
<attributes>
<attribute name="javadoc_location" value="jar:file:.\null\Coursier\cache\v1\https\repo1.maven.org\maven2\jakarta\transaction\jakarta.transaction-api\1.3.3\jakarta.transaction-api-1.3.3-javadoc.jar!/"/>
</attributes>
</classpathentry>
<classpathentry sourcepath=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\com\typesafe\akka\akka-slf4j_2.13\2.6.3\akka-slf4j_2.13-2.6.3-sources.jar" kind="lib" path=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\com\typesafe\akka\akka-slf4j_2.13\2.6.3\akka-slf4j_2.13-2.6.3.jar">
<attributes>
<attribute name="javadoc_location" value="jar:file:.\null\Coursier\cache\v1\https\repo1.maven.org\maven2\com\typesafe\akka\akka-slf4j_2.13\2.6.3\akka-slf4j_2.13-2.6.3-javadoc.jar!/"/>
</attributes>
</classpathentry>
<classpathentry sourcepath=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\com\typesafe\play\play-java-forms_2.13\2.8.1\play-java-forms_2.13-2.8.1-sources.jar" kind="lib" path=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\com\typesafe\play\play-java-forms_2.13\2.8.1\play-java-forms_2.13-2.8.1.jar">
<attributes>
<attribute name="javadoc_location" value="jar:file:.\null\Coursier\cache\v1\https\repo1.maven.org\maven2\com\typesafe\play\play-java-forms_2.13\2.8.1\play-java-forms_2.13-2.8.1-javadoc.jar!/"/>
</attributes>
</classpathentry>
<classpathentry sourcepath=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\com\google\j2objc\j2objc-annotations\1.3\j2objc-annotations-1.3-sources.jar" kind="lib" path=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\com\google\j2objc\j2objc-annotations\1.3\j2objc-annotations-1.3.jar">
<attributes>
<attribute name="javadoc_location" value="jar:file:.\null\Coursier\cache\v1\https\repo1.maven.org\maven2\com\google\j2objc\j2objc-annotations\1.3\j2objc-annotations-1.3-javadoc.jar!/"/>
</attributes>
</classpathentry>
<classpathentry sourcepath=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\org\awaitility\awaitility\4.0.1\awaitility-4.0.1-sources.jar" kind="lib" path=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\org\awaitility\awaitility\4.0.1\awaitility-4.0.1.jar">
<attributes>
<attribute name="javadoc_location" value="jar:file:.\null\Coursier\cache\v1\https\repo1.maven.org\maven2\org\awaitility\awaitility\4.0.1\awaitility-4.0.1-javadoc.jar!/"/>
</attributes>
</classpathentry>
<classpathentry sourcepath=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\com\google\guava\guava\28.1-jre\guava-28.1-jre-sources.jar" kind="lib" path=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\com\google\guava\guava\28.1-jre\guava-28.1-jre.jar">
<attributes>
<attribute name="javadoc_location" value="jar:file:.\null\Coursier\cache\v1\https\repo1.maven.org\maven2\com\google\guava\guava\28.1-jre\guava-28.1-jre-javadoc.jar!/"/>
</attributes>
</classpathentry>
<classpathentry sourcepath=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\org\seleniumhq\selenium\selenium-support\3.141.59\selenium-support-3.141.59-sources.jar" kind="lib" path=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\org\seleniumhq\selenium\selenium-support\3.141.59\selenium-support-3.141.59.jar">
<attributes>
<attribute name="javadoc_location" value="jar:file:.\null\Coursier\cache\v1\https\repo1.maven.org\maven2\org\seleniumhq\selenium\selenium-support\3.141.59\selenium-support-3.141.59-javadoc.jar!/"/>
</attributes>
</classpathentry>
<classpathentry sourcepath=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\org\seleniumhq\selenium\selenium-remote-driver\3.141.59\selenium-remote-driver-3.141.59-sources.jar" kind="lib" path=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\org\seleniumhq\selenium\selenium-remote-driver\3.141.59\selenium-remote-driver-3.141.59.jar">
<attributes>
<attribute name="javadoc_location" value="jar:file:.\null\Coursier\cache\v1\https\repo1.maven.org\maven2\org\seleniumhq\selenium\selenium-remote-driver\3.141.59\selenium-remote-driver-3.141.59-javadoc.jar!/"/>
</attributes>
</classpathentry>
<classpathentry sourcepath=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\com\typesafe\play\shaded-oauth\2.1.2\shaded-oauth-2.1.2-sources.jar" kind="lib" path=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\com\typesafe\play\shaded-oauth\2.1.2\shaded-oauth-2.1.2.jar">
<attributes>
<attribute name="javadoc_location" value="jar:file:.\null\Coursier\cache\v1\https\repo1.maven.org\maven2\com\typesafe\play\shaded-oauth\2.1.2\shaded-oauth-2.1.2-javadoc.jar!/"/>
</attributes>
</classpathentry>
<classpathentry sourcepath=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\org\webjars\bootstrap\2.3.2\bootstrap-2.3.2-sources.jar" kind="lib" path=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\org\webjars\bootstrap\2.3.2\bootstrap-2.3.2.jar">
<attributes>
<attribute name="javadoc_location" value="jar:file:.\null\Coursier\cache\v1\https\repo1.maven.org\maven2\org\webjars\bootstrap\2.3.2\bootstrap-2.3.2-javadoc.jar!/"/>
</attributes>
</classpathentry>
<classpathentry sourcepath=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\org\eclipse\jetty\websocket\websocket-common\9.4.20.v20190813\websocket-common-9.4.20.v20190813-sources.jar" kind="lib" path=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\org\eclipse\jetty\websocket\websocket-common\9.4.20.v20190813\websocket-common-9.4.20.v20190813.jar">
<attributes>
<attribute name="javadoc_location" value="jar:file:.\null\Coursier\cache\v1\https\repo1.maven.org\maven2\org\eclipse\jetty\websocket\websocket-common\9.4.20.v20190813\websocket-common-9.4.20.v20190813-javadoc.jar!/"/>
</attributes>
</classpathentry>
<classpathentry sourcepath=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\org\assertj\assertj-core\3.14.0\assertj-core-3.14.0-sources.jar" kind="lib" path=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\org\assertj\assertj-core\3.14.0\assertj-core-3.14.0.jar">
<attributes>
<attribute name="javadoc_location" value="jar:file:.\null\Coursier\cache\v1\https\repo1.maven.org\maven2\org\assertj\assertj-core\3.14.0\assertj-core-3.14.0-javadoc.jar!/"/>
</attributes>
</classpathentry>
<classpathentry sourcepath=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\xalan\serializer\2.7.2\serializer-2.7.2-sources.jar" kind="lib" path=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\xalan\serializer\2.7.2\serializer-2.7.2.jar">
<attributes>
<attribute name="javadoc_location" value="jar:file:.\null\Coursier\cache\v1\https\repo1.maven.org\maven2\xalan\serializer\2.7.2\serializer-2.7.2-javadoc.jar!/"/>
</attributes>
</classpathentry>
<classpathentry sourcepath=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\com\google\guava\failureaccess\1.0.1\failureaccess-1.0.1-sources.jar" kind="lib" path=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\com\google\guava\failureaccess\1.0.1\failureaccess-1.0.1.jar">
<attributes>
<attribute name="javadoc_location" value="jar:file:.\null\Coursier\cache\v1\https\repo1.maven.org\maven2\com\google\guava\failureaccess\1.0.1\failureaccess-1.0.1-javadoc.jar!/"/>
</attributes>
</classpathentry>
<classpathentry sourcepath=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\net\sourceforge\htmlunit\htmlunit-cssparser\1.5.0\htmlunit-cssparser-1.5.0-sources.jar" kind="lib" path=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\net\sourceforge\htmlunit\htmlunit-cssparser\1.5.0\htmlunit-cssparser-1.5.0.jar">
<attributes>
<attribute name="javadoc_location" value="jar:file:.\null\Coursier\cache\v1\https\repo1.maven.org\maven2\net\sourceforge\htmlunit\htmlunit-cssparser\1.5.0\htmlunit-cssparser-1.5.0-javadoc.jar!/"/>
</attributes>
</classpathentry>
<classpathentry sourcepath=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\com\google\inject\guice\4.2.2\guice-4.2.2-sources.jar" kind="lib" path=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\com\google\inject\guice\4.2.2\guice-4.2.2.jar">
<attributes>
<attribute name="javadoc_location" value="jar:file:.\null\Coursier\cache\v1\https\repo1.maven.org\maven2\com\google\inject\guice\4.2.2\guice-4.2.2-javadoc.jar!/"/>
</attributes>
</classpathentry>
<classpathentry sourcepath=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\org\eclipse\jetty\jetty-util\9.4.20.v20190813\jetty-util-9.4.20.v20190813-sources.jar" kind="lib" path=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\org\eclipse\jetty\jetty-util\9.4.20.v20190813\jetty-util-9.4.20.v20190813.jar">
<attributes>
<attribute name="javadoc_location" value="jar:file:.\null\Coursier\cache\v1\https\repo1.maven.org\maven2\org\eclipse\jetty\jetty-util\9.4.20.v20190813\jetty-util-9.4.20.v20190813-javadoc.jar!/"/>
</attributes>
</classpathentry>
<classpathentry sourcepath=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\com\fasterxml\jackson\core\jackson-annotations\2.10.3\jackson-annotations-2.10.3-sources.jar" kind="lib" path=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\com\fasterxml\jackson\core\jackson-annotations\2.10.3\jackson-annotations-2.10.3.jar">
<attributes>
<attribute name="javadoc_location" value="jar:file:.\null\Coursier\cache\v1\https\repo1.maven.org\maven2\com\fasterxml\jackson\core\jackson-annotations\2.10.3\jackson-annotations-2.10.3-javadoc.jar!/"/>
</attributes>
</classpathentry>
<classpathentry sourcepath=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\org\eclipse\jetty\websocket\websocket-client\9.4.20.v20190813\websocket-client-9.4.20.v20190813-sources.jar" kind="lib" path=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\org\eclipse\jetty\websocket\websocket-client\9.4.20.v20190813\websocket-client-9.4.20.v20190813.jar">
<attributes>
<attribute name="javadoc_location" value="jar:file:.\null\Coursier\cache\v1\https\repo1.maven.org\maven2\org\eclipse\jetty\websocket\websocket-client\9.4.20.v20190813\websocket-client-9.4.20.v20190813-javadoc.jar!/"/>
</attributes>
</classpathentry>
<classpathentry sourcepath=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\org\slf4j\jcl-over-slf4j\1.7.29\jcl-over-slf4j-1.7.29-sources.jar" kind="lib" path=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\org\slf4j\jcl-over-slf4j\1.7.29\jcl-over-slf4j-1.7.29.jar">
<attributes>
<attribute name="javadoc_location" value="jar:file:.\null\Coursier\cache\v1\https\repo1.maven.org\maven2\org\slf4j\jcl-over-slf4j\1.7.29\jcl-over-slf4j-1.7.29-javadoc.jar!/"/>
</attributes>
</classpathentry>
<classpathentry sourcepath=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\com\fasterxml\jackson\module\jackson-module-scala_2.13\2.10.2\jackson-module-scala_2.13-2.10.2-sources.jar" kind="lib" path=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\com\fasterxml\jackson\module\jackson-module-scala_2.13\2.10.2\jackson-module-scala_2.13-2.10.2.jar">
<attributes>
<attribute name="javadoc_location" value="jar:file:.\null\Coursier\cache\v1\https\repo1.maven.org\maven2\com\fasterxml\jackson\module\jackson-module-scala_2.13\2.10.2\jackson-module-scala_2.13-2.10.2-javadoc.jar!/"/>
</attributes>
</classpathentry>
<classpathentry sourcepath=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\com\typesafe\akka\akka-serialization-jackson_2.13\2.6.3\akka-serialization-jackson_2.13-2.6.3-sources.jar" kind="lib" path=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\com\typesafe\akka\akka-serialization-jackson_2.13\2.6.3\akka-serialization-jackson_2.13-2.6.3.jar">
<attributes>
<attribute name="javadoc_location" value="jar:file:.\null\Coursier\cache\v1\https\repo1.maven.org\maven2\com\typesafe\akka\akka-serialization-jackson_2.13\2.6.3\akka-serialization-jackson_2.13-2.6.3-javadoc.jar!/"/>
</attributes>
</classpathentry>
<classpathentry sourcepath=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\org\seleniumhq\selenium\selenium-api\3.141.59\selenium-api-3.141.59-sources.jar" kind="lib" path=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\org\seleniumhq\selenium\selenium-api\3.141.59\selenium-api-3.141.59.jar">
<attributes>
<attribute name="javadoc_location" value="jar:file:.\null\Coursier\cache\v1\https\repo1.maven.org\maven2\org\seleniumhq\selenium\selenium-api\3.141.59\selenium-api-3.141.59-javadoc.jar!/"/>
</attributes>
</classpathentry>
<classpathentry sourcepath=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\com\typesafe\play\cachecontrol_2.13\2.0.0\cachecontrol_2.13-2.0.0-sources.jar" kind="lib" path=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\com\typesafe\play\cachecontrol_2.13\2.0.0\cachecontrol_2.13-2.0.0.jar">
<attributes>
<attribute name="javadoc_location" value="jar:file:.\null\Coursier\cache\v1\https\repo1.maven.org\maven2\com\typesafe\play\cachecontrol_2.13\2.0.0\cachecontrol_2.13-2.0.0-javadoc.jar!/"/>
</attributes>
</classpathentry>
<classpathentry sourcepath=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\org\eclipse\jetty\jetty-http\9.4.20.v20190813\jetty-http-9.4.20.v20190813-sources.jar" kind="lib" path=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\org\eclipse\jetty\jetty-http\9.4.20.v20190813\jetty-http-9.4.20.v20190813.jar">
<attributes>
<attribute name="javadoc_location" value="jar:file:.\null\Coursier\cache\v1\https\repo1.maven.org\maven2\org\eclipse\jetty\jetty-http\9.4.20.v20190813\jetty-http-9.4.20.v20190813-javadoc.jar!/"/>
</attributes>
</classpathentry>
<classpathentry sourcepath=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\com\typesafe\ssl-config-core_2.13\0.4.1\ssl-config-core_2.13-0.4.1-sources.jar" kind="lib" path=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\com\typesafe\ssl-config-core_2.13\0.4.1\ssl-config-core_2.13-0.4.1.jar">
<attributes>
<attribute name="javadoc_location" value="jar:file:.\null\Coursier\cache\v1\https\repo1.maven.org\maven2\com\typesafe\ssl-config-core_2.13\0.4.1\ssl-config-core_2.13-0.4.1-javadoc.jar!/"/>
</attributes>
</classpathentry>
<classpathentry sourcepath=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\com\typesafe\play\play-test_2.13\2.8.1\play-test_2.13-2.8.1-sources.jar" kind="lib" path=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\com\typesafe\play\play-test_2.13\2.8.1\play-test_2.13-2.8.1.jar">
<attributes>
<attribute name="javadoc_location" value="jar:file:.\null\Coursier\cache\v1\https\repo1.maven.org\maven2\com\typesafe\play\play-test_2.13\2.8.1\play-test_2.13-2.8.1-javadoc.jar!/"/>
</attributes>
</classpathentry>
<classpathentry sourcepath=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\com\typesafe\play\play-logback_2.13\2.8.1\play-logback_2.13-2.8.1-sources.jar" kind="lib" path=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\com\typesafe\play\play-logback_2.13\2.8.1\play-logback_2.13-2.8.1.jar">
<attributes>
<attribute name="javadoc_location" value="jar:file:.\null\Coursier\cache\v1\https\repo1.maven.org\maven2\com\typesafe\play\play-logback_2.13\2.8.1\play-logback_2.13-2.8.1-javadoc.jar!/"/>
</attributes>
</classpathentry>
<classpathentry sourcepath=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\junit\junit\4.13.2\junit-4.13.2-sources.jar" kind="lib" path=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\junit\junit\4.13.2\junit-4.13.2.jar">
<attributes>
<attribute name="javadoc_location" value="jar:file:.\null\Coursier\cache\v1\https\repo1.maven.org\maven2\junit\junit\4.13.2\junit-4.13.2-javadoc.jar!/"/>
</attributes>
</classpathentry>
<classpathentry sourcepath=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\org\apache\commons\commons-exec\1.3\commons-exec-1.3-sources.jar" kind="lib" path=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\org\apache\commons\commons-exec\1.3\commons-exec-1.3.jar">
<attributes>
<attribute name="javadoc_location" value="jar:file:.\null\Coursier\cache\v1\https\repo1.maven.org\maven2\org\apache\commons\commons-exec\1.3\commons-exec-1.3-javadoc.jar!/"/>
</attributes>
</classpathentry>
<classpathentry sourcepath=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\com\google\inject\extensions\guice-assistedinject\4.2.2\guice-assistedinject-4.2.2-sources.jar" kind="lib" path=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\com\google\inject\extensions\guice-assistedinject\4.2.2\guice-assistedinject-4.2.2.jar">
<attributes>
<attribute name="javadoc_location" value="jar:file:.\null\Coursier\cache\v1\https\repo1.maven.org\maven2\com\google\inject\extensions\guice-assistedinject\4.2.2\guice-assistedinject-4.2.2-javadoc.jar!/"/>
</attributes>
</classpathentry>
<classpathentry sourcepath=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\org\springframework\spring-context\5.2.2.RELEASE\spring-context-5.2.2.RELEASE-sources.jar" kind="lib" path=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\org\springframework\spring-context\5.2.2.RELEASE\spring-context-5.2.2.RELEASE.jar">
<attributes>
<attribute name="javadoc_location" value="jar:file:.\null\Coursier\cache\v1\https\repo1.maven.org\maven2\org\springframework\spring-context\5.2.2.RELEASE\spring-context-5.2.2.RELEASE-javadoc.jar!/"/>
</attributes>
</classpathentry>
<classpathentry sourcepath=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\org\eclipse\jetty\jetty-xml\9.4.20.v20190813\jetty-xml-9.4.20.v20190813-sources.jar" kind="lib" path=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\org\eclipse\jetty\jetty-xml\9.4.20.v20190813\jetty-xml-9.4.20.v20190813.jar">
<attributes>
<attribute name="javadoc_location" value="jar:file:.\null\Coursier\cache\v1\https\repo1.maven.org\maven2\org\eclipse\jetty\jetty-xml\9.4.20.v20190813\jetty-xml-9.4.20.v20190813-javadoc.jar!/"/>
</attributes>
</classpathentry>
<classpathentry sourcepath=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\com\typesafe\play\play-functional_2.13\2.8.1\play-functional_2.13-2.8.1-sources.jar" kind="lib" path=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\com\typesafe\play\play-functional_2.13\2.8.1\play-functional_2.13-2.8.1.jar">
<attributes>
<attribute name="javadoc_location" value="jar:file:.\null\Coursier\cache\v1\https\repo1.maven.org\maven2\com\typesafe\play\play-functional_2.13\2.8.1\play-functional_2.13-2.8.1-javadoc.jar!/"/>
</attributes>
</classpathentry>
<classpathentry sourcepath=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\com\typesafe\play\build-link\2.8.1\build-link-2.8.1-sources.jar" kind="lib" path=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\com\typesafe\play\build-link\2.8.1\build-link-2.8.1.jar">
<attributes>
<attribute name="javadoc_location" value="jar:file:.\null\Coursier\cache\v1\https\repo1.maven.org\maven2\com\typesafe\play\build-link\2.8.1\build-link-2.8.1-javadoc.jar!/"/>
</attributes>
</classpathentry>
<classpathentry sourcepath=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\javax\cache\cache-api\1.1.1\cache-api-1.1.1-sources.jar" kind="lib" path=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\javax\cache\cache-api\1.1.1\cache-api-1.1.1.jar">
<attributes>
<attribute name="javadoc_location" value="jar:file:.\null\Coursier\cache\v1\https\repo1.maven.org\maven2\javax\cache\cache-api\1.1.1\cache-api-1.1.1-javadoc.jar!/"/>
</attributes>
</classpathentry>
<classpathentry sourcepath=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\org\atteo\classindex\classindex\3.4\classindex-3.4-sources.jar" kind="lib" path=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\org\atteo\classindex\classindex\3.4\classindex-3.4.jar">
<attributes>
<attribute name="javadoc_location" value="jar:file:.\null\Coursier\cache\v1\https\repo1.maven.org\maven2\org\atteo\classindex\classindex\3.4\classindex-3.4-javadoc.jar!/"/>
</attributes>
</classpathentry>
<classpathentry sourcepath=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\com\fasterxml\jackson\dataformat\jackson-dataformat-cbor\2.10.2\jackson-dataformat-cbor-2.10.2-sources.jar" kind="lib" path=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\com\fasterxml\jackson\dataformat\jackson-dataformat-cbor\2.10.2\jackson-dataformat-cbor-2.10.2.jar">
<attributes>
<attribute name="javadoc_location" value="jar:file:.\null\Coursier\cache\v1\https\repo1.maven.org\maven2\com\fasterxml\jackson\dataformat\jackson-dataformat-cbor\2.10.2\jackson-dataformat-cbor-2.10.2-javadoc.jar!/"/>
</attributes>
</classpathentry>
<classpathentry sourcepath=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\org\slf4j\jul-to-slf4j\1.7.29\jul-to-slf4j-1.7.29-sources.jar" kind="lib" path=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\org\slf4j\jul-to-slf4j\1.7.29\jul-to-slf4j-1.7.29.jar">
<attributes>
<attribute name="javadoc_location" value="jar:file:.\null\Coursier\cache\v1\https\repo1.maven.org\maven2\org\slf4j\jul-to-slf4j\1.7.29\jul-to-slf4j-1.7.29-javadoc.jar!/"/>
</attributes>
</classpathentry>
<classpathentry sourcepath=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\com\fasterxml\jackson\datatype\jackson-datatype-jsr310\2.10.2\jackson-datatype-jsr310-2.10.2-sources.jar" kind="lib" path=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\com\fasterxml\jackson\datatype\jackson-datatype-jsr310\2.10.2\jackson-datatype-jsr310-2.10.2.jar">
<attributes>
<attribute name="javadoc_location" value="jar:file:.\null\Coursier\cache\v1\https\repo1.maven.org\maven2\com\fasterxml\jackson\datatype\jackson-datatype-jsr310\2.10.2\jackson-datatype-jsr310-2.10.2-javadoc.jar!/"/>
</attributes>
</classpathentry>
<classpathentry sourcepath=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\com\thoughtworks\paranamer\paranamer\2.8\paranamer-2.8-sources.jar" kind="lib" path=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\com\thoughtworks\paranamer\paranamer\2.8\paranamer-2.8.jar">
<attributes>
<attribute name="javadoc_location" value="jar:file:.\null\Coursier\cache\v1\https\repo1.maven.org\maven2\com\thoughtworks\paranamer\paranamer\2.8\paranamer-2.8-javadoc.jar!/"/>
</attributes>
</classpathentry>
<classpathentry sourcepath=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\org\reactivestreams\reactive-streams\1.0.3\reactive-streams-1.0.3-sources.jar" kind="lib" path=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\org\reactivestreams\reactive-streams\1.0.3\reactive-streams-1.0.3.jar">
<attributes>
<attribute name="javadoc_location" value="jar:file:.\null\Coursier\cache\v1\https\repo1.maven.org\maven2\org\reactivestreams\reactive-streams\1.0.3\reactive-streams-1.0.3-javadoc.jar!/"/>
</attributes>
</classpathentry>
<classpathentry sourcepath=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\com\typesafe\play\play-ws-standalone-json_2.13\2.1.2\play-ws-standalone-json_2.13-2.1.2-sources.jar" kind="lib" path=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\com\typesafe\play\play-ws-standalone-json_2.13\2.1.2\play-ws-standalone-json_2.13-2.1.2.jar">
<attributes>
<attribute name="javadoc_location" value="jar:file:.\null\Coursier\cache\v1\https\repo1.maven.org\maven2\com\typesafe\play\play-ws-standalone-json_2.13\2.1.2\play-ws-standalone-json_2.13-2.1.2-javadoc.jar!/"/>
</attributes>
</classpathentry>
<classpathentry sourcepath=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\com\typesafe\akka\akka-actor_2.13\2.6.3\akka-actor_2.13-2.6.3-sources.jar" kind="lib" path=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\com\typesafe\akka\akka-actor_2.13\2.6.3\akka-actor_2.13-2.6.3.jar">
<attributes>
<attribute name="javadoc_location" value="jar:file:.\null\Coursier\cache\v1\https\repo1.maven.org\maven2\com\typesafe\akka\akka-actor_2.13\2.6.3\akka-actor_2.13-2.6.3-javadoc.jar!/"/>
</attributes>
</classpathentry>
<classpathentry sourcepath=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\org\webjars\webjars-locator\0.38\webjars-locator-0.38-sources.jar" kind="lib" path=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\org\webjars\webjars-locator\0.38\webjars-locator-0.38.jar">
<attributes>
<attribute name="javadoc_location" value="jar:file:.\null\Coursier\cache\v1\https\repo1.maven.org\maven2\org\webjars\webjars-locator\0.38\webjars-locator-0.38-javadoc.jar!/"/>
</attributes>
</classpathentry>
<classpathentry sourcepath=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\org\webjars\webjars-locator-core\0.43\webjars-locator-core-0.43-sources.jar" kind="lib" path=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\org\webjars\webjars-locator-core\0.43\webjars-locator-core-0.43.jar">
<attributes>
<attribute name="javadoc_location" value="jar:file:.\null\Coursier\cache\v1\https\repo1.maven.org\maven2\org\webjars\webjars-locator-core\0.43\webjars-locator-core-0.43-javadoc.jar!/"/>
</attributes>
</classpathentry>
<classpathentry sourcepath=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\com\typesafe\akka\akka-actor-typed_2.13\2.6.3\akka-actor-typed_2.13-2.6.3-sources.jar" kind="lib" path=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\com\typesafe\akka\akka-actor-typed_2.13\2.6.3\akka-actor-typed_2.13-2.6.3.jar">
<attributes>
<attribute name="javadoc_location" value="jar:file:.\null\Coursier\cache\v1\https\repo1.maven.org\maven2\com\typesafe\akka\akka-actor-typed_2.13\2.6.3\akka-actor-typed_2.13-2.6.3-javadoc.jar!/"/>
</attributes>
</classpathentry>
<classpathentry sourcepath=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\jakarta\xml\bind\jakarta.xml.bind-api\2.3.2\jakarta.xml.bind-api-2.3.2-sources.jar" kind="lib" path=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\jakarta\xml\bind\jakarta.xml.bind-api\2.3.2\jakarta.xml.bind-api-2.3.2.jar">
<attributes>
<attribute name="javadoc_location" value="jar:file:.\null\Coursier\cache\v1\https\repo1.maven.org\maven2\jakarta\xml\bind\jakarta.xml.bind-api\2.3.2\jakarta.xml.bind-api-2.3.2-javadoc.jar!/"/>
</attributes>
</classpathentry>
<classpathentry sourcepath=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\com\fasterxml\jackson\core\jackson-core\2.10.3\jackson-core-2.10.3-sources.jar" kind="lib" path=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\com\fasterxml\jackson\core\jackson-core\2.10.3\jackson-core-2.10.3.jar">
<attributes>
<attribute name="javadoc_location" value="jar:file:.\null\Coursier\cache\v1\https\repo1.maven.org\maven2\com\fasterxml\jackson\core\jackson-core\2.10.3\jackson-core-2.10.3-javadoc.jar!/"/>
</attributes>
</classpathentry>
<classpathentry sourcepath=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\com\typesafe\play\play-java_2.13\2.8.1\play-java_2.13-2.8.1-sources.jar" kind="lib" path=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\com\typesafe\play\play-java_2.13\2.8.1\play-java_2.13-2.8.1.jar">
<attributes>
<attribute name="javadoc_location" value="jar:file:.\null\Coursier\cache\v1\https\repo1.maven.org\maven2\com\typesafe\play\play-java_2.13\2.8.1\play-java_2.13-2.8.1-javadoc.jar!/"/>
</attributes>
</classpathentry>
<classpathentry sourcepath=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\com\typesafe\play\play-json_2.13\2.8.1\play-json_2.13-2.8.1-sources.jar" kind="lib" path=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\com\typesafe\play\play-json_2.13\2.8.1\play-json_2.13-2.8.1.jar">
<attributes>
<attribute name="javadoc_location" value="jar:file:.\null\Coursier\cache\v1\https\repo1.maven.org\maven2\com\typesafe\play\play-json_2.13\2.8.1\play-json_2.13-2.8.1-javadoc.jar!/"/>
</attributes>
</classpathentry>
<classpathentry sourcepath=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\org\webjars\flot\0.8.3\flot-0.8.3-sources.jar" kind="lib" path=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\org\webjars\flot\0.8.3\flot-0.8.3.jar">
<attributes>
<attribute name="javadoc_location" value="jar:file:.\null\Coursier\cache\v1\https\repo1.maven.org\maven2\org\webjars\flot\0.8.3\flot-0.8.3-javadoc.jar!/"/>
</attributes>
</classpathentry>
<classpathentry sourcepath=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\com\typesafe\akka\akka-parsing_2.13\10.1.11\akka-parsing_2.13-10.1.11-sources.jar" kind="lib" path=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\com\typesafe\akka\akka-parsing_2.13\10.1.11\akka-parsing_2.13-10.1.11.jar">
<attributes>
<attribute name="javadoc_location" value="jar:file:.\null\Coursier\cache\v1\https\repo1.maven.org\maven2\com\typesafe\akka\akka-parsing_2.13\10.1.11\akka-parsing_2.13-10.1.11-javadoc.jar!/"/>
</attributes>
</classpathentry>
<classpathentry kind="lib" path=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\org\webjars\explorercanvas\r3-1\explorercanvas-r3-1.jar">
<attributes>
<attribute name="javadoc_location" value="jar:file:.\null\Coursier\cache\v1\https\repo1.maven.org\maven2\org\webjars\explorercanvas\r3-1\explorercanvas-r3-1-javadoc.jar!/"/>
</attributes>
</classpathentry>
<classpathentry sourcepath=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\org\codehaus\mojo\animal-sniffer-annotations\1.18\animal-sniffer-annotations-1.18-sources.jar" kind="lib" path=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\org\codehaus\mojo\animal-sniffer-annotations\1.18\animal-sniffer-annotations-1.18.jar">
<attributes>
<attribute name="javadoc_location" value="jar:file:.\null\Coursier\cache\v1\https\repo1.maven.org\maven2\org\codehaus\mojo\animal-sniffer-annotations\1.18\animal-sniffer-annotations-1.18-javadoc.jar!/"/>
</attributes>
</classpathentry>
<classpathentry sourcepath=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\ch\qos\logback\logback-core\1.2.3\logback-core-1.2.3-sources.jar" kind="lib" path=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\ch\qos\logback\logback-core\1.2.3\logback-core-1.2.3.jar">
<attributes>
<attribute name="javadoc_location" value="jar:file:.\null\Coursier\cache\v1\https\repo1.maven.org\maven2\ch\qos\logback\logback-core\1.2.3\logback-core-1.2.3-javadoc.jar!/"/>
</attributes>
</classpathentry>
<classpathentry sourcepath=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\org\yaml\snakeyaml\1.24\snakeyaml-1.24-sources.jar" kind="lib" path=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\org\yaml\snakeyaml\1.24\snakeyaml-1.24.jar">
<attributes>
<attribute name="javadoc_location" value="jar:file:.\null\Coursier\cache\v1\https\repo1.maven.org\maven2\org\yaml\snakeyaml\1.24\snakeyaml-1.24-javadoc.jar!/"/>
</attributes>
</classpathentry>
<classpathentry sourcepath=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\org\hamcrest\hamcrest-core\1.3\hamcrest-core-1.3-sources.jar" kind="lib" path=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\org\hamcrest\hamcrest-core\1.3\hamcrest-core-1.3.jar">
<attributes>
<attribute name="javadoc_location" value="jar:file:.\null\Coursier\cache\v1\https\repo1.maven.org\maven2\org\hamcrest\hamcrest-core\1.3\hamcrest-core-1.3-javadoc.jar!/"/>
</attributes>
</classpathentry>
<classpathentry sourcepath=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\org\brotli\dec\0.1.2\dec-0.1.2-sources.jar" kind="lib" path=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\org\brotli\dec\0.1.2\dec-0.1.2.jar">
<attributes>
<attribute name="javadoc_location" value="jar:file:.\null\Coursier\cache\v1\https\repo1.maven.org\maven2\org\brotli\dec\0.1.2\dec-0.1.2-javadoc.jar!/"/>
</attributes>
</classpathentry>
<classpathentry sourcepath=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\org\springframework\spring-beans\5.2.2.RELEASE\spring-beans-5.2.2.RELEASE-sources.jar" kind="lib" path=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\org\springframework\spring-beans\5.2.2.RELEASE\spring-beans-5.2.2.RELEASE.jar">
<attributes>
<attribute name="javadoc_location" value="jar:file:.\null\Coursier\cache\v1\https\repo1.maven.org\maven2\org\springframework\spring-beans\5.2.2.RELEASE\spring-beans-5.2.2.RELEASE-javadoc.jar!/"/>
</attributes>
</classpathentry>
<classpathentry sourcepath=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\org\eclipse\jetty\jetty-client\9.4.20.v20190813\jetty-client-9.4.20.v20190813-sources.jar" kind="lib" path=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\org\eclipse\jetty\jetty-client\9.4.20.v20190813\jetty-client-9.4.20.v20190813.jar">
<attributes>
<attribute name="javadoc_location" value="jar:file:.\null\Coursier\cache\v1\https\repo1.maven.org\maven2\org\eclipse\jetty\jetty-client\9.4.20.v20190813\jetty-client-9.4.20.v20190813-javadoc.jar!/"/>
</attributes>
</classpathentry>
<classpathentry sourcepath=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\com\squareup\okhttp3\okhttp\3.11.0\okhttp-3.11.0-sources.jar" kind="lib" path=".\null\Coursier\cache\v1\https\repo1.maven.org\maven2\com\squareup\okhttp3\okhttp\3.11.0\okhttp-3.11.0.jar">
<attributes>
<attribute name="javadoc_location" value="jar:file:.\null\Coursier\cache\v1\https\repo1.maven.org\maven2\com\squareup\okhttp3\okhttp\3.11.0\okhttp-3.11.0-javadoc.jar!/"/>
</attributes>
</classpathentry>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
<classpathentry kind="output" path="bin"/>
</classpath>

+ 36
- 0
.gitignore View File

@@ -0,0 +1,36 @@
### PlayFramework ###
# Ignore Play! working directory #
bin/
/db
.eclipse
/lib/
/logs/
/modules
/project/project
/project/target
/target
tmp/
test-result
server.pid
*.eml
/dist/
.cache

### SBT ###
# Simple Build Tool
# http://www.scala-sbt.org/release/docs/Getting-Started/Directories.html#configuring-version-control

dist/*
target/
lib_managed/
src_managed/
project/boot/
project/plugins/project/
.history
.lib/

### SBT Patch ###
.bsp/

## Assets
app/assets/game/extra/

+ 13
- 0
.project View File

@@ -0,0 +1,13 @@
<projectDescription>
<name>ITSD Card Game</name>
<buildSpec>
<buildCommand>
<name>org.scala-ide.sdt.core.scalabuilder</name>
</buildCommand>
</buildSpec>
<natures>
<nature>org.scala-ide.sdt.core.scalanature</nature>
<nature>org.eclipse.jdt.core.javanature</nature>
</natures>
<linkedResources> </linkedResources>
</projectDescription>

+ 3
- 0
.settings/org.eclipse.core.resources.prefs View File

@@ -0,0 +1,3 @@
#Generated by sbteclipse
#Thu Feb 02 17:37:38 GMT 2023
encoding/<project>=UTF-8

+ 6
- 0
.settings/org.scala-ide.sdt.core.prefs View File

@@ -0,0 +1,6 @@
#Generated by sbteclipse
#Thu Feb 02 17:37:38 GMT 2023
scala.compiler.useProjectSettings=true
unchecked=true
scala.compiler.additionalParams=-encoding utf8
deprecation=true

+ 116
- 0
LICENSE View File

@@ -0,0 +1,116 @@
CC0 1.0 Universal

Statement of Purpose

The laws of most jurisdictions throughout the world automatically confer
exclusive Copyright and Related Rights (defined below) upon the creator and
subsequent owner(s) (each and all, an "owner") of an original work of
authorship and/or a database (each, a "Work").

Certain owners wish to permanently relinquish those rights to a Work for the
purpose of contributing to a commons of creative, cultural and scientific
works ("Commons") that the public can reliably and without fear of later
claims of infringement build upon, modify, incorporate in other works, reuse
and redistribute as freely as possible in any form whatsoever and for any
purposes, including without limitation commercial purposes. These owners may
contribute to the Commons to promote the ideal of a free culture and the
further production of creative, cultural and scientific works, or to gain
reputation or greater distribution for their Work in part through the use and
efforts of others.

For these and/or other purposes and motivations, and without any expectation
of additional consideration or compensation, the person associating CC0 with a
Work (the "Affirmer"), to the extent that he or she is an owner of Copyright
and Related Rights in the Work, voluntarily elects to apply CC0 to the Work
and publicly distribute the Work under its terms, with knowledge of his or her
Copyright and Related Rights in the Work and the meaning and intended legal
effect of CC0 on those rights.

1. Copyright and Related Rights. A Work made available under CC0 may be
protected by copyright and related or neighboring rights ("Copyright and
Related Rights"). Copyright and Related Rights include, but are not limited
to, the following:

i. the right to reproduce, adapt, distribute, perform, display, communicate,
and translate a Work;

ii. moral rights retained by the original author(s) and/or performer(s);

iii. publicity and privacy rights pertaining to a person's image or likeness
depicted in a Work;

iv. rights protecting against unfair competition in regards to a Work,
subject to the limitations in paragraph 4(a), below;

v. rights protecting the extraction, dissemination, use and reuse of data in
a Work;

vi. database rights (such as those arising under Directive 96/9/EC of the
European Parliament and of the Council of 11 March 1996 on the legal
protection of databases, and under any national implementation thereof,
including any amended or successor version of such directive); and

vii. other similar, equivalent or corresponding rights throughout the world
based on applicable law or treaty, and any national implementations thereof.

2. Waiver. To the greatest extent permitted by, but not in contravention of,
applicable law, Affirmer hereby overtly, fully, permanently, irrevocably and
unconditionally waives, abandons, and surrenders all of Affirmer's Copyright
and Related Rights and associated claims and causes of action, whether now
known or unknown (including existing as well as future claims and causes of
action), in the Work (i) in all territories worldwide, (ii) for the maximum
duration provided by applicable law or treaty (including future time
extensions), (iii) in any current or future medium and for any number of
copies, and (iv) for any purpose whatsoever, including without limitation
commercial, advertising or promotional purposes (the "Waiver"). Affirmer makes
the Waiver for the benefit of each member of the public at large and to the
detriment of Affirmer's heirs and successors, fully intending that such Waiver
shall not be subject to revocation, rescission, cancellation, termination, or
any other legal or equitable action to disrupt the quiet enjoyment of the Work
by the public as contemplated by Affirmer's express Statement of Purpose.

3. Public License Fallback. Should any part of the Waiver for any reason be
judged legally invalid or ineffective under applicable law, then the Waiver
shall be preserved to the maximum extent permitted taking into account
Affirmer's express Statement of Purpose. In addition, to the extent the Waiver
is so judged Affirmer hereby grants to each affected person a royalty-free,
non transferable, non sublicensable, non exclusive, irrevocable and
unconditional license to exercise Affirmer's Copyright and Related Rights in
the Work (i) in all territories worldwide, (ii) for the maximum duration
provided by applicable law or treaty (including future time extensions), (iii)
in any current or future medium and for any number of copies, and (iv) for any
purpose whatsoever, including without limitation commercial, advertising or
promotional purposes (the "License"). The License shall be deemed effective as
of the date CC0 was applied by Affirmer to the Work. Should any part of the
License for any reason be judged legally invalid or ineffective under
applicable law, such partial invalidity or ineffectiveness shall not
invalidate the remainder of the License, and in such case Affirmer hereby
affirms that he or she will not (i) exercise any of his or her remaining
Copyright and Related Rights in the Work or (ii) assert any associated claims
and causes of action with respect to the Work, in either case contrary to
Affirmer's express Statement of Purpose.

4. Limitations and Disclaimers.

a. No trademark or patent rights held by Affirmer are waived, abandoned,
surrendered, licensed or otherwise affected by this document.

b. Affirmer offers the Work as-is and makes no representations or warranties
of any kind concerning the Work, express, implied, statutory or otherwise,
including without limitation warranties of title, merchantability, fitness
for a particular purpose, non infringement, or the absence of latent or
other defects, accuracy, or the present or absence of errors, whether or not
discoverable, all to the greatest extent permissible under applicable law.

c. Affirmer disclaims responsibility for clearing rights of other persons
that may apply to the Work or any use thereof, including without limitation
any person's Copyright and Related Rights in the Work. Further, Affirmer
disclaims responsibility for obtaining any necessary consents, permissions
or other rights required for any use of the Work.

d. Affirmer understands and acknowledges that Creative Commons is not a
party to this document and has no duty or obligation with respect to this
CC0 or use of the Work.

For more information, please see
<http://creativecommons.org/publicdomain/zero/1.0/>

+ 8
- 0
NOTICE View File

@@ -0,0 +1,8 @@
Written by Lightbend <info@lightbend.com>

To the extent possible under law, the author(s) have dedicated all copyright and
related and neighboring rights to this software to the public domain worldwide.
This software is distributed without any warranty.

You should have received a copy of the CC0 Public Domain Dedication along with
this software. If not, see <http://creativecommons.org/publicdomain/zero/1.0/>.

+ 2
- 0
README.md View File

@@ -0,0 +1,2 @@
# ITSDTeamProject-0

+ 121
- 0
app/actors/GameActor.java View File

@@ -0,0 +1,121 @@
package actors;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode;
import akka.actor.AbstractActor;
import akka.actor.ActorRef;
import events.CardClicked;
import events.EndTurnClicked;
import events.EventProcessor;
import events.Heartbeat;
import events.Initalize;
import events.OtherClicked;
import events.TileClicked;
import events.UnitMoving;
import events.UnitStopped;
import play.libs.Json;
import structures.GameState;
import utils.ImageListForPreLoad;
import play.libs.Json;
/**
* The game actor is an Akka Actor that receives events from the user front-end UI (e.g. when
* the user clicks on the board) via a websocket connection. When an event arrives, the
* processMessage() method is called, which can be used to react to the event. The Game actor
* also includes an ActorRef object which can be used to issue commands to the UI to change
* what the user sees. The GameActor is created when the user browser creates a websocket
* connection to back-end services (on load of the game web page).
* @author Dr. Richard McCreadie
*
*/
public class GameActor extends AbstractActor {
private ObjectMapper mapper = new ObjectMapper(); // Jackson Java Object Serializer, is used to turn java objects to Strings
private ActorRef out; // The ActorRef can be used to send messages to the front-end UI
private Map<String,EventProcessor> eventProcessors; // Classes used to process each type of event
private GameState gameState; // A class that can be used to hold game state information
/**
* Constructor for the GameActor. This is called by the GameController when the websocket
* connection to the front-end is established.
* @param out
*/
@SuppressWarnings("deprecation")
public GameActor(ActorRef out) {
this.out = out; // save this, so we can send commands to the front-end later
// create class instances to respond to the various events that we might recieve
eventProcessors = new HashMap<String,EventProcessor>();
eventProcessors.put("initalize", new Initalize());
eventProcessors.put("heartbeat", new Heartbeat());
eventProcessors.put("unitMoving", new UnitMoving());
eventProcessors.put("unitstopped", new UnitStopped());
eventProcessors.put("tileclicked", new TileClicked());
eventProcessors.put("cardclicked", new CardClicked());
eventProcessors.put("endturnclicked", new EndTurnClicked());
eventProcessors.put("otherclicked", new OtherClicked());
// Initalize a new game state object
gameState = new GameState();
// Get the list of image files to pre-load the UI with
Set<String> images = ImageListForPreLoad.getImageListForPreLoad();
try {
ObjectNode readyMessage = Json.newObject();
readyMessage.put("messagetype", "actorReady");
readyMessage.put("preloadImages", mapper.readTree(mapper.writeValueAsString(images)));
out.tell(readyMessage, out);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* This method simply farms out the processing of the json messages from the front-end to the
* processMessage method
* @return
*/
public Receive createReceive() {
return receiveBuilder()
.match(JsonNode.class, message -> {
System.out.println(message);
processMessage(message.get("messagetype").asText(), message);
}).build();
}
/**
* This looks up an event processor for the specified message type.
* Note that this processing is asynchronous.
* @param messageType
* @param message
* @return
* @throws Exception
*/
@SuppressWarnings({"deprecation"})
public void processMessage(String messageType, JsonNode message) throws Exception{
EventProcessor processor = eventProcessors.get(messageType);
if (processor==null) {
// Unknown event type received
System.err.println("GameActor: Recieved unknown event type "+messageType);
} else {
processor.processEvent(out, gameState, message); // process the event
}
}
public void reportError(String errorText) {
ObjectNode returnMessage = Json.newObject();
returnMessage.put("messagetype", "ERR");
returnMessage.put("error", errorText);
out.tell(returnMessage, out);
}
}

+ 1038
- 0
app/assets/js/cardgame.js
File diff suppressed because it is too large
View File


+ 2304
- 0
app/assets/js/core.js
File diff suppressed because it is too large
View File


+ 1
- 0
app/assets/js/core.js.map
File diff suppressed because it is too large
View File


+ 40422
- 0
app/assets/js/hexi.js
File diff suppressed because it is too large
View File


+ 18
- 0
app/assets/js/hexi.min.js
File diff suppressed because it is too large
View File


+ 1
- 0
app/assets/js/jquery.3.4.1.js
File diff suppressed because it is too large
View File


+ 9082
- 0
app/assets/js/modules.js
File diff suppressed because it is too large
View File


+ 22
- 0
app/assets/js/pixi.min.js
File diff suppressed because it is too large
View File


+ 417
- 0
app/commands/BasicCommands.java View File

@@ -0,0 +1,417 @@
package commands;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode;
import akka.actor.ActorRef;
import play.libs.Json;
import structures.basic.Card;
import structures.basic.EffectAnimation;
import structures.basic.Player;
import structures.basic.Tile;
import structures.basic.Unit;
import structures.basic.UnitAnimation;
import structures.basic.UnitAnimationType;
/**
* This is a utility class that simply provides short-cut methods for
* running the basic command set for the game.
*
* @author Dr. Richard McCreadie
*
*/
public class BasicCommands {
private static ObjectMapper mapper = new ObjectMapper(); // Jackson Java Object Serializer, is used to turn java objects to Strings
// An alternative class with a 'tell' implementation can be given if writing unit tests
// and need to have a null ActorRef. This should be null during normal operation.
public static DummyTell altTell = null;
/**
* You can consider the contents of the user’s browser window a canvas that can be drawn upon. drawTile will draw
* the image of a board tile on the board. This command takes as input a Tile object and a visualisation mode (an
* integer) that specifies which version of the tile to render (each tile has multiple versions, e.g. normal vs.
* highlighted). This command can be used multiple times to change the visualisation mode for a tile.
* @param out
* @param tile
* @param mode
*/
@SuppressWarnings({"deprecation"})
public static void drawTile(ActorRef out, Tile tile, int mode) {
try {
ObjectNode returnMessage = Json.newObject();
returnMessage.put("messagetype", "drawTile");
returnMessage.put("tile", mapper.readTree(mapper.writeValueAsString(tile)));
returnMessage.put("mode", mode);
if (altTell!=null) altTell.tell(returnMessage);
else out.tell(returnMessage, out);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* drawUnit will draw the sprite for a unit (a picture of that unit with its attack and health values) on the board.
* This command takes as input a target Tile (a ‘square’ of the main game grid) to place the unit’s sprite upon,
* and the instance of the Unit (which holds the needed information about how to draw that unit).
* @param out
* @param unit
* @param tile
*/
@SuppressWarnings({"deprecation"})
public static void drawUnit(ActorRef out, Unit unit, Tile tile) {
try {
ObjectNode returnMessage = Json.newObject();
returnMessage.put("messagetype", "drawUnit");
returnMessage.put("tile", mapper.readTree(mapper.writeValueAsString(tile)));
returnMessage.put("unit", mapper.readTree(mapper.writeValueAsString(unit)));
if (altTell!=null) altTell.tell(returnMessage);
else out.tell(returnMessage, out);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* This command changes the visualised attack value just under a unit’s sprite to a value between 0
* and 20. The command takes in a unit instance. The associated values are read from the unit object.
* @param out
* @param unit
* @param attack
*/
@SuppressWarnings({"deprecation"})
public static void setUnitAttack(ActorRef out, Unit unit, int attack) {
try {
ObjectNode returnMessage = Json.newObject();
returnMessage.put("messagetype", "setUnitAttack");
returnMessage.put("unit", mapper.readTree(mapper.writeValueAsString(unit)));
returnMessage.put("attack", attack);
if (altTell!=null) altTell.tell(returnMessage);
else out.tell(returnMessage, out);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* This command changes the visualised health value just under a unit’s sprite to a value between 0
* and 20. The command takes in a unit instance. The associated values are read from the unit object.
* @param out
* @param unit
* @param health
*/
@SuppressWarnings({"deprecation"})
public static void setUnitHealth(ActorRef out, Unit unit, int health) {
try {
ObjectNode returnMessage = Json.newObject();
returnMessage.put("messagetype", "setUnitHealth");
returnMessage.put("unit", mapper.readTree(mapper.writeValueAsString(unit)));
returnMessage.put("health", health);
if (altTell!=null) altTell.tell(returnMessage);
else out.tell(returnMessage, out);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* This command moves a unit sprite from one tile to another. It takes in the unit’s object and the target Tile.
* Note that this command will start the movement, it may take multiple seconds for the movement to complete.
* @param out
* @param unit
* @param tile
*/
@SuppressWarnings({"deprecation"})
public static void moveUnitToTile(ActorRef out, Unit unit, Tile tile) {
try {
ObjectNode returnMessage = Json.newObject();
returnMessage.put("messagetype", "moveUnitToTile");
returnMessage.put("unit", mapper.readTree(mapper.writeValueAsString(unit)));
returnMessage.put("tile", mapper.readTree(mapper.writeValueAsString(tile)));
if (altTell!=null) altTell.tell(returnMessage);
else out.tell(returnMessage, out);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* This command moves a unit sprite from one tile to another. It takes in the unit’s object and the target Tile.
* Note that this command will start the movement, it may take multiple seconds for the movement to complete.
* yfirst sets whether the move should move the unit vertically first before moving horizontally
* @param out
* @param yfirst
* @param unit
* @param tile
*/
@SuppressWarnings({"deprecation"})
public static void moveUnitToTile(ActorRef out, Unit unit, Tile tile, boolean yfirst) {
try {
ObjectNode returnMessage = Json.newObject();
returnMessage.put("messagetype", "moveUnitToTile");
returnMessage.put("yfirst", yfirst);
returnMessage.put("unit", mapper.readTree(mapper.writeValueAsString(unit)));
returnMessage.put("tile", mapper.readTree(mapper.writeValueAsString(tile)));
if (altTell!=null) altTell.tell(returnMessage);
else out.tell(returnMessage, out);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* This command makes a unit play a specified animation. It takes in the unit object which
* contains all of the data needed to play the animations, and a UnitAnimation that specifies
* which animation to switch to.
*
* This method now returns an estimate for the number of milliseconds until the animation completes
* playing in the browser. Ignore this if it is a looping animation.
* @param out
* @param unit
* @param animation
*/
@SuppressWarnings({"deprecation"})
public static int playUnitAnimation(ActorRef out, Unit unit, UnitAnimationType animationToPlay) {
try {
unit.setAnimation(animationToPlay);
ObjectNode returnMessage = Json.newObject();
returnMessage.put("messagetype", "playUnitAnimation");
returnMessage.put("unit", mapper.readTree(mapper.writeValueAsString(unit)));
returnMessage.put("animation", animationToPlay.toString());
if (altTell!=null) altTell.tell(returnMessage);
else out.tell(returnMessage, out);
// estimate the time needed for the animation to play
UnitAnimation animation = null;
if (animationToPlay.equals(UnitAnimationType.idle)) animation = unit.getAnimations().getIdle();
if (animationToPlay.equals(UnitAnimationType.attack)) animation = unit.getAnimations().getAttack();
if (animationToPlay.equals(UnitAnimationType.channel)) animation = unit.getAnimations().getChannel();
if (animationToPlay.equals(UnitAnimationType.death)) animation = unit.getAnimations().getDeath();
if (animationToPlay.equals(UnitAnimationType.hit)) animation = unit.getAnimations().getHit();
if (animationToPlay.equals(UnitAnimationType.move)) animation = unit.getAnimations().getMove();
if (animation==null) return 0;
return ((1000*(animation.getFrameStartEndIndices()[1]-animation.getFrameStartEndIndices()[0]))/animation.getFps())+50;
} catch (Exception e) {
e.printStackTrace();
return 0;
}
}
/**
* This will delete a unit instance from the board. It takes as input the unit object of the unit.
* @param out
* @param unit
*/
@SuppressWarnings({"deprecation"})
public static void deleteUnit(ActorRef out, Unit unit) {
try {
ObjectNode returnMessage = Json.newObject();
returnMessage.put("messagetype", "deleteUnit");
returnMessage.put("unit", mapper.readTree(mapper.writeValueAsString(unit)));
if (altTell!=null) altTell.tell(returnMessage);
else out.tell(returnMessage, out);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* This command changes the visualised health value in the player’s information card to a value between 0
* and 20. The command takes in a basic player instance. The associated values are read from the basic player
* object.
* @param out
* @param player
*/
@SuppressWarnings({"deprecation"})
public static void setPlayer1Health(ActorRef out, Player player) {
try {
ObjectNode returnMessage = Json.newObject();
returnMessage.put("messagetype", "setPlayer1Health");
returnMessage.put("player", mapper.readTree(mapper.writeValueAsString(player)));
if (altTell!=null) altTell.tell(returnMessage);
else out.tell(returnMessage, out);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* This command changes the visualised health value in the player’s information card to a value between 0
* and 20. The command takes in a basic player instance. The associated values are read from the basic player
* object.
* @param out
* @param player
*/
@SuppressWarnings({"deprecation"})
public static void setPlayer2Health(ActorRef out, Player player) {
try {
ObjectNode returnMessage = Json.newObject();
returnMessage.put("messagetype", "setPlayer2Health");
returnMessage.put("player", mapper.readTree(mapper.writeValueAsString(player)));
if (altTell!=null) altTell.tell(returnMessage);
else out.tell(returnMessage, out);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* This command changes the visualised mana value in the player’s information card to a value between 0
* and 9. The command takes in a basic player instance. The associated values are read from the basic player
* object.
* @param out
* @param player
*/
@SuppressWarnings({"deprecation"})
public static void setPlayer1Mana(ActorRef out, Player player) {
try {
ObjectNode returnMessage = Json.newObject();
returnMessage.put("messagetype", "setPlayer1Mana");
returnMessage.put("player", mapper.readTree(mapper.writeValueAsString(player)));
if (altTell!=null) altTell.tell(returnMessage);
else out.tell(returnMessage, out);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* This command changes the visualised mana value in the player’s information card to a value between 0
* and 9. The command takes in a basic player instance. The associated values are read from the basic player
* object.
* @param out
* @param player
*/
@SuppressWarnings({"deprecation"})
public static void setPlayer2Mana(ActorRef out, Player player) {
try {
ObjectNode returnMessage = Json.newObject();
returnMessage.put("messagetype", "setPlayer2Mana");
returnMessage.put("player", mapper.readTree(mapper.writeValueAsString(player)));
if (altTell!=null) altTell.tell(returnMessage);
else out.tell(returnMessage, out);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* This command renders a card in the player’s hand. It takes as input a hand position (a value between 1-6), a
* Card (which is an object containing basic information needed to visualise that card) and a visualisation mode
* (similarly to a tile). This command can be issued multiple times to change the visualisation mode of a card.
* @param out
* @param card
* @param position
* @param mode
*/
@SuppressWarnings({"deprecation"})
public static void drawCard(ActorRef out, Card card, int position, int mode) {
try {
ObjectNode returnMessage = Json.newObject();
returnMessage.put("messagetype", "drawCard");
returnMessage.put("card", mapper.readTree(mapper.writeValueAsString(card)));
returnMessage.put("position", position);
returnMessage.put("mode", mode);
if (altTell!=null) altTell.tell(returnMessage);
else out.tell(returnMessage, out);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* This command deletes a card in the player’s hand. It takes as input a hand position (a value between 1-6).
* @param out
* @param position
*/
public static void deleteCard(ActorRef out, int position) {
try {
ObjectNode returnMessage = Json.newObject();
returnMessage.put("messagetype", "deleteCard");
returnMessage.put("position", position);
if (altTell!=null) altTell.tell(returnMessage);
else out.tell(returnMessage, out);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* Plays a specified EffectAnimation (such as an explosion) centred on a particular Tile. It takes as input an
* EffectAnimation (an object with information about rendering the effect) and a target Tile.
*
* This method has been updated to provide an estimate of the time until the animation will finish playing
* @param out
* @param effect
* @param tile
*/
@SuppressWarnings({"deprecation"})
public static int playEffectAnimation(ActorRef out, EffectAnimation effect, Tile tile) {
try {
ObjectNode returnMessage = Json.newObject();
returnMessage.put("messagetype", "playEffectAnimation");
returnMessage.put("effect", mapper.readTree(mapper.writeValueAsString(effect)));
returnMessage.put("tile", mapper.readTree(mapper.writeValueAsString(tile)));
if (altTell!=null) altTell.tell(returnMessage);
else out.tell(returnMessage, out);
return ((1000*effect.getAnimationTextures().size())/effect.getFps())+50;
} catch (Exception e) {
e.printStackTrace();
return 0;
}
}
/**
* This command creates a notification box next to the portrait for the player 1 which contains
* the specified text. It will be displayed for a number of seconds before being removed.
* object.
* @param out
* @param text
* @param displayTimeSeconds
*/
public static void addPlayer1Notification(ActorRef out, String text, int displayTimeSeconds) {
try {
ObjectNode returnMessage = Json.newObject();
returnMessage.put("messagetype", "addPlayer1Notification");
returnMessage.put("text", text);
returnMessage.put("seconds", displayTimeSeconds);
if (altTell!=null) altTell.tell(returnMessage);
else out.tell(returnMessage, out);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* Plays a projectile fire animation between two tiles
* @param out
* @param effect
* @param tile
*/
@SuppressWarnings({"deprecation"})
public static void playProjectileAnimation(ActorRef out, EffectAnimation effect, int mode, Tile startTile, Tile targetTile) {
try {
ObjectNode returnMessage = Json.newObject();
returnMessage.put("messagetype", "drawProjectile");
returnMessage.put("effect", mapper.readTree(mapper.writeValueAsString(effect)));
returnMessage.put("tile", mapper.readTree(mapper.writeValueAsString(startTile)));
returnMessage.put("targetTile", mapper.readTree(mapper.writeValueAsString(targetTile)));
returnMessage.put("mode", mapper.readTree(mapper.writeValueAsString(mode)));
if (altTell!=null) altTell.tell(returnMessage);
else out.tell(returnMessage, out);
} catch (Exception e) {
e.printStackTrace();
}
}
}

+ 14
- 0
app/commands/CheckMessageIsNotNullOnTell.java View File

@@ -0,0 +1,14 @@
package commands;
import static org.junit.Assert.assertNotNull;
import com.fasterxml.jackson.databind.node.ObjectNode;
public class CheckMessageIsNotNullOnTell implements DummyTell {
@Override
public void tell(ObjectNode message) {
assertNotNull(message);
}
}

+ 19
- 0
app/commands/DummyTell.java View File

@@ -0,0 +1,19 @@
package commands;
import com.fasterxml.jackson.databind.node.ObjectNode;
public interface DummyTell {
/**
* This is a method that can be used to replace the normal tell logic
* when sending commands to avoid issues when building unit tests where
* ActorRef is null
*
* If writing a unit test you can add a class that implements this interface
* and set BasicCommands.altTell = <your class> to avoid calling ActorRef.tell
* and call altTell.tell instead.
* @param message
*/
public void tell(ObjectNode message);
}

+ 60
- 0
app/controllers/GameScreenController.java View File

@@ -0,0 +1,60 @@
package controllers;
import javax.inject.Inject;
import actors.GameActor;
import akka.actor.ActorRef;
import akka.actor.ActorSystem;
import akka.actor.Props;
import akka.stream.Materializer;
import play.data.Form;
import play.data.FormFactory;
import play.libs.streams.ActorFlow;
import play.mvc.Controller;
import play.mvc.Http;
import play.mvc.Result;
import play.mvc.WebSocket;
import structures.User;
/**
* This is the Controller class for the game.
* @author Dr. Richard McCreadie
*
*/
public class GameScreenController extends Controller {
private final ActorSystem actorSystem;
private final Materializer materializer;
Form<User> userForm = null;
@Inject
public GameScreenController(FormFactory formFactory, ActorSystem actorSystem, Materializer materializer) {
this.actorSystem = actorSystem;
this.materializer = materializer;
userForm = formFactory.form(User.class);
}
/**
* This responds to the request for creation of the Websocket
* @return
*/
public WebSocket socket() {
return WebSocket.Json.accept(
request -> ActorFlow.actorRef(this::createGameActor, actorSystem, materializer));
}
/**
* This method responds to the original request for the /game screen
* @param request
* @return
*/
public Result index(Http.Request request) {
return ok(views.html.gamescreen.render(request, null));
}
public Props createGameActor(ActorRef out) {
return Props.create(GameActor.class, out); // calls the constructor for Game Actor
}
}

+ 242
- 0
app/demo/CommandDemo.java View File

@@ -0,0 +1,242 @@
package demo;
import akka.actor.ActorRef;
import commands.BasicCommands;
import structures.basic.Card;
import structures.basic.EffectAnimation;
import structures.basic.Player;
import structures.basic.Tile;
import structures.basic.Unit;
import structures.basic.UnitAnimationType;
import utils.BasicObjectBuilders;
import utils.OrderedCardLoader;
import utils.StaticConfFiles;
/**
* This class contains an illustration of calling all of the commands provided
* in the ITSD Card Game Template
* @author Dr. Richard McCreadie
*
*/
public class CommandDemo {
/**
* This is a demo of the various commands that can be executed
*
* WARNING: This is a very long-running method, as it has a lot
* thread sleeps in it. The back-end will not respond to commands
* while this method is processing, e.g. if you refresh the game
* page or try to kill the server you will get a long delay before
* anything happens.
*/
public static void executeDemo(ActorRef out) {
BasicCommands.addPlayer1Notification(out, "Command Demo", 2);
try {Thread.sleep(2000);} catch (InterruptedException e) {e.printStackTrace();} // these cause processing to wait for a number of milliseconds.
// addPlayer1Notification
BasicCommands.addPlayer1Notification(out, "addPlayer1Notification", 2);
try {Thread.sleep(2000);} catch (InterruptedException e) {e.printStackTrace();}
//--------------------------------------------------------
// Basic Draw Commands
// -------------------------------------------------------
// drawTile
BasicCommands.addPlayer1Notification(out, "drawTile[3,2]", 2);
Tile tile = BasicObjectBuilders.loadTile(3, 2);
BasicCommands.drawTile(out, tile, 0);
try {Thread.sleep(2000);} catch (InterruptedException e) {e.printStackTrace();}
// drawUnit
BasicCommands.addPlayer1Notification(out, "drawUnit", 2);
Unit unit = BasicObjectBuilders.loadUnit(StaticConfFiles.humanAvatar, 0, Unit.class);
unit.setPositionByTile(tile);
BasicCommands.drawUnit(out, unit, tile);
try {Thread.sleep(2000);} catch (InterruptedException e) {e.printStackTrace();}
// setUnitAttack
BasicCommands.addPlayer1Notification(out, "setUnitAttack", 2);
BasicCommands.setUnitAttack(out, unit, 2);
try {Thread.sleep(2000);} catch (InterruptedException e) {e.printStackTrace();}
// setUnitHealth
BasicCommands.addPlayer1Notification(out, "setUnitHealth", 2);
BasicCommands.setUnitHealth(out, unit, 2);
try {Thread.sleep(2000);} catch (InterruptedException e) {e.printStackTrace();}
//--------------------------------------------------------
// Playing Unit Animations
// -------------------------------------------------------
// playUnitAnimation [Move]
BasicCommands.addPlayer1Notification(out, "playUnitAnimation [Move]", 2);
BasicCommands.playUnitAnimation(out, unit, UnitAnimationType.move);
try {Thread.sleep(2000);} catch (InterruptedException e) {e.printStackTrace();}
// playUnitAnimation [Attack]
BasicCommands.addPlayer1Notification(out, "playUnitAnimation [Attack]", 2);
BasicCommands.playUnitAnimation(out, unit, UnitAnimationType.attack);
try {Thread.sleep(2000);} catch (InterruptedException e) {e.printStackTrace();}
// playUnitAnimation [Death]
BasicCommands.addPlayer1Notification(out, "playUnitAnimation [Death]", 3);
BasicCommands.playUnitAnimation(out, unit, UnitAnimationType.death);
try {Thread.sleep(3000);} catch (InterruptedException e) {e.printStackTrace();}
//--------------------------------------------------------
// Deleting a Unit
//-------------------------------------------------------
// deleteUnit
BasicCommands.addPlayer1Notification(out, "deleteUnit", 2);
BasicCommands.deleteUnit(out, unit);
try {Thread.sleep(2000);} catch (InterruptedException e) {e.printStackTrace();}
//--------------------------------------------------------
// Movement
//-------------------------------------------------------
// drawTile
BasicCommands.addPlayer1Notification(out, "drawTile[3,2] Highlight", 2);
BasicCommands.drawTile(out, tile, 1);
try {Thread.sleep(2000);} catch (InterruptedException e) {e.printStackTrace();}
// drawTile
BasicCommands.addPlayer1Notification(out, "drawTile[3,2] Red Highlight", 2);
BasicCommands.drawTile(out, tile, 2);
try {Thread.sleep(2000);} catch (InterruptedException e) {e.printStackTrace();}
// drawTile
BasicCommands.addPlayer1Notification(out, "drawTile[3,2]", 2);
BasicCommands.drawTile(out, tile, 0);
try {Thread.sleep(2000);} catch (InterruptedException e) {e.printStackTrace();}
// drawTile
BasicCommands.addPlayer1Notification(out, "drawTile[4,2]", 2);
Tile tile3 = BasicObjectBuilders.loadTile(4, 2);
BasicCommands.drawTile(out, tile3, 0);
try {Thread.sleep(2000);} catch (InterruptedException e) {e.printStackTrace();}
// drawTile
BasicCommands.addPlayer1Notification(out, "drawTile[5,2]", 2);
Tile tile4 = BasicObjectBuilders.loadTile(5, 2);
BasicCommands.drawTile(out, tile4, 0);
try {Thread.sleep(2000);} catch (InterruptedException e) {e.printStackTrace();}
// drawTile
BasicCommands.addPlayer1Notification(out, "drawTile[5,3]", 2);
Tile tile5 = BasicObjectBuilders.loadTile(5, 3);
BasicCommands.drawTile(out, tile5, 0);
try {Thread.sleep(2000);} catch (InterruptedException e) {e.printStackTrace();}
BasicCommands.addPlayer1Notification(out, "drawUnit", 1);
Unit unit2 = BasicObjectBuilders.loadUnit(StaticConfFiles.wraithling, 1, Unit.class);
unit2.setPositionByTile(tile);
BasicCommands.drawUnit(out, unit2, tile);
try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}
BasicCommands.addPlayer1Notification(out, "moveUnitToTile", 3);
BasicCommands.moveUnitToTile(out, unit2, tile5);
try {Thread.sleep(4000);} catch (InterruptedException e) {e.printStackTrace();}
BasicCommands.addPlayer1Notification(out, "moveUnitToTile (y-axis first)", 3);
BasicCommands.moveUnitToTile(out, unit2, tile, true);
try {Thread.sleep(4000);} catch (InterruptedException e) {e.printStackTrace();}
BasicCommands.addPlayer1Notification(out, "deleteUnit", 2);
BasicCommands.deleteUnit(out, unit2);
try {Thread.sleep(2000);} catch (InterruptedException e) {e.printStackTrace();}
//--------------------------------------------------------
// Player Display Data
//-------------------------------------------------------
// Player Cards
BasicCommands.addPlayer1Notification(out, "Player Test", 2);
try {Thread.sleep(2000);} catch (InterruptedException e) {e.printStackTrace();}
// setPlayer1Health
BasicCommands.addPlayer1Notification(out, "setPlayer1Health", 2);
Player humanPlayer = new Player(20, 0);
BasicCommands.setPlayer1Health(out, humanPlayer);
try {Thread.sleep(2000);} catch (InterruptedException e) {e.printStackTrace();}
// setPlayer1Health
BasicCommands.addPlayer1Notification(out, "setPlayer2Health", 2);
Player aiPlayer = new Player(20, 0);
BasicCommands.setPlayer2Health(out, aiPlayer);
try {Thread.sleep(2000);} catch (InterruptedException e) {e.printStackTrace();}
// Mana
for (int m = 0; m<10; m++) {
BasicCommands.addPlayer1Notification(out, "setPlayer1Mana ("+m+")", 1);
humanPlayer.setMana(m);
BasicCommands.setPlayer1Mana(out, humanPlayer);
try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}
}
// Mana
for (int m = 0; m<10; m++) {
BasicCommands.addPlayer1Notification(out, "setPlayer2Mana ("+m+")", 1);
aiPlayer.setMana(m);
BasicCommands.setPlayer2Mana(out, aiPlayer);
try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}
}
//--------------------------------------------------------
// Rendering Cards
//-------------------------------------------------------
// Unhighlighted
int handPosition = 1;
for (Card card : OrderedCardLoader.getPlayer1Cards(1)) {
BasicCommands.drawCard(out, card, handPosition, 0);
try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}
handPosition++;
if (handPosition>6) break;
}
// highlighted
handPosition = 1;
for (Card card : OrderedCardLoader.getPlayer1Cards(1)) {
BasicCommands.drawCard(out, card, handPosition, 1);
try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}
handPosition++;
if (handPosition>6) break;
}
// delete card
handPosition = 1;
for (int i=1; i<7; i++) {
BasicCommands.deleteCard(out, i);
try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}
}
//--------------------------------------------------------
// Test New Stuff from the 2024 Template
//-------------------------------------------------------
BasicCommands.addPlayer1Notification(out, "2024 Loader Check", 2);
try {Thread.sleep(2000);} catch (InterruptedException e) {e.printStackTrace();}
Loaders_2024_Check.test(out); // moved 2024 tests in here
}
}

+ 149
- 0
app/demo/Loaders_2024_Check.java View File

@@ -0,0 +1,149 @@
package demo;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import akka.actor.ActorRef;
import commands.BasicCommands;
import structures.basic.Card;
import structures.basic.EffectAnimation;
import structures.basic.Tile;
import structures.basic.Unit;
import structures.basic.UnitAnimationType;
import utils.BasicObjectBuilders;
import utils.OrderedCardLoader;
import utils.StaticConfFiles;
public class Loaders_2024_Check {
/**
* This is a test of the loading and rendering for the 2024 unit
* set. It exists as a convenient way for Richard to check that he
* has not broken anything when he updated the template to add the
* new 2024 decks.
*/
public static void test(ActorRef out) {
// drawTile
Tile tile = BasicObjectBuilders.loadTile(3, 2);
BasicCommands.drawTile(out, tile, 0);
try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();} // these cause processing to wait for a number of milliseconds.
//--------------------------------------------------------
// Test Cards and their Units
// -------------------------------------------------------
BasicCommands.addPlayer1Notification(out, "Test Cards / Units", 2);
List<Card> cards = new ArrayList<Card>();
cards.addAll(OrderedCardLoader.getPlayer1Cards(1));
cards.addAll(OrderedCardLoader.getPlayer2Cards(1));
// Run test for all cards
for (Card card : cards) {
BasicCommands.addPlayer1Notification(out, card.getCardname(), 2);
// drawCard [1]
BasicCommands.drawCard(out, card, 1, 0);
try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}
// drawCard [1] Highlight
BasicCommands.drawCard(out, card, 1, 1);
try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}
int unitID = 0;
if (card.isCreature()) {
Unit unit = BasicObjectBuilders.loadUnit(card.getUnitConfig(), unitID, Unit.class);
unit.setPositionByTile(tile);
BasicCommands.drawUnit(out, unit, tile);
try {Thread.sleep(2000);} catch (InterruptedException e) {e.printStackTrace();}
// playUnitAnimation [Move] and wait for a period until the animation does one cycle
try {Thread.sleep(BasicCommands.playUnitAnimation(out, unit, UnitAnimationType.move));} catch (InterruptedException e) {e.printStackTrace();}
// playUnitAnimation [Attack] and wait for a period until the animation does one cycle
try {Thread.sleep(BasicCommands.playUnitAnimation(out, unit, UnitAnimationType.attack));} catch (InterruptedException e) {e.printStackTrace();}
// playUnitAnimation [Attack] and wait for a period until the animation does one cycle
try {Thread.sleep(BasicCommands.playUnitAnimation(out, unit, UnitAnimationType.hit));} catch (InterruptedException e) {e.printStackTrace();}
// playUnitAnimation [Attack] and wait for a period until the animation does one cycle
try {Thread.sleep(BasicCommands.playUnitAnimation(out, unit, UnitAnimationType.channel));} catch (InterruptedException e) {e.printStackTrace();}
// playUnitAnimation [Death] and wait for a period until the animation does one cycle
try {Thread.sleep(BasicCommands.playUnitAnimation(out, unit, UnitAnimationType.death));} catch (InterruptedException e) {e.printStackTrace();}
// deleteUnit
BasicCommands.deleteUnit(out, unit);
try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}
unitID++;
}
BasicCommands.deleteCard(out, 1);
try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}
}
//--------------------------------------------------------
// Test Avatars and Tokens
// -------------------------------------------------------
BasicCommands.addPlayer1Notification(out, "Test Avatars and Tokens", 1);
try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}
// As avatars and tokens do not have cards, we need to directly load the unit
// StaticConfFiles tells us where the associated conf file is
List<String> avatarsAndTokens = new ArrayList<String>();
avatarsAndTokens.add(StaticConfFiles.humanAvatar);
avatarsAndTokens.add(StaticConfFiles.aiAvatar);
avatarsAndTokens.add(StaticConfFiles.wraithling);
for (String unitConf : avatarsAndTokens) {
Unit unit = BasicObjectBuilders.loadUnit(unitConf, 1, Unit.class);
unit.setPositionByTile(tile);
BasicCommands.drawUnit(out, unit, tile);
try {Thread.sleep(2000);} catch (InterruptedException e) {e.printStackTrace();}
// playUnitAnimation [Move] and wait for a period until the animation does one cycle
try {Thread.sleep(BasicCommands.playUnitAnimation(out, unit, UnitAnimationType.move));} catch (InterruptedException e) {e.printStackTrace();}
// playUnitAnimation [Attack] and wait for a period until the animation does one cycle
try {Thread.sleep(BasicCommands.playUnitAnimation(out, unit, UnitAnimationType.attack));} catch (InterruptedException e) {e.printStackTrace();}
// playUnitAnimation [Attack] and wait for a period until the animation does one cycle
try {Thread.sleep(BasicCommands.playUnitAnimation(out, unit, UnitAnimationType.hit));} catch (InterruptedException e) {e.printStackTrace();}
// playUnitAnimation [Attack] and wait for a period until the animation does one cycle
try {Thread.sleep(BasicCommands.playUnitAnimation(out, unit, UnitAnimationType.channel));} catch (InterruptedException e) {e.printStackTrace();}
// playUnitAnimation [Death] and wait for a period until the animation does one cycle
try {Thread.sleep(BasicCommands.playUnitAnimation(out, unit, UnitAnimationType.death));} catch (InterruptedException e) {e.printStackTrace();}
// deleteUnit
BasicCommands.deleteUnit(out, unit);
try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}
}
//--------------------------------------------------------
// Test Effects
// -------------------------------------------------------
BasicCommands.addPlayer1Notification(out, "Test Effects", 1);
try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}
// Now check all of the loaded effects
String effectsDIR = "conf/gameconfs/effects/";
for (String filename : new File(effectsDIR).list()) {
EffectAnimation effect = BasicObjectBuilders.loadEffect(effectsDIR+filename);
try {Thread.sleep(BasicCommands.playEffectAnimation(out, effect, tile));} catch (InterruptedException e) {e.printStackTrace();}
}
}
}

+ 31
- 0
app/events/CardClicked.java View File

@@ -0,0 +1,31 @@
package events;
import com.fasterxml.jackson.databind.JsonNode;
import akka.actor.ActorRef;
import structures.GameState;
/**
* Indicates that the user has clicked an object on the game canvas, in this case a card.
* The event returns the position in the player's hand the card resides within.
*
* {
* messageType = “cardClicked”
* position = <hand index position [1-6]>
* }
*
* @author Dr. Richard McCreadie
*
*/
public class CardClicked implements EventProcessor{
@Override
public void processEvent(ActorRef out, GameState gameState, JsonNode message) {
int handPosition = message.get("position").asInt();
}
}

+ 26
- 0
app/events/EndTurnClicked.java View File

@@ -0,0 +1,26 @@
package events;
import com.fasterxml.jackson.databind.JsonNode;
import akka.actor.ActorRef;
import structures.GameState;
/**
* Indicates that the user has clicked an object on the game canvas, in this case
* the end-turn button.
*
* {
* messageType = “endTurnClicked”
* }
*
* @author Dr. Richard McCreadie
*
*/
public class EndTurnClicked implements EventProcessor{
@Override
public void processEvent(ActorRef out, GameState gameState, JsonNode message) {
}
}

+ 27
- 0
app/events/EventProcessor.java View File

@@ -0,0 +1,27 @@
package events;
import com.fasterxml.jackson.databind.JsonNode;
import akka.actor.ActorRef;
import structures.GameState;
/**
* A generic event processor interface, implemented by all classes that process events
* sent from the user interface.
* @author Dr. Richard McCreadie
*
*/
public interface EventProcessor {
/**
* The processEvent method takes as input the contents of the event in the form of a
* Jackson JsonNode object, which contains a set of key-value pairs (the information
* about the event). It also takes in a copy of an ActorRef object, which can be used
* to send commands back to the front-end, and a reference to the GameState class,
* which as the name suggests can be used to hold game state information.
* @param message
* @return
*/
public void processEvent(ActorRef out, GameState gameState, JsonNode message);
}

+ 28
- 0
app/events/Heartbeat.java View File

@@ -0,0 +1,28 @@
package events;
import com.fasterxml.jackson.databind.JsonNode;
import akka.actor.ActorRef;
import structures.GameState;
/**
* In the user’s browser, the game is running in an infinite loop, where there is around a 1 second delay
* between each loop. Its during each loop that the UI acts on the commands that have been sent to it. A
* heartbeat event is fired at the end of each loop iteration. As with all events this is received by the Game
* Actor, which you can use to trigger game logic.
*
* {
* String messageType = “heartbeat”
* }
*
* @author Dr. Richard McCreadie
*
*/
public class Heartbeat implements EventProcessor{
@Override
public void processEvent(ActorRef out, GameState gameState, JsonNode message) {
}
}

+ 38
- 0
app/events/Initalize.java View File

@@ -0,0 +1,38 @@
package events;
import com.fasterxml.jackson.databind.JsonNode;
import akka.actor.ActorRef;
import demo.CommandDemo;
import demo.Loaders_2024_Check;
import structures.GameState;
/**
* Indicates that both the core game loop in the browser is starting, meaning
* that it is ready to recieve commands from the back-end.
*
* {
* messageType = “initalize”
* }
*
* @author Dr. Richard McCreadie
*
*/
public class Initalize implements EventProcessor{
@Override
public void processEvent(ActorRef out, GameState gameState, JsonNode message) {
// hello this is a change
gameState.gameInitalised = true;
gameState.something = true;
// User 1 makes a change
CommandDemo.executeDemo(out); // this executes the command demo, comment out this when implementing your solution
//Loaders_2024_Check.test(out);
}
}

+ 29
- 0
app/events/OtherClicked.java View File

@@ -0,0 +1,29 @@
package events;
import com.fasterxml.jackson.databind.JsonNode;
import akka.actor.ActorRef;
import structures.GameState;
/**
* Indicates that the user has clicked an object on the game canvas, in this case
* somewhere that is not on a card tile or the end-turn button.
*
* {
* messageType = “otherClicked”
* }
*
* @author Dr. Richard McCreadie
*
*/
public class OtherClicked implements EventProcessor{
@Override
public void processEvent(ActorRef out, GameState gameState, JsonNode message) {
}
}

+ 37
- 0
app/events/TileClicked.java View File

@@ -0,0 +1,37 @@
package events;
import com.fasterxml.jackson.databind.JsonNode;
import akka.actor.ActorRef;
import structures.GameState;
/**
* Indicates that the user has clicked an object on the game canvas, in this case a tile.
* The event returns the x (horizontal) and y (vertical) indices of the tile that was
* clicked. Tile indices start at 1.
*
* {
* messageType = “tileClicked”
* tilex = <x index of the tile>
* tiley = <y index of the tile>
* }
*
* @author Dr. Richard McCreadie
*
*/
public class TileClicked implements EventProcessor{
@Override
public void processEvent(ActorRef out, GameState gameState, JsonNode message) {
int tilex = message.get("tilex").asInt();
int tiley = message.get("tiley").asInt();
if (gameState.something == true) {
// do some logic
}
}
}

+ 29
- 0
app/events/UnitMoving.java View File

@@ -0,0 +1,29 @@
package events;
import com.fasterxml.jackson.databind.JsonNode;
import akka.actor.ActorRef;
import structures.GameState;
/**
* Indicates that a unit instance has started a move.
* The event reports the unique id of the unit.
*
* {
* messageType = “unitMoving”
* id = <unit id>
* }
*
* @author Dr. Richard McCreadie
*
*/
public class UnitMoving implements EventProcessor{
@Override
public void processEvent(ActorRef out, GameState gameState, JsonNode message) {
int unitid = message.get("id").asInt();
}
}

+ 30
- 0
app/events/UnitStopped.java View File

@@ -0,0 +1,30 @@
package events;
import com.fasterxml.jackson.databind.JsonNode;
import akka.actor.ActorRef;
import structures.GameState;
/**
* Indicates that a unit instance has stopped moving.
* The event reports the unique id of the unit.
*
* {
* messageType = “unitStopped”
* id = <unit id>
* }
*
* @author Dr. Richard McCreadie
*
*/
public class UnitStopped implements EventProcessor{
@Override
public void processEvent(ActorRef out, GameState gameState, JsonNode message) {
int unitid = message.get("id").asInt();
}
}

+ 17
- 0
app/structures/GameState.java View File

@@ -0,0 +1,17 @@
package structures;
/**
* This class can be used to hold information about the on-going game.
* Its created with the GameActor.
*
* @author Dr. Richard McCreadie
*
*/
public class GameState {
public boolean gameInitalised = false;
public boolean something = false;
}

+ 39
- 0
app/structures/User.java View File

@@ -0,0 +1,39 @@
package structures;
/**
* Unused
* @author Dr. Richard McCreadie
*
*/
public class User {
protected String username;
protected String password;
public User() {}
public User(String username, String password) {
super();
this.username = username;
this.password = password;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}

+ 39
- 0
app/structures/basic/BetterUnit.java View File

@@ -0,0 +1,39 @@
package structures.basic;
import java.util.HashSet;
import java.util.Set;
import utils.BasicObjectBuilders;
import utils.StaticConfFiles;
public class BetterUnit extends Unit {
Set<String> keywords;
public BetterUnit() {}
public BetterUnit(Set<String> keywords) {
super();
this.keywords = keywords;
}
public Set<String> getKeywords() {
return keywords;
}
public void setKeywords(Set<String> keywords) {
this.keywords = keywords;
};
public static void main(String[] args) {
BetterUnit unit = (BetterUnit)BasicObjectBuilders.loadUnit(StaticConfFiles.humanAvatar, 0, BetterUnit.class);
Set<String> keywords = new HashSet<String>();
keywords.add("MyKeyword");
unit.setKeywords(keywords);
System.err.println(unit.getClass());
}
}

+ 62
- 0
app/structures/basic/BigCard.java View File

@@ -0,0 +1,62 @@
package structures.basic;
/**
* BigCard represents the expanded card version that that appears on mouse-over
* @author Dr. Richard McCreadie
*
*/
public class BigCard {
int attack;
int health;
String[] rulesTextRows;
String[] cardTextures;
public BigCard() {}
public BigCard(int attack, int health, String[] rulesTextRows, String[] cardTextures) {
super();
this.attack = attack;
this.health = health;
this.rulesTextRows = rulesTextRows;
this.cardTextures = cardTextures;
}
public int getAttack() {
return attack;
}
public void setAttack(int attack) {
this.attack = attack;
}
public int getHealth() {
return health;
}
public void setHealth(int health) {
this.health = health;
}
public String[] getRulesTextRows() {
return rulesTextRows;
}
public void setRulesTextRows(String[] rulesTextRows) {
this.rulesTextRows = rulesTextRows;
}
public String[] getCardTextures() {
return cardTextures;
}
public void setCardTextures(String[] cardTextures) {
this.cardTextures = cardTextures;
}
}

+ 89
- 0
app/structures/basic/Card.java View File

@@ -0,0 +1,89 @@
package structures.basic;
/**
* This is the base representation of a Card which is rendered in the player's hand.
* A card has an id, a name (cardname) and a manacost. A card then has a large and mini
* version. The mini version is what is rendered at the bottom of the screen. The big
* version is what is rendered when the player clicks on a card in their hand.
*
* @author Dr. Richard McCreadie
*
*/
public class Card {
int id;
String cardname;
int manacost;
MiniCard miniCard;
BigCard bigCard;
boolean isCreature;
String unitConfig;
public Card() {};
public Card(int id, String cardname, int manacost, MiniCard miniCard, BigCard bigCard, boolean isCreature, String unitConfig) {
super();
this.id = id;
this.cardname = cardname;
this.manacost = manacost;
this.miniCard = miniCard;
this.bigCard = bigCard;
this.isCreature = isCreature;
this.unitConfig = unitConfig;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getCardname() {
return cardname;
}
public void setCardname(String cardname) {
this.cardname = cardname;
}
public int getManacost() {
return manacost;
}
public void setManacost(int manacost) {
this.manacost = manacost;
}
public MiniCard getMiniCard() {
return miniCard;
}
public void setMiniCard(MiniCard miniCard) {
this.miniCard = miniCard;
}
public BigCard getBigCard() {
return bigCard;
}
public void setBigCard(BigCard bigCard) {
this.bigCard = bigCard;
}
public boolean getIsCreature() {
return isCreature;
}
public void setIsCreature(boolean isCreature) {
this.isCreature = isCreature;
}
public void setCreature(boolean isCreature) {
this.isCreature = isCreature;
}
public boolean isCreature() {
return isCreature;
}
public String getUnitConfig() {
return unitConfig;
}
public void setUnitConfig(String unitConfig) {
this.unitConfig = unitConfig;
}
}

+ 49
- 0
app/structures/basic/EffectAnimation.java View File

@@ -0,0 +1,49 @@
package structures.basic;
import java.util.List;
/**
* This class is the base for an effect that can be played on a game
* tile. It has a list of animation frames (animationTextures), and
* a correction object that has information about centering the frames
* on the tile. It has has an fps value that specifies how quickly to
* play the animation.
*
* @author Dr. Richard McCreadie
*
*/
public class EffectAnimation {
List<String> animationTextures;
ImageCorrection correction;
int fps;
public EffectAnimation() {}
public EffectAnimation(List<String> animationTextures, ImageCorrection correction, int fps) {
super();
this.animationTextures = animationTextures;
this.correction = correction;
this.fps = fps;
}
public List<String> getAnimationTextures() {
return animationTextures;
}
public void setAnimationTextures(List<String> animationTextures) {
this.animationTextures = animationTextures;
}
public ImageCorrection getCorrection() {
return correction;
}
public void setCorrection(ImageCorrection correction) {
this.correction = correction;
}
public int getFps() {
return fps;
}
public void setFps(int fps) {
this.fps = fps;
}
}

+ 115
- 0
app/structures/basic/ImageCorrection.java View File

@@ -0,0 +1,115 @@
package structures.basic;
import com.fasterxml.jackson.annotation.JsonIgnore;
/**
* Sprites when extracted are not full size (there is white space around the sprite).
* We need to correct for this as well as centre the sprite on the tile. This class
* contains information to do this.
*
* @author Dr. Richard McCreadie
*
*/
public class ImageCorrection {
double imgWidth;
double imgHeight;
double spriteTopLeftX;
double spriteTopLeftY;
double offsetX;
double offsetY;
double scale;
boolean reflected;
public ImageCorrection() {}
public ImageCorrection(double imgWidth, double imgHeight, double spriteTopLeftX, double spriteTopLeftY,
double offsetX, double offsetY, double scale, boolean reflected) {
super();
this.imgWidth = imgWidth;
this.imgHeight = imgHeight;
this.spriteTopLeftX = spriteTopLeftX;
this.spriteTopLeftY = spriteTopLeftY;
this.offsetX = offsetX;
this.offsetY = offsetY;
this.scale = scale;
this.reflected = reflected;
}
public double getImgWidth() {
return imgWidth;
}
public void setImgWidth(double imgWidth) {
this.imgWidth = imgWidth;
}
public double getImgHeight() {
return imgHeight;
}
public void setImgHeight(double imgHeight) {
this.imgHeight = imgHeight;
}
public double getSpriteTopLeftX() {
return spriteTopLeftX;
}
public void setSpriteTopLeftX(double spriteTopLeftX) {
this.spriteTopLeftX = spriteTopLeftX;
}
public double getSpriteTopLeftY() {
return spriteTopLeftY;
}
public void setSpriteTopLeftY(double spriteTopLeftY) {
this.spriteTopLeftY = spriteTopLeftY;
}
public double getOffsetX() {
return offsetX;
}
public void setOffsetX(double offsetX) {
this.offsetX = offsetX;
}
public double getOffsetY() {
return offsetY;
}
public void setOffsetY(double offsetY) {
this.offsetY = offsetY;
}
public double getScale() {
return scale;
}
public void setScale(double scale) {
this.scale = scale;
}
public boolean isReflected() {
return reflected;
}
public void setReflected(boolean reflected) {
this.reflected = reflected;
}
@JsonIgnore
public double getCorrectedImgWidth() {
return imgWidth*(1+(spriteTopLeftX/imgWidth));
}
@JsonIgnore
public double getCorrectedImgHeight() {
return imgHeight*(1+(spriteTopLeftY/imgHeight));
}
}

+ 68
- 0
app/structures/basic/MiniCard.java View File

@@ -0,0 +1,68 @@
package structures.basic;
/**
* A mini-card is a visualisation of the card in a small square form factor
* in the player's hand. It has a series of components. cardTextures are the
* 'backing' image behind the sprite animation. animationFrames are the frames
* if the unit/spell animation. fps is the speed at which to play the unit/spell
* animation. index is the frame index in animationFrames when wanting a 'still'
* version (non-highlighted).
*
*
* @author Dr. Richard McCreadie
*
*/
public class MiniCard {
String[] cardTextures;
String[] animationFrames;
int fps;
int index;
public MiniCard() {}
public MiniCard(String[] cardTextures, String[] animationFrames, int fps, int index) {
super();
this.cardTextures = cardTextures;
this.animationFrames = animationFrames;
this.fps = fps;
this.index = index;
}
public String[] getCardTextures() {
return cardTextures;
}
public void setCardTextures(String[] cardTextures) {
this.cardTextures = cardTextures;
}
public String[] getAnimationFrames() {
return animationFrames;
}
public void setAnimationFrames(String[] animationFrames) {
this.animationFrames = animationFrames;
}
public int getFps() {
return fps;
}
public void setFps(int fps) {
this.fps = fps;
}
public int getIndex() {
return index;
}
public void setIndex(int index) {
this.index = index;
}
}

+ 40
- 0
app/structures/basic/Player.java View File

@@ -0,0 +1,40 @@
package structures.basic;
/**
* A basic representation of of the Player. A player
* has health and mana.
*
* @author Dr. Richard McCreadie
*
*/
public class Player {
int health;
int mana;
public Player() {
super();
this.health = 20;
this.mana = 0;
}
public Player(int health, int mana) {
super();
this.health = health;
this.mana = mana;
}
public int getHealth() {
return health;
}
public void setHealth(int health) {
this.health = health;
}
public int getMana() {
return mana;
}
public void setMana(int mana) {
this.mana = mana;
}
}

+ 57
- 0
app/structures/basic/Position.java View File

@@ -0,0 +1,57 @@
package structures.basic;
/**
* This contains the positional information for a unit
* that is sitting on a tile. tilex/y are the index position
* of the tile the unit is sitting upon. x/ypos are the pixel
* position of the unit.
*
* @author Dr. Richard McCreadie
*
*/
public class Position {
int xpos;
int ypos;
int tilex;
int tiley;
public Position() {}
public Position(int xpos, int ypos, int tilex, int tilexy) {
super();
this.xpos = xpos;
this.ypos = ypos;
this.tilex = tilex;
this.tiley = tilexy;
}
public int getXpos() {
return xpos;
}
public void setXpos(int xpos) {
this.xpos = xpos;
}
public int getYpos() {
return ypos;
}
public void setYpos(int ypos) {
this.ypos = ypos;
}
public int getTilex() {
return tilex;
}
public void setTilex(int tilex) {
this.tilex = tilex;
}
public int getTiley() {
return tiley;
}
public void setTiley(int tilexy) {
this.tiley = tilexy;
}
}

+ 119
- 0
app/structures/basic/Tile.java View File

@@ -0,0 +1,119 @@
package structures.basic;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.databind.ObjectMapper;
/**
* A basic representation of a tile on the game board. Tiles have both a pixel position
* and a grid position. Tiles also have a width and height in pixels and a series of urls
* that point to the different renderable textures that a tile might have.
*
* @author Dr. Richard McCreadie
*
*/
public class Tile {
@JsonIgnore
private static ObjectMapper mapper = new ObjectMapper(); // Jackson Java Object Serializer, is used to read java objects from a file
List<String> tileTextures;
int xpos;
int ypos;
int width;
int height;
int tilex;
int tiley;
public Tile() {}
public Tile(String tileTexture, int xpos, int ypos, int width, int height, int tilex, int tiley) {
super();
tileTextures = new ArrayList<String>(1);
tileTextures.add(tileTexture);
this.xpos = xpos;
this.ypos = ypos;
this.width = width;
this.height = height;
this.tilex = tilex;
this.tiley = tiley;
}
public Tile(List<String> tileTextures, int xpos, int ypos, int width, int height, int tilex, int tiley) {
super();
this.tileTextures = tileTextures;
this.xpos = xpos;
this.ypos = ypos;
this.width = width;
this.height = height;
this.tilex = tilex;
this.tiley = tiley;
}
public List<String> getTileTextures() {
return tileTextures;
}
public void setTileTextures(List<String> tileTextures) {
this.tileTextures = tileTextures;
}
public int getXpos() {
return xpos;
}
public void setXpos(int xpos) {
this.xpos = xpos;
}
public int getYpos() {
return ypos;
}
public void setYpos(int ypos) {
this.ypos = ypos;
}
public int getWidth() {
return width;
}
public void setWidth(int width) {
this.width = width;
}
public int getHeight() {
return height;
}
public void setHeight(int height) {
this.height = height;
}
public int getTilex() {
return tilex;
}
public void setTilex(int tilex) {
this.tilex = tilex;
}
public int getTiley() {
return tiley;
}
public void setTiley(int tiley) {
this.tiley = tiley;
}
/**
* Loads a tile from a configuration file
* parameters.
* @param configFile
* @return
*/
public static Tile constructTile(String configFile) {
try {
Tile tile = mapper.readValue(new File(configFile), Tile.class);
return tile;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}

+ 111
- 0
app/structures/basic/Unit.java View File

@@ -0,0 +1,111 @@
package structures.basic;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.databind.ObjectMapper;
/**
* This is a representation of a Unit on the game board.
* A unit has a unique id (this is used by the front-end.
* Each unit has a current UnitAnimationType, e.g. move,
* or attack. The position is the physical position on the
* board. UnitAnimationSet contains the underlying information
* about the animation frames, while ImageCorrection has
* information for centering the unit on the tile.
*
* @author Dr. Richard McCreadie
*
*/
public class Unit {
@JsonIgnore
protected static ObjectMapper mapper = new ObjectMapper(); // Jackson Java Object Serializer, is used to read java objects from a file
int id;
UnitAnimationType animation;
Position position;
UnitAnimationSet animations;
ImageCorrection correction;
public Unit() {}
public Unit(int id, UnitAnimationSet animations, ImageCorrection correction) {
super();
this.id = id;
this.animation = UnitAnimationType.idle;
position = new Position(0,0,0,0);
this.correction = correction;
this.animations = animations;
}
public Unit(int id, UnitAnimationSet animations, ImageCorrection correction, Tile currentTile) {
super();
this.id = id;
this.animation = UnitAnimationType.idle;
position = new Position(currentTile.getXpos(),currentTile.getYpos(),currentTile.getTilex(),currentTile.getTiley());
this.correction = correction;
this.animations = animations;
}
public Unit(int id, UnitAnimationType animation, Position position, UnitAnimationSet animations,
ImageCorrection correction) {
super();
this.id = id;
this.animation = animation;
this.position = position;
this.animations = animations;
this.correction = correction;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public UnitAnimationType getAnimation() {
return animation;
}
public void setAnimation(UnitAnimationType animation) {
this.animation = animation;
}
public ImageCorrection getCorrection() {
return correction;
}
public void setCorrection(ImageCorrection correction) {
this.correction = correction;
}
public Position getPosition() {
return position;
}
public void setPosition(Position position) {
this.position = position;
}
public UnitAnimationSet getAnimations() {
return animations;
}
public void setAnimations(UnitAnimationSet animations) {
this.animations = animations;
}
/**
* This command sets the position of the Unit to a specified
* tile.
* @param tile
*/
@JsonIgnore
public void setPositionByTile(Tile tile) {
position = new Position(tile.getXpos(),tile.getYpos(),tile.getTilex(),tile.getTiley());
}
}

+ 57
- 0
app/structures/basic/UnitAnimation.java View File

@@ -0,0 +1,57 @@
package structures.basic;
/**
* This contains information for playing a Unit's animation, e.g.
* move, attack, or idle. One of these animations as a start and
* end index in the animation frames array, an fps (indicating animation
* speed) and whether that animation should loop (e.g. move does, attack
* does not).
*
* @author Dr. Richard McCreadie
*
*/
public class UnitAnimation {
int[] frameStartEndIndices;
int fps;
boolean loop;
public UnitAnimation() {}
public UnitAnimation(int[] frameStartEndIndices, int fps, boolean loop) {
super();
this.frameStartEndIndices = frameStartEndIndices;
this.fps = fps;
this.loop = loop;
}
public int[] getFrameStartEndIndices() {
return frameStartEndIndices;
}
public void setFrameStartEndIndices(int[] frameStartEndIndices) {
this.frameStartEndIndices = frameStartEndIndices;
}
public int getFps() {
return fps;
}
public void setFps(int fps) {
this.fps = fps;
}
public boolean isLoop() {
return loop;
}
public void setLoop(boolean loop) {
this.loop = loop;
};
}

+ 95
- 0
app/structures/basic/UnitAnimationSet.java View File

@@ -0,0 +1,95 @@
package structures.basic;
import java.util.List;
/**
* This is a storage structure for the different animations that a
* Unit can perform. A Unit has 6 possible animation states:
* - idle
* - death
* - attack
* - move
* - channel
* - hit
*
* @author Dr. Richard McCreadie
*
*/
public class UnitAnimationSet {
List<String> allFrames;
String frameDIR;
UnitAnimation idle;
UnitAnimation death;
UnitAnimation attack;
UnitAnimation move;
UnitAnimation channel;
UnitAnimation hit;
public UnitAnimationSet() {}
public UnitAnimationSet(List<String> allFrames, String frameDIR, UnitAnimation idle, UnitAnimation death, UnitAnimation attack,
UnitAnimation move, UnitAnimation channel, UnitAnimation hit) {
super();
this.allFrames = allFrames;
this.frameDIR = frameDIR;
this.idle = idle;
this.death = death;
this.attack = attack;
this.move = move;
this.channel = channel;
this.hit = hit;
}
public List<String> getAllFrames() {
return allFrames;
}
public void setAllFrames(List<String> allFrames) {
this.allFrames = allFrames;
}
public String getFrameDIR() {
return frameDIR;
}
public void setFrameDIR(String frameDIR) {
this.frameDIR = frameDIR;
}
public UnitAnimation getIdle() {
return idle;
}
public void setIdle(UnitAnimation idle) {
this.idle = idle;
}
public UnitAnimation getDeath() {
return death;
}
public void setDeath(UnitAnimation death) {
this.death = death;
}
public UnitAnimation getAttack() {
return attack;
}
public void setAttack(UnitAnimation attack) {
this.attack = attack;
}
public UnitAnimation getMove() {
return move;
}
public void setMove(UnitAnimation move) {
this.move = move;
}
public UnitAnimation getChannel() {
return channel;
}
public void setChannel(UnitAnimation channel) {
this.channel = channel;
}
public UnitAnimation getHit() {
return hit;
}
public void setHit(UnitAnimation hit) {
this.hit = hit;
}
}

+ 19
- 0
app/structures/basic/UnitAnimationType.java View File

@@ -0,0 +1,19 @@
package structures.basic;
/**
* This is an enumerate that simply holds the names
* of the various unit animation states.
*
* @author Dr. Richard McCreadie
*
*/
public enum UnitAnimationType {
idle,
death,
attack,
move,
channel,
hit
}

+ 223
- 0
app/utils/BasicObjectBuilders.java View File

@@ -0,0 +1,223 @@
package utils;
import java.io.File;
import java.util.List;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.databind.ObjectMapper;
import structures.basic.Card;
import structures.basic.EffectAnimation;
import structures.basic.Tile;
import structures.basic.Unit;
/**
* This class contains methods for producing basic objects from configuration files
*
* @author Dr. Richard McCreadie
*
*/
public class BasicObjectBuilders {
@JsonIgnore
protected static ObjectMapper mapper = new ObjectMapper(); // Jackson Java Object Serializer, is used to read java objects from a file
/**
* This class produces a Card object (or anything that extends Card) given a configuration
* file. Configuration files can be found in the conf/gameconfs directory. The card should
* be given a unique id number. The classtype field specifies the type of Card to be
* constructed, e.g. Card.class will create a default card object, but if you had a class
* extending card, e.g. MyAwesomeCard that extends Card, you could also specify
* MyAwesomeCard.class here. If using an extending class you will need to manually set any
* new data fields.
* @param configurationFile
* @param id
* @param classtype
* @return
*/
public static Card loadCard(String configurationFile, int id, Class<? extends Card> classtype) {
try {
Card card = mapper.readValue(new File(configurationFile), classtype);
// If the card is a creature, add its idle animation as the card animation
if (card.isCreature()) {
Unit unit = loadUnit(card.getUnitConfig(), -1, Unit.class);
List<String> idleAnimation = unit.getAnimations().getAllFrames().subList(unit.getAnimations().getIdle().getFrameStartEndIndices()[0], unit.getAnimations().getIdle().getFrameStartEndIndices()[1]);
card.getMiniCard().setAnimationFrames(idleAnimation.toArray(new String[idleAnimation.size()]));
}
card.setId(id);
return card;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* This class produces a EffectAnimation object given a configuration
* file. Configuration files can be found in the conf/gameconfs directory.
* @param configurationFile
* @return
*/
public static EffectAnimation loadEffect(String configurationFile) {
try {
EffectAnimation effect = mapper.readValue(new File(configurationFile), EffectAnimation.class);
return effect;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* Loads a unit from a configuration file. Configuration files can be found
* in the conf/gameconfs directory. The unit needs to be given a unique identifier
* (id). This method requires a classtype argument that specifies what type of
* unit to create.
* @param configFile
* @return
*/
public static Unit loadUnit(String configFile, int id, Class<? extends Unit> classType) {
try {
Unit unit = mapper.readValue(new File(configFile), classType);
// identify start and end frames automatically based on file names
// IDLE
{
int startframe = 0; int endframe = 0; int index = 0; boolean inAnimation = false;
for (String framename: unit.getAnimations().getAllFrames()) {
if (framename.contains("_idle_")) {
if (startframe==0) { startframe=index; inAnimation=true;}
} else {
if (inAnimation) { endframe=index-1; break;}
}
index++;
}
if (endframe==0) endframe=index;
int[] frameIndexes = {startframe, endframe};
if (inAnimation) unit.getAnimations().getIdle().setFrameStartEndIndices(frameIndexes);
}
// DEATH
{
int startframe = 0; int endframe = 0; int index = 0; boolean inAnimation = false;
for (String framename: unit.getAnimations().getAllFrames()) {
if (framename.contains("_death_")) {
if (startframe==0) { startframe=index; inAnimation=true;}
} else {
if (inAnimation) { endframe=index-1; break;}
}
index++;
}
if (endframe==0) endframe=index;
int[] frameIndexes = {startframe, endframe};
if (inAnimation) unit.getAnimations().getDeath().setFrameStartEndIndices(frameIndexes);
}
// ATTACK
{
int startframe = 0; int endframe = 0; int index = 0; boolean inAnimation = false;
for (String framename: unit.getAnimations().getAllFrames()) {
if (framename.contains("_attack_")) {
if (startframe==0) { startframe=index; inAnimation=true;}
} else {
if (inAnimation) { endframe=index-1; break;}
}
index++;
}
if (endframe==0) endframe=index;
int[] frameIndexes = {startframe, endframe};
if (inAnimation) unit.getAnimations().getAttack().setFrameStartEndIndices(frameIndexes);
}
// MOVE
{
int startframe = 0; int endframe = 0; int index = 0; boolean inAnimation = false;
for (String framename: unit.getAnimations().getAllFrames()) {
if (framename.contains("_run_")) {
if (startframe==0) { startframe=index; inAnimation=true;}
} else {
if (inAnimation) { endframe=index-1; break;}
}
index++;
}
if (endframe==0) endframe=index;
int[] frameIndexes = {startframe, endframe};
if (inAnimation) unit.getAnimations().getMove().setFrameStartEndIndices(frameIndexes);
}
// CHANNEL
{
int startframe = 0; int endframe = 0; int index = 0; boolean inAnimation = false;
for (String framename: unit.getAnimations().getAllFrames()) {
if (framename.contains("_castloop_")) {
if (startframe==0) { startframe=index; inAnimation=true;}
} else {
if (inAnimation) { endframe=index-1; break;}
}
index++;
}
if (endframe==0) endframe=index;
int[] frameIndexes = {startframe, endframe};
if (inAnimation) unit.getAnimations().getChannel().setFrameStartEndIndices(frameIndexes);
}
// HIT
{
int startframe = 0; int endframe = 0; int index = 0; boolean inAnimation = false;
for (String framename: unit.getAnimations().getAllFrames()) {
if (framename.contains("_hit_")) {
if (startframe==0) { startframe=index; inAnimation=true;}
} else {
if (inAnimation) { endframe=index-1; break;}
}
index++;
}
if (endframe==0) endframe=index;
int[] frameIndexes = {startframe, endframe};
if (inAnimation) unit.getAnimations().getChannel().setFrameStartEndIndices(frameIndexes);
}
// add full address to animation frames
for (int i =0; i<unit.getAnimations().getAllFrames().size(); i++) {
unit.getAnimations().getAllFrames().set(i, unit.getAnimations().getFrameDIR()+unit.getAnimations().getAllFrames().get(i));
}
unit.setId(id);
return unit;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* Generates a tile object with x and y indices
* @param x
* @param y
* @return
*/
public static Tile loadTile(int x, int y) {
int gridmargin = 5;
int gridTopLeftx = 410;
int gridTopLefty = 280;
Tile tile = Tile.constructTile(StaticConfFiles.tileConf);
tile.setXpos((tile.getWidth()*x)+(gridmargin*x)+gridTopLeftx);
tile.setYpos((tile.getHeight()*y)+(gridmargin*y)+gridTopLefty);
tile.setTilex(x);
tile.setTiley(y);
return tile;
}
}

+ 85
- 0
app/utils/ImageListForPreLoad.java View File

@@ -0,0 +1,85 @@
package utils;
import java.io.File;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import structures.basic.Card;
import structures.basic.Tile;
import structures.basic.Unit;
/**
* This is a utility class that builds a large set of image URLs
*
* @author Dr. Richard McCreadie
*
*/
public class ImageListForPreLoad {
/**
* This method returns a very big list of relative locations of the different images
* that are needed by the game. Pixi.js will cache these on game load.
* @return
*/
public static Set<String> getImageListForPreLoad() {
Set<String> images = new HashSet<String>();
// UI Elements
images.add("assets/game/extra/battlemap6_middleground.png");
images.add("assets/game/extra/AttackCircle.png");
images.add("assets/game/extra/HealthCircle.png");
images.add("assets/game/extra/GreyCircle.png");
images.add("assets/game/extra/ManaCircle.png");
images.add("assets/game/extra/ui/icon_mana.png");
images.add("assets/game/extra/ui/icon_mana_inactive.png");
images.add("assets/game/extra/ui/notification_quest_small.png");
images.add("assets/game/extra/ui/general_portrait_image_hex_f1-third@2x.png");
images.add("assets/game/extra/ui/general_portrait_image_hex_f4-third@2x.png");
images.add("assets/game/extra/ui/tooltip_left@2x.png");
images.add("assets/game/extra/ui/tooltip_right@2x.png");
images.add("assets/game/extra/ui/button_end_turn_enemy.png");
images.add("assets/game/extra/ui/button_primary.png");
// Tiles
images.addAll(Tile.constructTile(StaticConfFiles.tileConf).getTileTextures());
// Avatars
images.addAll(BasicObjectBuilders.loadUnit(StaticConfFiles.humanAvatar, -1, Unit.class).getAnimations().getAllFrames());
images.addAll(BasicObjectBuilders.loadUnit(StaticConfFiles.aiAvatar, -1, Unit.class).getAnimations().getAllFrames());
String cardsDIR = "conf/gameconfs/cards/";
for (String filename : new File(cardsDIR).list()) {
images.addAll(getCardImagesForPreload(cardsDIR+filename));
}
String unitsDIR = "conf/gameconfs/units/";
for (String filename : new File(unitsDIR).list()) {
images.addAll(getUnitImagesForPreload(BasicObjectBuilders.loadUnit(unitsDIR+filename, -1, Unit.class)));
}
String effectsDIR = "conf/gameconfs/effects/";
for (String filename : new File(effectsDIR).list()) {
images.addAll(BasicObjectBuilders.loadEffect(effectsDIR+filename).getAnimationTextures());
}
return images;
}
public static List<String> getUnitImagesForPreload(Unit unit) {
List<String> images = unit.getAnimations().getAllFrames();
return images;
}
public static List<String> getCardImagesForPreload(String configFile) {
Card card = BasicObjectBuilders.loadCard(configFile, 0, Card.class);
List<String> images = new ArrayList<String>(card.getMiniCard().getAnimationFrames().length+card.getMiniCard().getCardTextures().length+card.getBigCard().getCardTextures().length);
for (String image : card.getMiniCard().getAnimationFrames()) images.add(image);
for (String image : card.getMiniCard().getCardTextures()) images.add(image);
for (String image :card.getBigCard().getCardTextures()) images.add(image);
return images;
}
}

+ 63
- 0
app/utils/OrderedCardLoader.java View File

@@ -0,0 +1,63 @@
package utils;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import structures.basic.Card;
/**
* This is a utility class that provides methods for loading the decks for each
* player, as the deck ordering is fixed.
* @author Richard
*
*/
public class OrderedCardLoader {
public static String cardsDIR = "conf/gameconfs/cards/";
/**
* Returns all of the cards in the human player's deck in order
* @return
*/
public static List<Card> getPlayer1Cards(int copies) {
List<Card> cardsInDeck = new ArrayList<Card>(20);
int cardID = 1;
for (int i =0; i<copies; i++) {
for (String filename : new File(cardsDIR).list()) {
if (filename.startsWith("1_")) {
// this is a deck 1 card
cardsInDeck.add(BasicObjectBuilders.loadCard(cardsDIR+filename, cardID, Card.class));
}
}
}
return cardsInDeck;
}
/**
* Returns all of the cards in the human player's deck in order
* @return
*/
public static List<Card> getPlayer2Cards(int copies) {
List<Card> cardsInDeck = new ArrayList<Card>(20);
int cardID = 1;
for (int i =0; i<copies; i++) {
for (String filename : new File(cardsDIR).list()) {
if (filename.startsWith("2_")) {
// this is a deck 2 card
cardsInDeck.add(BasicObjectBuilders.loadCard(cardsDIR+filename, cardID, Card.class));
}
}
}
return cardsInDeck;
}
}

+ 30
- 0
app/utils/StaticConfFiles.java View File

@@ -0,0 +1,30 @@
package utils;
/**
* This is a utility class that just has short-cuts to the location of various
* config files.
*
* @author Dr. Richard McCreadie
*
*/
public class StaticConfFiles {
// Board Pieces
public final static String tileConf = "conf/gameconfs/tile.json";
public final static String gridConf = "conf/gameconfs/grid.json";
// Avatars
public final static String humanAvatar = "conf/gameconfs/avatars/avatar1.json";
public final static String aiAvatar = "conf/gameconfs/avatars/avatar2.json";
// Tokens
public final static String wraithling = "conf/gameconfs/units/wraithling.json";
// Effects
public final static String f1_inmolation = "conf/gameconfs/effects/f1_inmolation.json";
public final static String f1_buff = "conf/gameconfs/effects/f1_buff.json";
public final static String f1_martyrdom = "conf/gameconfs/effects/f1_martyrdom.json";
public final static String f1_projectiles = "conf/gameconfs/effects/f1_projectiles.json";
public final static String f1_summon = "conf/gameconfs/effects/f1_summon.json";
}

+ 161
- 0
app/views/gamescreen.scala.html View File

@@ -0,0 +1,161 @@
@(request: play.mvc.Http.Request, user: String)
<!DOCTYPE html>
<html>
<head>
<title>ITSD Card Game Main Screen</title>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="@routes.Assets.at("css/uikit.css")" />
<script src="@routes.Assets.at("js/jquery.3.4.1.js")"></script>
<script src="@routes.Assets.at("js/uikit.js")"></script>
<script src="@routes.Assets.at("js/uikit-icons.js")"></script>
<script src="@routes.Assets.at("js/hexi.min.js")"></script>
</head>
<body id="mainBody" wsdata="@routes.GameScreenController.socket.webSocketURL(request)" onload="init()">
<script src="@routes.Assets.at("js/cardgame.js")"></script>
<script type="text/javascript">
// // Load them google fonts before starting...!
window.WebFontConfig = {
google: {
families: ['Roboto']
},
active: function() {
// do something
init();
}
};
let stageWidth = 1920;
let stageHeight = 1080;
let moveVelocity = 2;
var ws;
var userDataSession;
var g;
var gameActorInitalized = false;
var gameStart = false;
var sinceLastHeartbeat = 0;
// game objects
let boardTiles = new Map()
let spriteContainers = new Map()
let sprites = new Map()
let attackLabels = new Map()
let healthLabels = new Map()
let handContainers = [null,null,null,null,null,null]
let handSprites = [null,null,null,null,null,null];
let cardJSON = [null,null,null,null,null,null];
let cardPreview = null;
let prevewCountdown = 0;
let activeMoves = new Map()
let activeProjectiles = [];
let drawUnitQueue = [];
let drawTileQueue = [];
let player1ManaIcons = new Map()
let player2ManaIcons = new Map()
let player1Health = null;
let player2Health = null;
let player1Notification = null;
let player2Notification = null;
let player1NotificationText = null;
let player2NotificationText = null;
let playingEffects = [];
function init() {
openWebSocketConnection();
}
function openWebSocketConnection() {
var wsURL = document.getElementById("mainBody").getAttribute("wsdata");
//alert(wsURL);
ws = new WebSocket(wsURL);
ws.onmessage = function (event) {
var message;
message = JSON.parse(event.data);
console.log(message);
switch (message.messagetype) {
case "actorReady":
initHexi(message.preloadImages);
gameActorInitalized = true;
break;
case "drawTile":
//console.log(message);
drawTileQueue.push(message);
break;
case "drawUnit":
drawUnitQueue.push(message);
break;
case "moveUnit":
moveUnit(message.unitID,message.tilex,message.tiley);
break;
case "moveUnitToTile":
moveUnitToTile(message);
break;
case "setUnitHealth":
setUnitHealth(message);
break;
case "setUnitAttack":
setUnitAttack(message);
break;
case "setPlayer1Health":
setPlayer1Health(message);
break;
case "setPlayer2Health":
setPlayer2Health(message);
break;
case "setPlayer1Mana":
setPlayer1Mana(message);
break;
case "setPlayer2Mana":
setPlayer2Mana(message);
break;
case "addPlayer1Notification":
addPlayer1Notification(message);
break;
case "addPlayer2Notification":
addPlayer2Notification(message);
break;
case "playUnitAnimation":
playUnitAnimation(message);
break;
case "drawCard":
drawCard(message);
break;
case "deleteCard":
deleteCard(message);
break;
case "playEffectAnimation":
playEffectAnimation(message);
break;
case "deleteUnit":
deleteUnit(message);
break;
case "drawProjectile":
drawProjectile(message);
break;
default:
return console.log(message);
}
};
}
</script>
</body>
</html>

+ 32
- 0
build.sbt View File

@@ -0,0 +1,32 @@
lazy val root = (project in file("."))
.enablePlugins(PlayJava)
.settings(
name := "ITSD Card Game 23-24",
version := "1.1",
scalaVersion := "2.13.1",
// https://github.com/sbt/junit-interface
testOptions += Tests.Argument(TestFrameworks.JUnit, "-a", "-v"),
libraryDependencies ++= Seq(
guice,
ws,
"org.webjars" %% "webjars-play" % "2.8.0",
"org.webjars" % "bootstrap" % "2.3.2",
"org.webjars" % "flot" % "0.8.3",

// Testing libraries for dealing with CompletionStage...
"org.assertj" % "assertj-core" % "3.14.0" % Test,
"org.awaitility" % "awaitility" % "4.0.1" % Test,
),
dependencyOverrides += "commons-codec" % "commons-codec" % "1.6",
dependencyOverrides += "commons-io" % "commons-io" % "2.1",
libraryDependencies += "com.fasterxml.jackson.core" % "jackson-databind" % "2.10.3",
libraryDependencies += "com.fasterxml.jackson.dataformat" % "jackson-dataformat-yaml" % "2.10.3",
libraryDependencies += "junit" % "junit" % "4.13.2",
libraryDependencies += "com.novocode" % "junit-interface" % "0.11" % Test exclude("junit", "junit-dep"),
LessKeys.compress := true,
javacOptions ++= Seq(
"-Xlint:unchecked",
"-Xlint:deprecation",
"-Werror"
)
)

+ 38
- 0
conf/application.conf View File

@@ -0,0 +1,38 @@
# This is the main configuration file for the application.
# ~~~~~

# Uncomment this for the most verbose Akka debugging:
akka {
loggers = ["akka.event.slf4j.Slf4jLogger"]
loglevel = "INFO"
logging-filter = "akka.event.slf4j.Slf4jLoggingFilter"
#actor {
# debug {
# receive = on
# autoreceive = on
# lifecycle = on
# }
#}
}

# https://www.playframework.com/documentation/latest/SecurityHeaders
# Allow URLs from the same origin to be loaded by frames and scripts
play.filters.headers {
frameOptions = "SAMEORIGIN"
}

play.filters.csp.directives {
connect-src = "'self'"
default-src = "'self'"
}

# https://www.playframework.com/documentation/latest/AllowedHostsFilter
# Allow requests to localhost:9000.
play.filters.hosts {
allowed = ["localhost:9000"]
}

play.filters.enabled += "play.filters.csrf.CSRFFilter"

default.stocks=["GOOG", "AAPL", "ORCL"]


+ 1
- 0
conf/gameconfs/avatars/avatar1.json View File

@@ -0,0 +1 @@
{ "id" : 0, "animation" : "idle", "position" : { "xpos" : 0, "ypos" : 0, "tilex" : 0, "tiley" : 0 }, "animations" : { "allFrames" : [ "f4_3rdgeneral_attack_000.png", "f4_3rdgeneral_attack_001.png", "f4_3rdgeneral_attack_002.png", "f4_3rdgeneral_attack_003.png", "f4_3rdgeneral_attack_004.png", "f4_3rdgeneral_attack_005.png", "f4_3rdgeneral_attack_006.png", "f4_3rdgeneral_attack_007.png", "f4_3rdgeneral_attack_008.png", "f4_3rdgeneral_attack_009.png", "f4_3rdgeneral_attack_010.png", "f4_3rdgeneral_attack_011.png", "f4_3rdgeneral_attack_012.png", "f4_3rdgeneral_attack_013.png", "f4_3rdgeneral_attack_014.png", "f4_3rdgeneral_attack_015.png", "f4_3rdgeneral_attack_016.png", "f4_3rdgeneral_attack_017.png", "f4_3rdgeneral_attack_018.png", "f4_3rdgeneral_attack_019.png", "f4_3rdgeneral_attack_020.png", "f4_3rdgeneral_attack_021.png", "f4_3rdgeneral_attack_022.png", "f4_3rdgeneral_attack_023.png", "f4_3rdgeneral_attack_024.png", "f4_3rdgeneral_attack_025.png", "f4_3rdgeneral_attack_026.png", "f4_3rdgeneral_attack_027.png", "f4_3rdgeneral_attack_028.png", "f4_3rdgeneral_attack_029.png", "f4_3rdgeneral_attack_030.png", "f4_3rdgeneral_attack_031.png", "f4_3rdgeneral_attack_032.png", "f4_3rdgeneral_breathing_000.png", "f4_3rdgeneral_breathing_001.png", "f4_3rdgeneral_breathing_002.png", "f4_3rdgeneral_breathing_003.png", "f4_3rdgeneral_breathing_004.png", "f4_3rdgeneral_breathing_005.png", "f4_3rdgeneral_breathing_006.png", "f4_3rdgeneral_breathing_007.png", "f4_3rdgeneral_breathing_008.png", "f4_3rdgeneral_breathing_009.png", "f4_3rdgeneral_breathing_010.png", "f4_3rdgeneral_breathing_011.png", "f4_3rdgeneral_breathing_012.png", "f4_3rdgeneral_breathing_013.png", "f4_3rdgeneral_cast_000.png", "f4_3rdgeneral_cast_001.png", "f4_3rdgeneral_cast_002.png", "f4_3rdgeneral_cast_003.png", "f4_3rdgeneral_cast_004.png", "f4_3rdgeneral_cast_005.png", "f4_3rdgeneral_cast_006.png", "f4_3rdgeneral_cast_007.png", "f4_3rdgeneral_cast_008.png", "f4_3rdgeneral_cast_009.png", "f4_3rdgeneral_cast_010.png", "f4_3rdgeneral_cast_011.png", "f4_3rdgeneral_cast_012.png", "f4_3rdgeneral_cast_013.png", "f4_3rdgeneral_cast_014.png", "f4_3rdgeneral_cast_015.png", "f4_3rdgeneral_cast_016.png", "f4_3rdgeneral_castend_000.png", "f4_3rdgeneral_castend_001.png", "f4_3rdgeneral_castend_002.png", "f4_3rdgeneral_castend_003.png", "f4_3rdgeneral_castend_004.png", "f4_3rdgeneral_castloop_000.png", "f4_3rdgeneral_castloop_001.png", "f4_3rdgeneral_castloop_002.png", "f4_3rdgeneral_castloop_003.png", "f4_3rdgeneral_caststart_000.png", "f4_3rdgeneral_caststart_001.png", "f4_3rdgeneral_caststart_002.png", "f4_3rdgeneral_caststart_003.png", "f4_3rdgeneral_caststart_004.png", "f4_3rdgeneral_death_000.png", "f4_3rdgeneral_death_001.png", "f4_3rdgeneral_death_002.png", "f4_3rdgeneral_death_003.png", "f4_3rdgeneral_death_004.png", "f4_3rdgeneral_death_005.png", "f4_3rdgeneral_death_006.png", "f4_3rdgeneral_death_007.png", "f4_3rdgeneral_death_008.png", "f4_3rdgeneral_death_009.png", "f4_3rdgeneral_death_010.png", "f4_3rdgeneral_hit_000.png", "f4_3rdgeneral_hit_001.png", "f4_3rdgeneral_hit_002.png", "f4_3rdgeneral_idle_000.png", "f4_3rdgeneral_idle_001.png", "f4_3rdgeneral_idle_002.png", "f4_3rdgeneral_idle_003.png", "f4_3rdgeneral_idle_004.png", "f4_3rdgeneral_idle_005.png", "f4_3rdgeneral_idle_006.png", "f4_3rdgeneral_idle_007.png", "f4_3rdgeneral_idle_008.png", "f4_3rdgeneral_idle_009.png", "f4_3rdgeneral_idle_010.png", "f4_3rdgeneral_idle_011.png", "f4_3rdgeneral_idle_012.png", "f4_3rdgeneral_idle_013.png", "f4_3rdgeneral_idle_014.png", "f4_3rdgeneral_idle_015.png", "f4_3rdgeneral_run_000.png", "f4_3rdgeneral_run_001.png", "f4_3rdgeneral_run_002.png", "f4_3rdgeneral_run_003.png", "f4_3rdgeneral_run_004.png", "f4_3rdgeneral_run_005.png", "f4_3rdgeneral_run_006.png", "f4_3rdgeneral_run_007.png", "f4_3rdgeneral_run_008.png", "f4_3rdgeneral_run_009.png" ], "frameDIR": "assets/game/extra/units/f4_3rdgeneral/", "idle" : { "frameStartEndIndices" : [ 92, 107 ], "fps" : 8, "loop" : true }, "death" : { "frameStartEndIndices" : [ 78, 88 ], "fps" : 8, "loop" : false }, "attack" : { "frameStartEndIndices" : [ 0, 32 ], "fps" : 20, "loop" : false }, "move" : { "frameStartEndIndices" : [ 108, 117 ], "fps" : 8, "loop" : true }, "channel" : { "frameStartEndIndices" : [ 69, 72 ], "fps" : 8, "loop" : true }, "hit" : { "frameStartEndIndices" : [ 89, 90 ], "fps" : 8, "loop" : false } }, "correction" : { "imgWidth" : 130, "imgHeight" : 130, "scale": 1.5, "offsetX": -40, "offsetY": -60, "spriteTopLeftX" : 0, "spriteTopLeftY" : 0, "reflected" : false } }

+ 1
- 0
conf/gameconfs/avatars/avatar2.json
File diff suppressed because it is too large
View File


+ 28
- 0
conf/gameconfs/cards/1_1_c_u_bad_omen.json View File

@@ -0,0 +1,28 @@
{
"id": 0,
"cardname": "Bad Omen",
"manacost": 0,
"miniCard": {
"cardTextures": [
"assets/game/extra/cards/card_background.png",
"assets/game/extra/cards/card_background_highlight.png"
],
"animationFrames": [],
"fps": 10,
"index": 0
},
"bigCard": {
"rulesTextRows": [
"Deathwatch (whenever a unit, friendly or",
"enemy dies, trigger the following effect):",
"This unit gains +1 attack permanently."
],
"cardTextures": [
"assets/game/extra/cards/neutral_unit_h.png"
],
"attack": 0,
"health": 1
},
"isCreature": true,
"unitConfig": "conf/gameconfs/units/bad_omen.json"
}

+ 46
- 0
conf/gameconfs/cards/1_2_c_s_hornoftheforsaken.json View File

@@ -0,0 +1,46 @@
{
"id": 0,
"cardname": "Horn of the Forsaken",
"manacost": 1,
"miniCard": {
"cardTextures": [
"assets/game/extra/cards/card_background.png",
"assets/game/extra/cards/card_background_highlight.png"
],
"animationFrames": [
"assets/game/extra/cards/minicards/artifact_f4_hornofforsaken/artifact_f4_hornofforsaken_active_000.png",
"assets/game/extra/cards/minicards/artifact_f4_hornofforsaken/artifact_f4_hornofforsaken_active_001.png",
"assets/game/extra/cards/minicards/artifact_f4_hornofforsaken/artifact_f4_hornofforsaken_active_002.png",
"assets/game/extra/cards/minicards/artifact_f4_hornofforsaken/artifact_f4_hornofforsaken_active_003.png",
"assets/game/extra/cards/minicards/artifact_f4_hornofforsaken/artifact_f4_hornofforsaken_active_004.png",
"assets/game/extra/cards/minicards/artifact_f4_hornofforsaken/artifact_f4_hornofforsaken_active_005.png",
"assets/game/extra/cards/minicards/artifact_f4_hornofforsaken/artifact_f4_hornofforsaken_active_006.png",
"assets/game/extra/cards/minicards/artifact_f4_hornofforsaken/artifact_f4_hornofforsaken_active_007.png",
"assets/game/extra/cards/minicards/artifact_f4_hornofforsaken/artifact_f4_hornofforsaken_active_008.png",
"assets/game/extra/cards/minicards/artifact_f4_hornofforsaken/artifact_f4_hornofforsaken_active_009.png",
"assets/game/extra/cards/minicards/artifact_f4_hornofforsaken/artifact_f4_hornofforsaken_active_010.png",
"assets/game/extra/cards/minicards/artifact_f4_hornofforsaken/artifact_f4_hornofforsaken_active_011.png",
"assets/game/extra/cards/minicards/artifact_f4_hornofforsaken/artifact_f4_hornofforsaken_active_012.png",
"assets/game/extra/cards/minicards/artifact_f4_hornofforsaken/artifact_f4_hornofforsaken_active_013.png",
"assets/game/extra/cards/minicards/artifact_f4_hornofforsaken/artifact_f4_hornofforsaken_active_014.png",
"assets/game/extra/cards/minicards/artifact_f4_hornofforsaken/artifact_f4_hornofforsaken_active_015.png",
"assets/game/extra/cards/minicards/artifact_f4_hornofforsaken/artifact_f4_hornofforsaken_active_016.png",
"assets/game/extra/cards/minicards/artifact_f4_hornofforsaken/artifact_f4_hornofforsaken_active_017.png"
],
"fps": 10,
"index": 18
},
"bigCard": {
"rulesTextRows": [
"Artifact(3), On-hit summon",
"a wraithling."
],
"cardTextures": [
"assets/game/extra/cards/neutral_spell.png"
],
"attack": -1,
"health": -1
},
"isCreature": false,
"unitConfig": null
}

+ 29
- 0
conf/gameconfs/cards/1_3_c_u_gloom_chaser.json View File

@@ -0,0 +1,29 @@
{
"id": 0,
"cardname": "Gloom Chaser",
"manacost": 2,
"miniCard": {
"cardTextures": [
"assets/game/extra/cards/card_background.png",
"assets/game/extra/cards/card_background_highlight.png"
],
"animationFrames": [],
"fps": 10,
"index": 0
},
"bigCard": {
"rulesTextRows": [
"Opening Gambit (whenever a unit is summoned",
"onto the battlefield, trigger the following",
"effect): Summon a Wraithling directly behind",
"this unit."
],
"cardTextures": [
"assets/game/extra/cards/neutral_unit_h.png"
],
"attack": 3,
"health": 1
},
"isCreature": true,
"unitConfig": "conf/gameconfs/units/gloom_chaser.json"
}

+ 28
- 0
conf/gameconfs/cards/1_4_c_u_shadow_watcher.json View File

@@ -0,0 +1,28 @@
{
"id": 0,
"cardname": "Shadow Watcher",
"manacost": 3,
"miniCard": {
"cardTextures": [
"assets/game/extra/cards/card_background.png",
"assets/game/extra/cards/card_background_highlight.png"
],
"animationFrames": [],
"fps": 10,
"index": 0
},
"bigCard": {
"rulesTextRows": [
"Deathwatch (whenever a unit, friendly or enemy",
"dies, trigger the following effect): This unit",
"gains +1 attack and +1 health permanently."
],
"cardTextures": [
"assets/game/extra/cards/neutral_unit_h.png"
],
"attack": 3,
"health": 2
},
"isCreature": true,
"unitConfig": "conf/gameconfs/units/shadow_watcher.json"
}

+ 37
- 0
conf/gameconfs/cards/1_5_c_s_wraithling_swarm.json View File

@@ -0,0 +1,37 @@
{
"id": 0,
"cardname": "Wraithling Swarm",
"manacost": 3,
"miniCard": {
"cardTextures": [
"assets/game/extra/cards/card_background.png",
"assets/game/extra/cards/card_background_highlight.png"
],
"animationFrames": [
"assets/game/extra/cards/minicards/icon_f4_wraithlingswarm/icon_f4_wraithlingswarm_active_000.png",
"assets/game/extra/cards/minicards/icon_f4_wraithlingswarm/icon_f4_wraithlingswarm_active_001.png",
"assets/game/extra/cards/minicards/icon_f4_wraithlingswarm/icon_f4_wraithlingswarm_active_002.png",
"assets/game/extra/cards/minicards/icon_f4_wraithlingswarm/icon_f4_wraithlingswarm_active_003.png",
"assets/game/extra/cards/minicards/icon_f4_wraithlingswarm/icon_f4_wraithlingswarm_active_004.png",
"assets/game/extra/cards/minicards/icon_f4_wraithlingswarm/icon_f4_wraithlingswarm_active_005.png",
"assets/game/extra/cards/minicards/icon_f4_wraithlingswarm/icon_f4_wraithlingswarm_active_006.png",
"assets/game/extra/cards/minicards/icon_f4_wraithlingswarm/icon_f4_wraithlingswarm_active_007.png",
"assets/game/extra/cards/minicards/icon_f4_wraithlingswarm/icon_f4_wraithlingswarm_active_008.png",
"assets/game/extra/cards/minicards/icon_f4_wraithlingswarm/icon_f4_wraithlingswarm_active_009.png"
],
"fps": 10,
"index": 18
},
"bigCard": {
"rulesTextRows": [
"Summon three Wraithlings"
],
"cardTextures": [
"assets/game/extra/cards/neutral_spell.png"
],
"attack": -1,
"health": -1
},
"isCreature": false,
"unitConfig": null
}

+ 29
- 0
conf/gameconfs/cards/1_6_c_u_nightsorrow_assassin.json View File

@@ -0,0 +1,29 @@
{
"id": 0,
"cardname": "Nightsorrow Assassin",
"manacost": 3,
"miniCard": {
"cardTextures": [
"assets/game/extra/cards/card_background.png",
"assets/game/extra/cards/card_background_highlight.png"
],
"animationFrames": [],
"fps": 10,
"index": 0
},
"bigCard": {
"rulesTextRows": [
"Opening Gambit (whenever a unit is summoned onto",
"the battlefield, trigger the following effect):",
"Destroy an enemy unit in an adjacent square that",
"that is below its maximum heath."
],
"cardTextures": [
"assets/game/extra/cards/neutral_unit_h.png"
],
"attack": 4,
"health": 2
},
"isCreature": true,
"unitConfig": "conf/gameconfs/units/nightsorrow_assassin.json"
}

+ 28
- 0
conf/gameconfs/cards/1_7_c_u_rock_pulveriser.json View File

@@ -0,0 +1,28 @@
{
"id": 0,
"cardname": "Rock Pulveriser",
"manacost": 2,
"miniCard": {
"cardTextures": [
"assets/game/extra/cards/card_background.png",
"assets/game/extra/cards/card_background_highlight.png"
],
"animationFrames": [
"assets/game/extra/units/neutral_zyx/neutral_zyx_run_000.png", "assets/game/extra/units/neutral_zyx/neutral_zyx_run_001.png", "assets/game/extra/units/neutral_zyx/neutral_zyx_run_002.png", "assets/game/extra/units/neutral_zyx/neutral_zyx_run_003.png", "assets/game/extra/units/neutral_zyx/neutral_zyx_run_004.png", "assets/game/extra/units/neutral_zyx/neutral_zyx_run_005.png", "assets/game/extra/units/neutral_zyx/neutral_zyx_run_006.png", "assets/game/extra/units/neutral_zyx/neutral_zyx_run_007.png"
],
"fps": 10,
"index": 0
},
"bigCard": {
"rulesTextRows": [
"Provoke"
],
"cardTextures": [
"assets/game/extra/cards/neutral_unit_h.png"
],
"attack": 1,
"health": 4
},
"isCreature": true,
"unitConfig": "conf/gameconfs/units/rock_pulveriser.json"
}

+ 38
- 0
conf/gameconfs/cards/1_8_c_s_dark_terminus.json View File

@@ -0,0 +1,38 @@
{
"id": 0,
"cardname": "Dark Terminus",
"manacost": 4,
"miniCard": {
"cardTextures": [
"assets/game/extra/cards/card_background.png",
"assets/game/extra/cards/card_background_highlight.png"
],
"animationFrames": [
"assets/game/extra/cards/minicards/icon_f4_curseofagony/icon_f4_curseofagony_active_000.png",
"assets/game/extra/cards/minicards/icon_f4_curseofagony/icon_f4_curseofagony_active_001.png",
"assets/game/extra/cards/minicards/icon_f4_curseofagony/icon_f4_curseofagony_active_002.png",
"assets/game/extra/cards/minicards/icon_f4_curseofagony/icon_f4_curseofagony_active_003.png",
"assets/game/extra/cards/minicards/icon_f4_curseofagony/icon_f4_curseofagony_active_004.png",
"assets/game/extra/cards/minicards/icon_f4_curseofagony/icon_f4_curseofagony_active_005.png",
"assets/game/extra/cards/minicards/icon_f4_curseofagony/icon_f4_curseofagony_active_006.png",
"assets/game/extra/cards/minicards/icon_f4_curseofagony/icon_f4_curseofagony_active_007.png",
"assets/game/extra/cards/minicards/icon_f4_curseofagony/icon_f4_curseofagony_active_008.png",
"assets/game/extra/cards/minicards/icon_f4_curseofagony/icon_f4_curseofagony_active_009.png"
],
"fps": 10,
"index": 18
},
"bigCard": {
"rulesTextRows": [
"Destroy an enemy creature. Summon",
"a wraithling in its place."
],
"cardTextures": [
"assets/game/extra/cards/neutral_spell.png"
],
"attack": -1,
"health": -1
},
"isCreature": false,
"unitConfig": null
}

+ 29
- 0
conf/gameconfs/cards/1_9_c_u_bloodmoon_priestess.json View File

@@ -0,0 +1,29 @@
{
"id": 0,
"cardname": "Bloodmoon Priestess",
"manacost": 4,
"miniCard": {
"cardTextures": [
"assets/game/extra/cards/card_background.png",
"assets/game/extra/cards/card_background_highlight.png"
],
"animationFrames": [],
"fps": 10,
"index": 0
},
"bigCard": {
"rulesTextRows": [
"Deathwatch (whenever a unit, friendly or enemy",
"dies, trigger the following effect): Summon a",
"Wraithling on a randomly selected unoccupied",
"adjacent tile."
],
"cardTextures": [
"assets/game/extra/cards/neutral_unit_h.png"
],
"attack": 3,
"health": 3
},
"isCreature": true,
"unitConfig": "conf/gameconfs/units/bloodmoon_priestess.json"
}

+ 27
- 0
conf/gameconfs/cards/1_a1_c_u_shadowdancer.json View File

@@ -0,0 +1,27 @@
{
"id": 2,
"cardname": "Shadowdancer",
"manacost": 5,
"miniCard": {
"cardTextures": [
"assets/game/extra/cards/card_background.png",
"assets/game/extra/cards/card_background_highlight.png"
],
"animationFrames": [],
"fps": 10,
"index": 0
},
"bigCard": {
"rulesTextRows": [
"Deathwatch: Deal 1 damage to the enemy",
"avatar and heal yourself for 1"
],
"cardTextures": [
"assets/game/extra/cards/neutral_unit_h.png"
],
"attack": 5,
"health": 4
},
"isCreature": true,
"unitConfig": "conf/gameconfs/units/shadowdancer.json"
}

+ 24
- 0
conf/gameconfs/cards/2_1_c_u_skyrock_golem.json View File

@@ -0,0 +1,24 @@
{
"id": 2,
"cardname": "Skyrock Golem",
"manacost": 2,
"miniCard": {
"cardTextures": [
"assets/game/extra/cards/card_background.png",
"assets/game/extra/cards/card_background_highlight.png"
],
"animationFrames": [],
"fps": 10,
"index": 0
},
"bigCard": {
"rulesTextRows": [],
"cardTextures": [
"assets/game/extra/cards/neutral_unit_h.png"
],
"attack": 4,
"health": 2
},
"isCreature": true,
"unitConfig": "conf/gameconfs/units/skyrock_golem.json"
}

+ 26
- 0
conf/gameconfs/cards/2_2_c_u_swamp_entangler.json View File

@@ -0,0 +1,26 @@
{
"id": 0,
"cardname": "Swamp Entangler",
"manacost": 1,
"miniCard": {
"cardTextures": [
"assets/game/extra/cards/card_background.png",
"assets/game/extra/cards/card_background_highlight.png"
],
"animationFrames": [],
"fps": 10,
"index": 0
},
"bigCard": {
"rulesTextRows": [
"Provoke"
],
"cardTextures": [
"assets/game/extra/cards/neutral_unit_h.png"
],
"attack": 0,
"health": 3
},
"isCreature": true,
"unitConfig": "conf/gameconfs/units/swamp_entangler.json"
}

+ 30
- 0
conf/gameconfs/cards/2_3_c_u_silverguard_knight.json View File

@@ -0,0 +1,30 @@
{
"id": 0,
"cardname": "Silverguard Knight",
"manacost": 3,
"miniCard": {
"cardTextures": [
"assets/game/extra/cards/card_background.png",
"assets/game/extra/cards/card_background_highlight.png"
],
"animationFrames": [
"assets/game/extra/units/f1_tank/f1_tank_run_000.png", "assets/game/extra/units/f1_tank/f1_tank_run_001.png", "assets/game/extra/units/f1_tank/f1_tank_run_002.png", "assets/game/extra/units/f1_tank/f1_tank_run_003.png", "assets/game/extra/units/f1_tank/f1_tank_run_004.png", "assets/game/extra/units/f1_tank/f1_tank_run_005.png", "assets/game/extra/units/f1_tank/f1_tank_run_006.png", "assets/game/extra/units/f1_tank/f1_tank_run_007.png"
],
"fps": 10,
"index": 0
},
"bigCard": {
"rulesTextRows": [
"Provoke,",
"If your avatar is dealt damage this",
"unit gains +2/+0"
],
"cardTextures": [
"assets/game/extra/cards/neutral_unit_h.png"
],
"attack": 1,
"health": 5
},
"isCreature": true,
"unitConfig": "conf/gameconfs/units/silverguard_knight.json"
}

+ 24
- 0
conf/gameconfs/cards/2_4_c_u_saberspine_tiger.json View File

@@ -0,0 +1,24 @@
{
"id": 2,
"cardname": "Saberspine Tiger",
"manacost": 3,
"miniCard": {
"cardTextures": [
"assets/game/extra/cards/card_background.png",
"assets/game/extra/cards/card_background_highlight.png"
],
"animationFrames": [],
"fps": 10,
"index": 0
},
"bigCard": {
"rulesTextRows": ["Rush"],
"cardTextures": [
"assets/game/extra/cards/neutral_unit_h.png"
],
"attack": 3,
"health": 2
},
"isCreature": true,
"unitConfig": "conf/gameconfs/units/saberspine_tiger.json"
}

+ 36
- 0
conf/gameconfs/cards/2_5_c_s_beamshock.json View File

@@ -0,0 +1,36 @@
{
"id": 0,
"cardname": "Beamshock",
"manacost": 1,
"miniCard": {
"cardTextures": [
"assets/game/extra/cards/card_background.png",
"assets/game/extra/cards/card_background_highlight.png"
],
"animationFrames": [
"assets/game/extra/cards/minicards/icon_f1_beamshock/icon_f1_beamshock_active_000.png",
"assets/game/extra/cards/minicards/icon_f1_beamshock/icon_f1_beamshock_active_001.png",
"assets/game/extra/cards/minicards/icon_f1_beamshock/icon_f1_beamshock_active_002.png",
"assets/game/extra/cards/minicards/icon_f1_beamshock/icon_f1_beamshock_active_003.png",
"assets/game/extra/cards/minicards/icon_f1_beamshock/icon_f1_beamshock_active_004.png",
"assets/game/extra/cards/minicards/icon_f1_beamshock/icon_f1_beamshock_active_005.png",
"assets/game/extra/cards/minicards/icon_f1_beamshock/icon_f1_beamshock_active_006.png",
"assets/game/extra/cards/minicards/icon_f1_beamshock/icon_f1_beamshock_active_007.png",
"assets/game/extra/cards/minicards/icon_f1_beamshock/icon_f1_beamshock_active_008.png"
],
"fps": 10,
"index": 18
},
"bigCard": {
"rulesTextRows": [
"Stun an enemy unit."
],
"cardTextures": [
"assets/game/extra/cards/neutral_spell.png"
],
"attack": -1,
"health": -1
},
"isCreature": false,
"unitConfig": null
}

+ 24
- 0
conf/gameconfs/cards/2_6_c_u_young_flamewing.json View File

@@ -0,0 +1,24 @@
{
"id": 2,
"cardname": "Young Flamewing",
"manacost": 4,
"miniCard": {
"cardTextures": [
"assets/game/extra/cards/card_background.png",
"assets/game/extra/cards/card_background_highlight.png"
],
"animationFrames": [],
"fps": 10,
"index": 0
},
"bigCard": {
"rulesTextRows": ["Flying"],
"cardTextures": [
"assets/game/extra/cards/neutral_unit_h.png"
],
"attack": 5,
"health": 4
},
"isCreature": true,
"unitConfig": "conf/gameconfs/units/young_flamewing.json"
}

+ 27
- 0
conf/gameconfs/cards/2_7_c_u_silverguard_squire.json View File

@@ -0,0 +1,27 @@
{
"id": 0,
"cardname": "Silverguard Squire",
"manacost": 1,
"miniCard": {
"cardTextures": [
"assets/game/extra/cards/card_background.png",
"assets/game/extra/cards/card_background_highlight.png"
],
"animationFrames": [],
"fps": 10,
"index": 0
},
"bigCard": {
"rulesTextRows": [
"Opening Gambit: Allied units in-front",
"and behind you get +1/+1."
],
"cardTextures": [
"assets/game/extra/cards/neutral_unit_h.png"
],
"attack": 1,
"health": 1
},
"isCreature": true,
"unitConfig": "conf/gameconfs/units/silverguard_squire.json"
}

+ 28
- 0
conf/gameconfs/cards/2_8_c_u_ironcliff_guardian.json View File

@@ -0,0 +1,28 @@
{
"id": 0,
"cardname": "Ironcliff Guardian",
"manacost": 5,
"miniCard": {
"cardTextures": [
"assets/game/extra/cards/card_background.png",
"assets/game/extra/cards/card_background_highlight.png"
],
"animationFrames": [
"assets/game/extra/units/f1_ironcliffeguardian/f1_ironcliffeguardian_run_000.png", "assets/game/extra/units/f1_ironcliffeguardian/f1_ironcliffeguardian_run_001.png", "assets/game/extra/units/f1_ironcliffeguardian/f1_ironcliffeguardian_run_002.png", "assets/game/extra/units/f1_ironcliffeguardian/f1_ironcliffeguardian_run_003.png", "assets/game/extra/units/f1_ironcliffeguardian/f1_ironcliffeguardian_run_004.png", "assets/game/extra/units/f1_ironcliffeguardian/f1_ironcliffeguardian_run_005.png", "assets/game/extra/units/f1_ironcliffeguardian/f1_ironcliffeguardian_run_006.png", "assets/game/extra/units/f1_ironcliffeguardian/f1_ironcliffeguardian_run_007.png"
],
"fps": 10,
"index": 0
},
"bigCard": {
"rulesTextRows": [
"Provoke, Airdrop"
],
"cardTextures": [
"assets/game/extra/cards/neutral_unit_h.png"
],
"attack": 3,
"health": 10
},
"isCreature": true,
"unitConfig": "conf/gameconfs/units/ironcliff_guardian.json"
}

+ 33
- 0
conf/gameconfs/cards/2_9_c_s_sundrop_elixir.json View File

@@ -0,0 +1,33 @@
{
"id": 0,
"cardname": "Sundrop Elixir",
"manacost": 1,
"miniCard": {
"cardTextures": [
"assets/game/extra/cards/card_background.png",
"assets/game/extra/cards/card_background_highlight.png"
],
"animationFrames": [
"assets/game/extra/cards/minicards/icon_f1_sundropelixir/icon_f1_sundropelixir_000.png",
"assets/game/extra/cards/minicards/icon_f1_sundropelixir/icon_f1_sundropelixir_001.png",
"assets/game/extra/cards/minicards/icon_f1_sundropelixir/icon_f1_sundropelixir_002.png",
"assets/game/extra/cards/minicards/icon_f1_sundropelixir/icon_f1_sundropelixir_003.png"
],
"fps": 5,
"index": 2
},
"bigCard": {
"rulesTextRows": [
"Add 5 health to a target unit.",
"This cannot take a unit over",
"its starting health value."
],
"cardTextures": [
"assets/game/extra/cards/neutral_spell.png"
],
"attack": -1,
"health": -1
},
"isCreature": false,
"unitConfig": null
}

+ 46
- 0
conf/gameconfs/cards/2_a1_c_s_truestrike.json View File

@@ -0,0 +1,46 @@
{
"id": 0,
"cardname": "Truestrike",
"manacost": 1,
"miniCard": {
"cardTextures": [
"assets/game/extra/cards/card_background.png",
"assets/game/extra/cards/card_background_highlight.png"
],
"animationFrames": [
"assets/game/extra/cards/minicards/icon_f1_truestrike/icon_f1_truestrike_active_000.png",
"assets/game/extra/cards/minicards/icon_f1_truestrike/icon_f1_truestrike_active_001.png",
"assets/game/extra/cards/minicards/icon_f1_truestrike/icon_f1_truestrike_active_002.png",
"assets/game/extra/cards/minicards/icon_f1_truestrike/icon_f1_truestrike_active_003.png",
"assets/game/extra/cards/minicards/icon_f1_truestrike/icon_f1_truestrike_active_004.png",
"assets/game/extra/cards/minicards/icon_f1_truestrike/icon_f1_truestrike_active_005.png",
"assets/game/extra/cards/minicards/icon_f1_truestrike/icon_f1_truestrike_active_006.png",
"assets/game/extra/cards/minicards/icon_f1_truestrike/icon_f1_truestrike_active_007.png",
"assets/game/extra/cards/minicards/icon_f1_truestrike/icon_f1_truestrike_active_008.png",
"assets/game/extra/cards/minicards/icon_f1_truestrike/icon_f1_truestrike_active_009.png",
"assets/game/extra/cards/minicards/icon_f1_truestrike/icon_f1_truestrike_active_010.png",
"assets/game/extra/cards/minicards/icon_f1_truestrike/icon_f1_truestrike_active_011.png",
"assets/game/extra/cards/minicards/icon_f1_truestrike/icon_f1_truestrike_active_012.png",
"assets/game/extra/cards/minicards/icon_f1_truestrike/icon_f1_truestrike_active_013.png",
"assets/game/extra/cards/minicards/icon_f1_truestrike/icon_f1_truestrike_active_014.png",
"assets/game/extra/cards/minicards/icon_f1_truestrike/icon_f1_truestrike_active_015.png",
"assets/game/extra/cards/minicards/icon_f1_truestrike/icon_f1_truestrike_active_016.png",
"assets/game/extra/cards/minicards/icon_f1_truestrike/icon_f1_truestrike_active_017.png",
"assets/game/extra/cards/minicards/icon_f1_truestrike/icon_f1_truestrike_active_018.png"
],
"fps": 10,
"index": 18
},
"bigCard": {
"rulesTextRows": [
"Deal 2 damage to an enemy unit"
],
"cardTextures": [
"assets/game/extra/cards/neutral_spell.png"
],
"attack": -1,
"health": -1
},
"isCreature": false,
"unitConfig": null
}

+ 28
- 0
conf/gameconfs/effects/f1_buff.json View File

@@ -0,0 +1,28 @@
{
"animationTextures": [
"assets/game/extra/cards/minicards/fx_buff/fx_buff_000.png",
"assets/game/extra/cards/minicards/fx_buff/fx_buff_001.png",
"assets/game/extra/cards/minicards/fx_buff/fx_buff_002.png",
"assets/game/extra/cards/minicards/fx_buff/fx_buff_003.png",
"assets/game/extra/cards/minicards/fx_buff/fx_buff_004.png",
"assets/game/extra/cards/minicards/fx_buff/fx_buff_005.png",
"assets/game/extra/cards/minicards/fx_buff/fx_buff_006.png",
"assets/game/extra/cards/minicards/fx_buff/fx_buff_007.png",
"assets/game/extra/cards/minicards/fx_buff/fx_buff_008.png",
"assets/game/extra/cards/minicards/fx_buff/fx_buff_008.png",
"assets/game/extra/cards/minicards/fx_buff/fx_buff_009.png",
"assets/game/extra/cards/minicards/fx_buff/fx_buff_010.png",
"assets/game/extra/cards/minicards/fx_buff/fx_buff_011.png"
],
"correction": {
"imgWidth" : 100,
"imgHeight" : 100,
"scale": 1.0,
"offsetX": 5,
"offsetY": 5,
"spriteTopLeftX" : 0,
"spriteTopLeftY" : 0,
"reflected": false
},
"fps": 15
}

+ 38
- 0
conf/gameconfs/effects/f1_inmolation.json View File

@@ -0,0 +1,38 @@
{
"animationTextures": [
"assets/game/extra/cards/minicards/fx_f1_inmolation/fx_f1_inmolation_000.png",
"assets/game/extra/cards/minicards/fx_f1_inmolation/fx_f1_inmolation_001.png",
"assets/game/extra/cards/minicards/fx_f1_inmolation/fx_f1_inmolation_002.png",
"assets/game/extra/cards/minicards/fx_f1_inmolation/fx_f1_inmolation_003.png",
"assets/game/extra/cards/minicards/fx_f1_inmolation/fx_f1_inmolation_004.png",
"assets/game/extra/cards/minicards/fx_f1_inmolation/fx_f1_inmolation_005.png",
"assets/game/extra/cards/minicards/fx_f1_inmolation/fx_f1_inmolation_006.png",
"assets/game/extra/cards/minicards/fx_f1_inmolation/fx_f1_inmolation_007.png",
"assets/game/extra/cards/minicards/fx_f1_inmolation/fx_f1_inmolation_008.png",
"assets/game/extra/cards/minicards/fx_f1_inmolation/fx_f1_inmolation_008.png",
"assets/game/extra/cards/minicards/fx_f1_inmolation/fx_f1_inmolation_009.png",
"assets/game/extra/cards/minicards/fx_f1_inmolation/fx_f1_inmolation_010.png",
"assets/game/extra/cards/minicards/fx_f1_inmolation/fx_f1_inmolation_011.png",
"assets/game/extra/cards/minicards/fx_f1_inmolation/fx_f1_inmolation_012.png",
"assets/game/extra/cards/minicards/fx_f1_inmolation/fx_f1_inmolation_013.png",
"assets/game/extra/cards/minicards/fx_f1_inmolation/fx_f1_inmolation_014.png",
"assets/game/extra/cards/minicards/fx_f1_inmolation/fx_f1_inmolation_015.png",
"assets/game/extra/cards/minicards/fx_f1_inmolation/fx_f1_inmolation_016.png",
"assets/game/extra/cards/minicards/fx_f1_inmolation/fx_f1_inmolation_017.png",
"assets/game/extra/cards/minicards/fx_f1_inmolation/fx_f1_inmolation_018.png",
"assets/game/extra/cards/minicards/fx_f1_inmolation/fx_f1_inmolation_019.png",
"assets/game/extra/cards/minicards/fx_f1_inmolation/fx_f1_inmolation_020.png",
"assets/game/extra/cards/minicards/fx_f1_inmolation/fx_f1_inmolation_021.png"
],
"correction": {
"imgWidth" : 100,
"imgHeight" : 100,
"scale": 1.0,
"offsetX": 5,
"offsetY": 5,
"spriteTopLeftX" : 0,
"spriteTopLeftY" : 0,
"reflected": false
},
"fps": 15
}

+ 34
- 0
conf/gameconfs/effects/f1_martyrdom.json View File

@@ -0,0 +1,34 @@
{
"animationTextures": [
"assets/game/extra/cards/minicards/fx_martyrdom/fx_martyrdom_001.png",
"assets/game/extra/cards/minicards/fx_martyrdom/fx_martyrdom_002.png",
"assets/game/extra/cards/minicards/fx_martyrdom/fx_martyrdom_003.png",
"assets/game/extra/cards/minicards/fx_martyrdom/fx_martyrdom_004.png",
"assets/game/extra/cards/minicards/fx_martyrdom/fx_martyrdom_005.png",
"assets/game/extra/cards/minicards/fx_martyrdom/fx_martyrdom_006.png",
"assets/game/extra/cards/minicards/fx_martyrdom/fx_martyrdom_007.png",
"assets/game/extra/cards/minicards/fx_martyrdom/fx_martyrdom_008.png",
"assets/game/extra/cards/minicards/fx_martyrdom/fx_martyrdom_008.png",
"assets/game/extra/cards/minicards/fx_martyrdom/fx_martyrdom_009.png",
"assets/game/extra/cards/minicards/fx_martyrdom/fx_martyrdom_010.png",
"assets/game/extra/cards/minicards/fx_martyrdom/fx_martyrdom_011.png",
"assets/game/extra/cards/minicards/fx_martyrdom/fx_martyrdom_012.png",
"assets/game/extra/cards/minicards/fx_martyrdom/fx_martyrdom_013.png",
"assets/game/extra/cards/minicards/fx_martyrdom/fx_martyrdom_014.png",
"assets/game/extra/cards/minicards/fx_martyrdom/fx_martyrdom_015.png",
"assets/game/extra/cards/minicards/fx_martyrdom/fx_martyrdom_016.png",
"assets/game/extra/cards/minicards/fx_martyrdom/fx_martyrdom_017.png",
"assets/game/extra/cards/minicards/fx_martyrdom/fx_martyrdom_018.png"
],
"correction": {
"imgWidth" : 100,
"imgHeight" : 100,
"scale": 1.0,
"offsetX": 5,
"offsetY": 5,
"spriteTopLeftX" : 0,
"spriteTopLeftY" : 0,
"reflected": false
},
"fps": 15
}

+ 29
- 0
conf/gameconfs/effects/f1_projectiles.json View File

@@ -0,0 +1,29 @@
{
"animationTextures": [
"assets/game/extra/cards/minicards/fx_f1_casterprojectile/fx_f1casterprojectile_000.png",
"assets/game/extra/cards/minicards/fx_f1_casterprojectile/fx_f1casterprojectile_001.png",
"assets/game/extra/cards/minicards/fx_f1_casterprojectile/fx_f1casterprojectile_002.png",
"assets/game/extra/cards/minicards/fx_f1_casterprojectile/fx_f1casterprojectile_003.png",
"assets/game/extra/cards/minicards/fx_f1_casterprojectile/fx_f1casterprojectile_004.png",
"assets/game/extra/cards/minicards/fx_f1_casterprojectile/fx_f1casterprojectile_005.png",
"assets/game/extra/cards/minicards/fx_f1_casterprojectile/fx_f1casterprojectile_006.png",
"assets/game/extra/cards/minicards/fx_f1_casterprojectile/fx_f1casterprojectile_007.png",
"assets/game/extra/cards/minicards/fx_f1_casterprojectile/fx_f1casterprojectile_008.png",
"assets/game/extra/cards/minicards/fx_f1_casterprojectile/fx_f1casterprojectile_009.png",
"assets/game/extra/cards/minicards/fx_f1_casterprojectile/fx_f1casterprojectile_010.png",
"assets/game/extra/cards/minicards/fx_f1_casterprojectile/fx_f1casterprojectile_011.png",
"assets/game/extra/cards/minicards/fx_f1_casterprojectile/fx_f1casterprojectile_012.png",
"assets/game/extra/cards/minicards/fx_f1_casterprojectile/fx_f1casterprojectile_013.png"
],
"correction": {
"imgWidth" : 140,
"imgHeight" : 32,
"scale": 1.0,
"offsetX": 45,
"offsetY": 45,
"spriteTopLeftX" : 0,
"spriteTopLeftY" : 0,
"reflected": false
},
"fps": 15
}

+ 36
- 0
conf/gameconfs/effects/f1_soulshatter.json View File

@@ -0,0 +1,36 @@
{
"animationTextures": [
"assets/game/extra/cards/minicards/fx_f4_soulshatterpact/fx_f4_soulshatterpact_000.png",
"assets/game/extra/cards/minicards/fx_f4_soulshatterpact/fx_f4_soulshatterpact_001.png",
"assets/game/extra/cards/minicards/fx_f4_soulshatterpact/fx_f4_soulshatterpact_002.png",
"assets/game/extra/cards/minicards/fx_f4_soulshatterpact/fx_f4_soulshatterpact_003.png",
"assets/game/extra/cards/minicards/fx_f4_soulshatterpact/fx_f4_soulshatterpact_004.png",
"assets/game/extra/cards/minicards/fx_f4_soulshatterpact/fx_f4_soulshatterpact_005.png",
"assets/game/extra/cards/minicards/fx_f4_soulshatterpact/fx_f4_soulshatterpact_006.png",
"assets/game/extra/cards/minicards/fx_f4_soulshatterpact/fx_f4_soulshatterpact_007.png",
"assets/game/extra/cards/minicards/fx_f4_soulshatterpact/fx_f4_soulshatterpact_008.png",
"assets/game/extra/cards/minicards/fx_f4_soulshatterpact/fx_f4_soulshatterpact_009.png",
"assets/game/extra/cards/minicards/fx_f4_soulshatterpact/fx_f4_soulshatterpact_010.png",
"assets/game/extra/cards/minicards/fx_f4_soulshatterpact/fx_f4_soulshatterpact_011.png",
"assets/game/extra/cards/minicards/fx_f4_soulshatterpact/fx_f4_soulshatterpact_012.png",
"assets/game/extra/cards/minicards/fx_f4_soulshatterpact/fx_f4_soulshatterpact_013.png",
"assets/game/extra/cards/minicards/fx_f4_soulshatterpact/fx_f4_soulshatterpact_014.png",
"assets/game/extra/cards/minicards/fx_f4_soulshatterpact/fx_f4_soulshatterpact_015.png",
"assets/game/extra/cards/minicards/fx_f4_soulshatterpact/fx_f4_soulshatterpact_016.png",
"assets/game/extra/cards/minicards/fx_f4_soulshatterpact/fx_f4_soulshatterpact_017.png",
"assets/game/extra/cards/minicards/fx_f4_soulshatterpact/fx_f4_soulshatterpact_018.png",
"assets/game/extra/cards/minicards/fx_f4_soulshatterpact/fx_f4_soulshatterpact_019.png",
"assets/game/extra/cards/minicards/fx_f4_soulshatterpact/fx_f4_soulshatterpact_020.png"
],
"correction": {
"imgWidth" : 80,
"imgHeight" : 80,
"scale": 2.0,
"offsetX": -20,
"offsetY": -20,
"spriteTopLeftX" : 0,
"spriteTopLeftY" : 0,
"reflected": false
},
"fps": 9
}

+ 25
- 0
conf/gameconfs/effects/f1_summon.json View File

@@ -0,0 +1,25 @@
{
"animationTextures": [
"assets/game/extra/cards/minicards/fx_explosionyellowelectrical/fx_explosionyellowelectrical_000.png",
"assets/game/extra/cards/minicards/fx_explosionyellowelectrical/fx_explosionyellowelectrical_001.png",
"assets/game/extra/cards/minicards/fx_explosionyellowelectrical/fx_explosionyellowelectrical_002.png",
"assets/game/extra/cards/minicards/fx_explosionyellowelectrical/fx_explosionyellowelectrical_003.png",
"assets/game/extra/cards/minicards/fx_explosionyellowelectrical/fx_explosionyellowelectrical_004.png",
"assets/game/extra/cards/minicards/fx_explosionyellowelectrical/fx_explosionyellowelectrical_005.png",
"assets/game/extra/cards/minicards/fx_explosionyellowelectrical/fx_explosionyellowelectrical_006.png",
"assets/game/extra/cards/minicards/fx_explosionyellowelectrical/fx_explosionyellowelectrical_007.png",
"assets/game/extra/cards/minicards/fx_explosionyellowelectrical/fx_explosionyellowelectrical_008.png",
"assets/game/extra/cards/minicards/fx_explosionyellowelectrical/fx_explosionyellowelectrical_009.png"
],
"correction": {
"imgWidth" : 52,
"imgHeight" : 56,
"scale": 1.3,
"offsetX": 25,
"offsetY": 25,
"spriteTopLeftX" : 0,
"spriteTopLeftY" : 0,
"reflected": false
},
"fps": 9
}

+ 36
- 0
conf/gameconfs/effects/f1_wraithsummon.json View File

@@ -0,0 +1,36 @@
{
"animationTextures": [
"assets/game/extra/cards/minicards/fx_f4_bbs_abyssalscar/fx_f4_bbs_abyssalscar_000.png",
"assets/game/extra/cards/minicards/fx_f4_bbs_abyssalscar/fx_f4_bbs_abyssalscar_001.png",
"assets/game/extra/cards/minicards/fx_f4_bbs_abyssalscar/fx_f4_bbs_abyssalscar_002.png",
"assets/game/extra/cards/minicards/fx_f4_bbs_abyssalscar/fx_f4_bbs_abyssalscar_003.png",
"assets/game/extra/cards/minicards/fx_f4_bbs_abyssalscar/fx_f4_bbs_abyssalscar_004.png",
"assets/game/extra/cards/minicards/fx_f4_bbs_abyssalscar/fx_f4_bbs_abyssalscar_005.png",
"assets/game/extra/cards/minicards/fx_f4_bbs_abyssalscar/fx_f4_bbs_abyssalscar_006.png",
"assets/game/extra/cards/minicards/fx_f4_bbs_abyssalscar/fx_f4_bbs_abyssalscar_007.png",
"assets/game/extra/cards/minicards/fx_f4_bbs_abyssalscar/fx_f4_bbs_abyssalscar_008.png",
"assets/game/extra/cards/minicards/fx_f4_bbs_abyssalscar/fx_f4_bbs_abyssalscar_009.png",
"assets/game/extra/cards/minicards/fx_f4_bbs_abyssalscar/fx_f4_bbs_abyssalscar_010.png",
"assets/game/extra/cards/minicards/fx_f4_bbs_abyssalscar/fx_f4_bbs_abyssalscar_011.png",
"assets/game/extra/cards/minicards/fx_f4_bbs_abyssalscar/fx_f4_bbs_abyssalscar_012.png",
"assets/game/extra/cards/minicards/fx_f4_bbs_abyssalscar/fx_f4_bbs_abyssalscar_013.png",
"assets/game/extra/cards/minicards/fx_f4_bbs_abyssalscar/fx_f4_bbs_abyssalscar_014.png",
"assets/game/extra/cards/minicards/fx_f4_bbs_abyssalscar/fx_f4_bbs_abyssalscar_015.png",
"assets/game/extra/cards/minicards/fx_f4_bbs_abyssalscar/fx_f4_bbs_abyssalscar_016.png",
"assets/game/extra/cards/minicards/fx_f4_bbs_abyssalscar/fx_f4_bbs_abyssalscar_017.png",
"assets/game/extra/cards/minicards/fx_f4_bbs_abyssalscar/fx_f4_bbs_abyssalscar_018.png",
"assets/game/extra/cards/minicards/fx_f4_bbs_abyssalscar/fx_f4_bbs_abyssalscar_019.png",
"assets/game/extra/cards/minicards/fx_f4_bbs_abyssalscar/fx_f4_bbs_abyssalscar_020.png"
],
"correction": {
"imgWidth" : 52,
"imgHeight" : 56,
"scale": 2.5,
"offsetX": -8,
"offsetY": -30,
"spriteTopLeftX" : 0,
"spriteTopLeftY" : 0,
"reflected": false
},
"fps": 9
}

+ 36
- 0
conf/gameconfs/f1_soulshatter.json View File

@@ -0,0 +1,36 @@
{
"animationTextures": [
"assets/game/extra/cards/minicards/fx_f4_soulshatterpact/fx_f4_soulshatterpact_000.png",
"assets/game/extra/cards/minicards/fx_f4_soulshatterpact/fx_f4_soulshatterpact_001.png",
"assets/game/extra/cards/minicards/fx_f4_soulshatterpact/fx_f4_soulshatterpact_002.png",
"assets/game/extra/cards/minicards/fx_f4_soulshatterpact/fx_f4_soulshatterpact_003.png",
"assets/game/extra/cards/minicards/fx_f4_soulshatterpact/fx_f4_soulshatterpact_004.png",
"assets/game/extra/cards/minicards/fx_f4_soulshatterpact/fx_f4_soulshatterpact_005.png",
"assets/game/extra/cards/minicards/fx_f4_soulshatterpact/fx_f4_soulshatterpact_006.png",
"assets/game/extra/cards/minicards/fx_f4_soulshatterpact/fx_f4_soulshatterpact_007.png",
"assets/game/extra/cards/minicards/fx_f4_soulshatterpact/fx_f4_soulshatterpact_008.png",
"assets/game/extra/cards/minicards/fx_f4_soulshatterpact/fx_f4_soulshatterpact_009.png",
"assets/game/extra/cards/minicards/fx_f4_soulshatterpact/fx_f4_soulshatterpact_010.png",
"assets/game/extra/cards/minicards/fx_f4_soulshatterpact/fx_f4_soulshatterpact_011.png",
"assets/game/extra/cards/minicards/fx_f4_soulshatterpact/fx_f4_soulshatterpact_012.png",
"assets/game/extra/cards/minicards/fx_f4_soulshatterpact/fx_f4_soulshatterpact_013.png",
"assets/game/extra/cards/minicards/fx_f4_soulshatterpact/fx_f4_soulshatterpact_014.png",
"assets/game/extra/cards/minicards/fx_f4_soulshatterpact/fx_f4_soulshatterpact_015.png",
"assets/game/extra/cards/minicards/fx_f4_soulshatterpact/fx_f4_soulshatterpact_016.png",
"assets/game/extra/cards/minicards/fx_f4_soulshatterpact/fx_f4_soulshatterpact_017.png",
"assets/game/extra/cards/minicards/fx_f4_soulshatterpact/fx_f4_soulshatterpact_018.png",
"assets/game/extra/cards/minicards/fx_f4_soulshatterpact/fx_f4_soulshatterpact_019.png",
"assets/game/extra/cards/minicards/fx_f4_soulshatterpact/fx_f4_soulshatterpact_020.png"
],
"correction": {
"imgWidth" : 80,
"imgHeight" : 80,
"scale": 1.0,
"offsetX": 25,
"offsetY": 25,
"spriteTopLeftX" : 0,
"spriteTopLeftY" : 0,
"reflected": false
},
"fps": 9
}

+ 8
- 0
conf/gameconfs/grid.json View File

@@ -0,0 +1,8 @@
{
"boardTiles": null,
"gridxsize": 9,
"gridysize": 5,
"gridmargin": 5,
"gridTopLeftx": 410,
"gridTopLefty": 280
}

+ 13
- 0
conf/gameconfs/tile.json View File

@@ -0,0 +1,13 @@
{
"tileTextures": [
"assets/game/extra/ui/tile_board.png",
"assets/game/extra/ui/tile_grid.png",
"assets/game/extra/ui/tile_grid_red.png"
],
"xpos": 0,
"ypos": 0,
"width": 115,
"height": 115,
"tilex": 0,
"tiley": 0
}

+ 1
- 0
conf/gameconfs/units/bad_omen.json View File

@@ -0,0 +1 @@
{ "id" : 0, "animation" : "idle", "position" : { "xpos" : 0, "ypos" : 0, "tilex" : 0, "tiley" : 0 }, "animations" : { "allFrames" : [ "f4_gor_attack_000.png", "f4_gor_attack_001.png", "f4_gor_attack_002.png", "f4_gor_attack_003.png", "f4_gor_attack_004.png", "f4_gor_attack_005.png", "f4_gor_attack_006.png", "f4_gor_attack_007.png", "f4_gor_attack_008.png", "f4_gor_attack_009.png", "f4_gor_attack_010.png", "f4_gor_attack_011.png", "f4_gor_attack_012.png", "f4_gor_attack_013.png", "f4_gor_attack_014.png", "f4_gor_attack_015.png", "f4_gor_attack_016.png", "f4_gor_attack_017.png", "f4_gor_attack_018.png", "f4_gor_breathing_000.png", "f4_gor_breathing_001.png", "f4_gor_breathing_002.png", "f4_gor_breathing_003.png", "f4_gor_breathing_004.png", "f4_gor_breathing_005.png", "f4_gor_breathing_006.png", "f4_gor_breathing_007.png", "f4_gor_breathing_008.png", "f4_gor_breathing_009.png", "f4_gor_breathing_010.png", "f4_gor_breathing_011.png", "f4_gor_death_000.png", "f4_gor_death_001.png", "f4_gor_death_002.png", "f4_gor_death_003.png", "f4_gor_death_004.png", "f4_gor_death_005.png", "f4_gor_death_006.png", "f4_gor_death_007.png", "f4_gor_death_008.png", "f4_gor_death_009.png", "f4_gor_hit_000.png", "f4_gor_hit_001.png", "f4_gor_hit_002.png", "f4_gor_idle_000.png", "f4_gor_idle_001.png", "f4_gor_idle_002.png", "f4_gor_idle_003.png", "f4_gor_idle_004.png", "f4_gor_idle_005.png", "f4_gor_idle_006.png", "f4_gor_idle_007.png", "f4_gor_idle_008.png", "f4_gor_idle_009.png", "f4_gor_idle_010.png", "f4_gor_idle_011.png", "f4_gor_run_000.png", "f4_gor_run_001.png", "f4_gor_run_002.png", "f4_gor_run_003.png", "f4_gor_run_004.png", "f4_gor_run_005.png", "f4_gor_run_006.png", "f4_gor_run_007.png" ], "frameDIR": "assets/game/extra/units/f4_gor/", "idle" : { "frameStartEndIndices" : [ 44, 55 ], "fps" : 8, "loop" : true }, "death" : { "frameStartEndIndices" : [ 31,40 ], "fps" : 8, "loop" : false }, "attack" : { "frameStartEndIndices" : [ 0, 18 ], "fps" : 8, "loop" : false }, "move" : { "frameStartEndIndices" : [ 56, 63 ], "fps" : 8, "loop" : true }, "channel" : { "frameStartEndIndices" : [ 19, 30 ], "fps" : 8, "loop" : true }, "hit" : { "frameStartEndIndices" : [ 41, 43 ], "fps" : 8, "loop" : false } }, "correction" : { "imgWidth" : 80, "imgHeight" : 80, "scale": 2, "offsetX": -30, "offsetY": -33, "spriteTopLeftX" : 0, "spriteTopLeftY" : 0, "reflected" : false } }

+ 1
- 0
conf/gameconfs/units/bloodmoon_priestess.json View File

@@ -0,0 +1 @@
{ "id" : 0, "animation" : "idle", "position" : { "xpos" : 0, "ypos" : 0, "tilex" : 0, "tiley" : 0 }, "animations" : { "allFrames" : [ "f4_bloodmoon_attack_000.png", "f4_bloodmoon_attack_001.png", "f4_bloodmoon_attack_002.png", "f4_bloodmoon_attack_003.png", "f4_bloodmoon_attack_004.png", "f4_bloodmoon_attack_005.png", "f4_bloodmoon_attack_006.png", "f4_bloodmoon_attack_007.png", "f4_bloodmoon_attack_008.png", "f4_bloodmoon_attack_009.png", "f4_bloodmoon_attack_010.png", "f4_bloodmoon_attack_011.png", "f4_bloodmoon_breathing_000.png", "f4_bloodmoon_breathing_001.png", "f4_bloodmoon_breathing_002.png", "f4_bloodmoon_breathing_003.png", "f4_bloodmoon_breathing_004.png", "f4_bloodmoon_breathing_005.png", "f4_bloodmoon_breathing_006.png", "f4_bloodmoon_breathing_007.png", "f4_bloodmoon_breathing_008.png", "f4_bloodmoon_breathing_009.png", "f4_bloodmoon_breathing_010.png", "f4_bloodmoon_breathing_011.png", "f4_bloodmoon_breathing_012.png", "f4_bloodmoon_breathing_013.png", "f4_bloodmoon_death_000.png", "f4_bloodmoon_death_001.png", "f4_bloodmoon_death_002.png", "f4_bloodmoon_death_003.png", "f4_bloodmoon_death_004.png", "f4_bloodmoon_death_005.png", "f4_bloodmoon_death_006.png", "f4_bloodmoon_death_007.png", "f4_bloodmoon_hit_000.png", "f4_bloodmoon_hit_001.png", "f4_bloodmoon_hit_002.png", "f4_bloodmoon_idle_000.png", "f4_bloodmoon_idle_001.png", "f4_bloodmoon_idle_002.png", "f4_bloodmoon_idle_003.png", "f4_bloodmoon_idle_004.png", "f4_bloodmoon_idle_005.png", "f4_bloodmoon_idle_006.png", "f4_bloodmoon_idle_007.png", "f4_bloodmoon_idle_008.png", "f4_bloodmoon_idle_009.png", "f4_bloodmoon_idle_010.png", "f4_bloodmoon_idle_011.png", "f4_bloodmoon_run_000.png", "f4_bloodmoon_run_001.png", "f4_bloodmoon_run_002.png", "f4_bloodmoon_run_003.png", "f4_bloodmoon_run_004.png", "f4_bloodmoon_run_005.png", "f4_bloodmoon_run_006.png", "f4_bloodmoon_run_007.png" ], "frameDIR": "assets/game/extra/units/f4_bloodmoon/", "idle" : { "frameStartEndIndices" : [ 0, 0 ], "fps" : 8, "loop" : true }, "death" : { "frameStartEndIndices" : [ 0, 0 ], "fps" : 8, "loop" : false }, "attack" : { "frameStartEndIndices" : [ 0, 0 ], "fps" : 8, "loop" : false }, "move" : { "frameStartEndIndices" : [ 0, 0 ], "fps" : 8, "loop" : true }, "channel" : { "frameStartEndIndices" : [ 0, 0 ], "fps" : 8, "loop" : true }, "hit" : { "frameStartEndIndices" : [ 0, 0 ], "fps" : 8, "loop" : false } }, "correction" : { "imgWidth" : 80, "imgHeight" : 80, "scale": 1.5, "offsetX": 0, "offsetY": 10, "spriteTopLeftX" : 0, "spriteTopLeftY" : 0, "reflected" : false } }

+ 1
- 0
conf/gameconfs/units/gloom_chaser.json View File

@@ -0,0 +1 @@
{ "id" : 0, "animation" : "idle", "position" : { "xpos" : 0, "ypos" : 0, "tilex" : 0, "tiley" : 0 }, "animations" : { "allFrames" : [ "f4_gloomchaser_attack_000.png", "f4_gloomchaser_attack_001.png", "f4_gloomchaser_attack_002.png", "f4_gloomchaser_attack_003.png", "f4_gloomchaser_attack_004.png", "f4_gloomchaser_attack_005.png", "f4_gloomchaser_attack_006.png", "f4_gloomchaser_attack_007.png", "f4_gloomchaser_attack_008.png", "f4_gloomchaser_attack_009.png", "f4_gloomchaser_attack_010.png", "f4_gloomchaser_attack_011.png", "f4_gloomchaser_breathing_000.png", "f4_gloomchaser_breathing_001.png", "f4_gloomchaser_breathing_002.png", "f4_gloomchaser_breathing_003.png", "f4_gloomchaser_breathing_004.png", "f4_gloomchaser_breathing_005.png", "f4_gloomchaser_breathing_006.png", "f4_gloomchaser_breathing_007.png", "f4_gloomchaser_breathing_008.png", "f4_gloomchaser_breathing_009.png", "f4_gloomchaser_breathing_010.png", "f4_gloomchaser_breathing_011.png", "f4_gloomchaser_breathing_012.png", "f4_gloomchaser_breathing_013.png", "f4_gloomchaser_damage_000.png", "f4_gloomchaser_damage_001.png", "f4_gloomchaser_damage_002.png", "f4_gloomchaser_death_000.png", "f4_gloomchaser_death_001.png", "f4_gloomchaser_death_002.png", "f4_gloomchaser_death_003.png", "f4_gloomchaser_death_004.png", "f4_gloomchaser_death_005.png", "f4_gloomchaser_death_006.png", "f4_gloomchaser_death_007.png", "f4_gloomchaser_death_008.png", "f4_gloomchaser_idle_000.png", "f4_gloomchaser_idle_001.png", "f4_gloomchaser_idle_002.png", "f4_gloomchaser_idle_003.png", "f4_gloomchaser_idle_004.png", "f4_gloomchaser_idle_005.png", "f4_gloomchaser_idle_006.png", "f4_gloomchaser_idle_007.png", "f4_gloomchaser_idle_008.png", "f4_gloomchaser_idle_009.png", "f4_gloomchaser_idle_010.png", "f4_gloomchaser_idle_011.png", "f4_gloomchaser_projectile_000.png", "f4_gloomchaser_projectile_001.png", "f4_gloomchaser_projectile_002.png", "f4_gloomchaser_projectile_003.png", "f4_gloomchaser_projectile_004.png", "f4_gloomchaser_run_000.png", "f4_gloomchaser_run_001.png", "f4_gloomchaser_run_002.png", "f4_gloomchaser_run_003.png", "f4_gloomchaser_run_004.png", "f4_gloomchaser_run_005.png", "f4_gloomchaser_run_006.png", "f4_gloomchaser_run_007.png", "f4_gloomchaser_run_008.png", "f4_gloomchaser_run_009.png", "f4_gloomchaser_run_010.png", "f4_gloomchaser_run_011.png" ], "frameDIR": "assets/game/extra/units/f4_gloomchaser/", "idle" : { "frameStartEndIndices" : [ 0, 0 ], "fps" : 8, "loop" : true }, "death" : { "frameStartEndIndices" : [ 0, 0 ], "fps" : 8, "loop" : false }, "attack" : { "frameStartEndIndices" : [ 0, 0 ], "fps" : 8, "loop" : false }, "move" : { "frameStartEndIndices" : [ 0, 0 ], "fps" : 8, "loop" : true }, "channel" : { "frameStartEndIndices" : [ 0, 0 ], "fps" : 8, "loop" : true }, "hit" : { "frameStartEndIndices" : [ 0, 0 ], "fps" : 8, "loop" : false } }, "correction" : { "imgWidth" : 80, "imgHeight" : 80, "scale": 1.5, "offsetX": 0, "offsetY": 10, "spriteTopLeftX" : 0, "spriteTopLeftY" : 0, "reflected" : false } }

+ 1
- 0
conf/gameconfs/units/ironcliff_guardian.json View File

@@ -0,0 +1 @@
{ "id" : 0, "animation" : "idle", "position" : { "xpos" : 0, "ypos" : 0, "tilex" : 0, "tiley" : 0 }, "animations" : { "allFrames" : [ "f1_ironcliffeguardian_attack_000.png", "f1_ironcliffeguardian_attack_001.png", "f1_ironcliffeguardian_attack_002.png", "f1_ironcliffeguardian_attack_003.png", "f1_ironcliffeguardian_attack_004.png", "f1_ironcliffeguardian_attack_005.png", "f1_ironcliffeguardian_attack_006.png", "f1_ironcliffeguardian_attack_007.png", "f1_ironcliffeguardian_attack_008.png", "f1_ironcliffeguardian_attack_009.png", "f1_ironcliffeguardian_attack_010.png", "f1_ironcliffeguardian_attack_011.png", "f1_ironcliffeguardian_attack_012.png", "f1_ironcliffeguardian_attack_013.png", "f1_ironcliffeguardian_attack_014.png", "f1_ironcliffeguardian_attack_015.png", "f1_ironcliffeguardian_attack_016.png", "f1_ironcliffeguardian_attack_017.png", "f1_ironcliffeguardian_breathing_000.png", "f1_ironcliffeguardian_breathing_001.png", "f1_ironcliffeguardian_breathing_002.png", "f1_ironcliffeguardian_breathing_003.png", "f1_ironcliffeguardian_breathing_004.png", "f1_ironcliffeguardian_breathing_005.png", "f1_ironcliffeguardian_breathing_006.png", "f1_ironcliffeguardian_breathing_007.png", "f1_ironcliffeguardian_breathing_008.png", "f1_ironcliffeguardian_breathing_009.png", "f1_ironcliffeguardian_breathing_010.png", "f1_ironcliffeguardian_breathing_011.png", "f1_ironcliffeguardian_breathing_012.png", "f1_ironcliffeguardian_breathing_013.png", "f1_ironcliffeguardian_death_000.png", "f1_ironcliffeguardian_death_001.png", "f1_ironcliffeguardian_death_002.png", "f1_ironcliffeguardian_death_003.png", "f1_ironcliffeguardian_death_004.png", "f1_ironcliffeguardian_death_005.png", "f1_ironcliffeguardian_death_006.png", "f1_ironcliffeguardian_death_007.png", "f1_ironcliffeguardian_death_008.png", "f1_ironcliffeguardian_hit_000.png", "f1_ironcliffeguardian_hit_001.png", "f1_ironcliffeguardian_hit_002.png", "f1_ironcliffeguardian_idle_000.png", "f1_ironcliffeguardian_idle_001.png", "f1_ironcliffeguardian_idle_002.png", "f1_ironcliffeguardian_idle_003.png", "f1_ironcliffeguardian_idle_004.png", "f1_ironcliffeguardian_idle_005.png", "f1_ironcliffeguardian_idle_006.png", "f1_ironcliffeguardian_idle_007.png", "f1_ironcliffeguardian_idle_008.png", "f1_ironcliffeguardian_idle_009.png", "f1_ironcliffeguardian_idle_010.png", "f1_ironcliffeguardian_idle_011.png", "f1_ironcliffeguardian_idle_012.png", "f1_ironcliffeguardian_idle_013.png", "f1_ironcliffeguardian_idle_014.png", "f1_ironcliffeguardian_idle_015.png", "f1_ironcliffeguardian_idle_016.png", "f1_ironcliffeguardian_idle_017.png", "f1_ironcliffeguardian_run_000.png", "f1_ironcliffeguardian_run_001.png", "f1_ironcliffeguardian_run_002.png", "f1_ironcliffeguardian_run_003.png", "f1_ironcliffeguardian_run_004.png", "f1_ironcliffeguardian_run_005.png", "f1_ironcliffeguardian_run_006.png", "f1_ironcliffeguardian_run_007.png" ], "frameDIR": "assets/game/extra/units/f1_ironcliffeguardian/", "idle" : { "frameStartEndIndices" : [ 44, 61 ], "fps" : 8, "loop" : true }, "death" : { "frameStartEndIndices" : [ 32, 40 ], "fps" : 8, "loop" : false }, "attack" : { "frameStartEndIndices" : [ 0, 17 ], "fps" : 8, "loop" : false }, "move" : { "frameStartEndIndices" : [ 62, 69 ], "fps" : 8, "loop" : true }, "channel" : { "frameStartEndIndices" : [ 18, 31 ], "fps" : 8, "loop" : true }, "hit" : { "frameStartEndIndices" : [ 41, 43 ], "fps" : 8, "loop" : false } }, "correction" : { "imgWidth" : 80, "imgHeight" : 80, "scale": 1.5, "offsetX": 0, "offsetY": 10, "spriteTopLeftX" : 0, "spriteTopLeftY" : 0, "reflected" : true } }

+ 1
- 0
conf/gameconfs/units/nightsorrow_assassin.json View File

@@ -0,0 +1 @@
{ "id" : 0, "animation" : "idle", "position" : { "xpos" : 0, "ypos" : 0, "tilex" : 0, "tiley" : 0 }, "animations" : { "allFrames" : [ "f4_nightsorrow_attack_000.png", "f4_nightsorrow_attack_001.png", "f4_nightsorrow_attack_002.png", "f4_nightsorrow_attack_003.png", "f4_nightsorrow_attack_004.png", "f4_nightsorrow_attack_005.png", "f4_nightsorrow_attack_006.png", "f4_nightsorrow_attack_007.png", "f4_nightsorrow_attack_008.png", "f4_nightsorrow_attack_009.png", "f4_nightsorrow_attack_010.png", "f4_nightsorrow_attack_011.png", "f4_nightsorrow_attack_012.png", "f4_nightsorrow_attack_013.png", "f4_nightsorrow_breathing_000.png", "f4_nightsorrow_breathing_001.png", "f4_nightsorrow_breathing_002.png", "f4_nightsorrow_breathing_003.png", "f4_nightsorrow_breathing_004.png", "f4_nightsorrow_breathing_005.png", "f4_nightsorrow_breathing_006.png", "f4_nightsorrow_breathing_007.png", "f4_nightsorrow_breathing_008.png", "f4_nightsorrow_breathing_009.png", "f4_nightsorrow_breathing_010.png", "f4_nightsorrow_breathing_011.png", "f4_nightsorrow_breathing_012.png", "f4_nightsorrow_breathing_013.png", "f4_nightsorrow_death_000.png", "f4_nightsorrow_death_001.png", "f4_nightsorrow_death_002.png", "f4_nightsorrow_death_003.png", "f4_nightsorrow_death_004.png", "f4_nightsorrow_death_005.png", "f4_nightsorrow_death_006.png", "f4_nightsorrow_death_007.png", "f4_nightsorrow_death_008.png", "f4_nightsorrow_death_009.png", "f4_nightsorrow_death_010.png", "f4_nightsorrow_hit_000.png", "f4_nightsorrow_hit_001.png", "f4_nightsorrow_hit_002.png", "f4_nightsorrow_idle_000.png", "f4_nightsorrow_idle_001.png", "f4_nightsorrow_idle_002.png", "f4_nightsorrow_idle_003.png", "f4_nightsorrow_idle_004.png", "f4_nightsorrow_idle_005.png", "f4_nightsorrow_idle_006.png", "f4_nightsorrow_idle_007.png", "f4_nightsorrow_idle_008.png", "f4_nightsorrow_idle_009.png", "f4_nightsorrow_idle_010.png", "f4_nightsorrow_idle_011.png", "f4_nightsorrow_run_000.png", "f4_nightsorrow_run_001.png", "f4_nightsorrow_run_002.png", "f4_nightsorrow_run_003.png", "f4_nightsorrow_run_004.png", "f4_nightsorrow_run_005.png", "f4_nightsorrow_run_006.png", "f4_nightsorrow_run_007.png" ], "frameDIR": "assets/game/extra/units/f4_nightsorrow/", "idle" : { "frameStartEndIndices" : [ 0, 0 ], "fps" : 8, "loop" : true }, "death" : { "frameStartEndIndices" : [ 0, 0 ], "fps" : 8, "loop" : false }, "attack" : { "frameStartEndIndices" : [ 0, 0 ], "fps" : 8, "loop" : false }, "move" : { "frameStartEndIndices" : [ 0, 0 ], "fps" : 8, "loop" : true }, "channel" : { "frameStartEndIndices" : [ 0, 0 ], "fps" : 8, "loop" : true }, "hit" : { "frameStartEndIndices" : [ 0, 0 ], "fps" : 8, "loop" : false } }, "correction" : { "imgWidth" : 80, "imgHeight" : 80, "scale": 1.5, "offsetX": 0, "offsetY": 10, "spriteTopLeftX" : 0, "spriteTopLeftY" : 0, "reflected" : false } }

+ 1
- 0
conf/gameconfs/units/rock_pulveriser.json View File

@@ -0,0 +1 @@
{ "id" : 0, "animation" : "idle", "position" : { "xpos" : 0, "ypos" : 0, "tilex" : 0, "tiley" : 0 }, "animations" : { "allFrames" : [ "neutral_monster_explodingdemon_attack_000.png", "neutral_monster_explodingdemon_attack_001.png", "neutral_monster_explodingdemon_attack_002.png", "neutral_monster_explodingdemon_attack_003.png", "neutral_monster_explodingdemon_attack_004.png", "neutral_monster_explodingdemon_attack_005.png", "neutral_monster_explodingdemon_attack_006.png", "neutral_monster_explodingdemon_attack_007.png", "neutral_monster_explodingdemon_breathing_000.png", "neutral_monster_explodingdemon_breathing_001.png", "neutral_monster_explodingdemon_breathing_002.png", "neutral_monster_explodingdemon_breathing_003.png", "neutral_monster_explodingdemon_breathing_004.png", "neutral_monster_explodingdemon_breathing_005.png", "neutral_monster_explodingdemon_breathing_006.png", "neutral_monster_explodingdemon_breathing_007.png", "neutral_monster_explodingdemon_breathing_008.png", "neutral_monster_explodingdemon_breathing_009.png", "neutral_monster_explodingdemon_breathing_010.png", "neutral_monster_explodingdemon_breathing_011.png", "neutral_monster_explodingdemon_breathing_012.png", "neutral_monster_explodingdemon_breathing_013.png", "neutral_monster_explodingdemon_death_000.png", "neutral_monster_explodingdemon_death_001.png", "neutral_monster_explodingdemon_death_002.png", "neutral_monster_explodingdemon_death_003.png", "neutral_monster_explodingdemon_death_004.png", "neutral_monster_explodingdemon_death_005.png", "neutral_monster_explodingdemon_death_006.png", "neutral_monster_explodingdemon_explode_000.png", "neutral_monster_explodingdemon_explode_001.png", "neutral_monster_explodingdemon_explode_002.png", "neutral_monster_explodingdemon_explode_003.png", "neutral_monster_explodingdemon_explode_004.png", "neutral_monster_explodingdemon_explode_005.png", "neutral_monster_explodingdemon_explode_006.png", "neutral_monster_explodingdemon_explode_007.png", "neutral_monster_explodingdemon_explode_008.png", "neutral_monster_explodingdemon_explode_009.png", "neutral_monster_explodingdemon_explode_010.png", "neutral_monster_explodingdemon_explode_011.png", "neutral_monster_explodingdemon_explode_012.png", "neutral_monster_explodingdemon_explode_013.png", "neutral_monster_explodingdemon_explode_014.png", "neutral_monster_explodingdemon_explode_015.png", "neutral_monster_explodingdemon_explode_016.png", "neutral_monster_explodingdemon_explode_017.png", "neutral_monster_explodingdemon_explode_018.png", "neutral_monster_explodingdemon_hit_000.png", "neutral_monster_explodingdemon_hit_001.png", "neutral_monster_explodingdemon_hit_002.png", "neutral_monster_explodingdemon_idle_000.png", "neutral_monster_explodingdemon_idle_001.png", "neutral_monster_explodingdemon_idle_002.png", "neutral_monster_explodingdemon_idle_003.png", "neutral_monster_explodingdemon_idle_004.png", "neutral_monster_explodingdemon_idle_005.png", "neutral_monster_explodingdemon_idle_006.png", "neutral_monster_explodingdemon_idle_007.png", "neutral_monster_explodingdemon_idle_008.png", "neutral_monster_explodingdemon_idle_009.png", "neutral_monster_explodingdemon_idle_010.png", "neutral_monster_explodingdemon_idle_011.png", "neutral_monster_explodingdemon_run_000.png", "neutral_monster_explodingdemon_run_001.png", "neutral_monster_explodingdemon_run_002.png", "neutral_monster_explodingdemon_run_003.png", "neutral_monster_explodingdemon_run_004.png", "neutral_monster_explodingdemon_run_005.png", "neutral_monster_explodingdemon_run_006.png", "neutral_monster_explodingdemon_run_007.png" ], "frameDIR": "assets/game/extra/units/neutral_monster_explodingdemon/", "idle" : { "frameStartEndIndices" : [ 51, 62 ], "fps" : 8, "loop" : true }, "death" : { "frameStartEndIndices" : [ 22, 28 ], "fps" : 8, "loop" : false }, "attack" : { "frameStartEndIndices" : [ 0, 7 ], "fps" : 8, "loop" : false }, "move" : { "frameStartEndIndices" : [ 63, 70 ], "fps" : 8, "loop" : true }, "channel" : { "frameStartEndIndices" : [ 8, 21 ], "fps" : 8, "loop" : true }, "hit" : { "frameStartEndIndices" : [ 48, 50 ], "fps" : 8, "loop" : false } }, "correction" : { "imgWidth" : 80, "imgHeight" : 80, "scale": 1.5, "offsetX": 0, "offsetY": 10, "spriteTopLeftX" : 0, "spriteTopLeftY" : 0, "reflected" : false } }

+ 1
- 0
conf/gameconfs/units/saberspine_tiger.json View File

@@ -0,0 +1 @@
{ "id" : 0, "animation" : "idle", "position" : { "xpos" : 0, "ypos" : 0, "tilex" : 0, "tiley" : 0 }, "animations" : { "allFrames" : [ "neutral_saberspinemk2_attack_000.png", "neutral_saberspinemk2_attack_001.png", "neutral_saberspinemk2_attack_002.png", "neutral_saberspinemk2_attack_003.png", "neutral_saberspinemk2_attack_004.png", "neutral_saberspinemk2_attack_005.png", "neutral_saberspinemk2_attack_006.png", "neutral_saberspinemk2_attack_007.png", "neutral_saberspinemk2_attack_008.png", "neutral_saberspinemk2_attack_009.png", "neutral_saberspinemk2_breathing_000.png", "neutral_saberspinemk2_breathing_001.png", "neutral_saberspinemk2_breathing_002.png", "neutral_saberspinemk2_breathing_003.png", "neutral_saberspinemk2_breathing_004.png", "neutral_saberspinemk2_breathing_005.png", "neutral_saberspinemk2_breathing_006.png", "neutral_saberspinemk2_breathing_007.png", "neutral_saberspinemk2_breathing_008.png", "neutral_saberspinemk2_breathing_009.png", "neutral_saberspinemk2_death_000.png", "neutral_saberspinemk2_death_001.png", "neutral_saberspinemk2_death_002.png", "neutral_saberspinemk2_death_003.png", "neutral_saberspinemk2_death_004.png", "neutral_saberspinemk2_death_005.png", "neutral_saberspinemk2_death_006.png", "neutral_saberspinemk2_death_007.png", "neutral_saberspinemk2_hit_000.png", "neutral_saberspinemk2_hit_001.png", "neutral_saberspinemk2_hit_002.png", "neutral_saberspinemk2_idle_000.png", "neutral_saberspinemk2_idle_001.png", "neutral_saberspinemk2_idle_002.png", "neutral_saberspinemk2_idle_003.png", "neutral_saberspinemk2_idle_004.png", "neutral_saberspinemk2_idle_005.png", "neutral_saberspinemk2_idle_006.png", "neutral_saberspinemk2_idle_007.png", "neutral_saberspinemk2_idle_008.png", "neutral_saberspinemk2_idle_009.png", "neutral_saberspinemk2_run_000.png", "neutral_saberspinemk2_run_001.png", "neutral_saberspinemk2_run_002.png", "neutral_saberspinemk2_run_003.png", "neutral_saberspinemk2_run_004.png", "neutral_saberspinemk2_run_005.png", "neutral_saberspinemk2_run_006.png", "neutral_saberspinemk2_run_007.png" ], "frameDIR": "assets/game/extra/units/neutral_saberspinemk2/", "idle" : { "frameStartEndIndices" : [ 0, 0 ], "fps" : 8, "loop" : true }, "death" : { "frameStartEndIndices" : [ 0, 0 ], "fps" : 8, "loop" : false }, "attack" : { "frameStartEndIndices" : [ 0, 0 ], "fps" : 8, "loop" : false }, "move" : { "frameStartEndIndices" : [ 0, 0 ], "fps" : 8, "loop" : true }, "channel" : { "frameStartEndIndices" : [ 0, 0 ], "fps" : 8, "loop" : true }, "hit" : { "frameStartEndIndices" : [ 0, 0 ], "fps" : 8, "loop" : false } }, "correction" : { "imgWidth" : 80, "imgHeight" : 80, "scale": 1.5, "offsetX": 15, "offsetY": -5, "spriteTopLeftX" : 0, "spriteTopLeftY" : 0, "reflected" : true } }

+ 1
- 0
conf/gameconfs/units/shadow_watcher.json View File

@@ -0,0 +1 @@
{ "id" : 0, "animation" : "idle", "position" : { "xpos" : 0, "ypos" : 0, "tilex" : 0, "tiley" : 0 }, "animations" : { "allFrames" : [ "f4_engulfingshadow_attack_000.png", "f4_engulfingshadow_attack_001.png", "f4_engulfingshadow_attack_002.png", "f4_engulfingshadow_attack_003.png", "f4_engulfingshadow_attack_004.png", "f4_engulfingshadow_attack_005.png", "f4_engulfingshadow_attack_006.png", "f4_engulfingshadow_attack_007.png", "f4_engulfingshadow_attack_008.png", "f4_engulfingshadow_attack_009.png", "f4_engulfingshadow_attack_010.png", "f4_engulfingshadow_attack_011.png", "f4_engulfingshadow_attack_012.png", "f4_engulfingshadow_breathing_000.png", "f4_engulfingshadow_breathing_001.png", "f4_engulfingshadow_breathing_002.png", "f4_engulfingshadow_breathing_003.png", "f4_engulfingshadow_breathing_004.png", "f4_engulfingshadow_breathing_005.png", "f4_engulfingshadow_breathing_006.png", "f4_engulfingshadow_breathing_007.png", "f4_engulfingshadow_breathing_008.png", "f4_engulfingshadow_breathing_009.png", "f4_engulfingshadow_breathing_010.png", "f4_engulfingshadow_breathing_011.png", "f4_engulfingshadow_breathing_012.png", "f4_engulfingshadow_breathing_013.png", "f4_engulfingshadow_death_000.png", "f4_engulfingshadow_death_001.png", "f4_engulfingshadow_death_002.png", "f4_engulfingshadow_death_003.png", "f4_engulfingshadow_death_004.png", "f4_engulfingshadow_death_005.png", "f4_engulfingshadow_death_006.png", "f4_engulfingshadow_death_007.png", "f4_engulfingshadow_death_008.png", "f4_engulfingshadow_hit_000.png", "f4_engulfingshadow_hit_001.png", "f4_engulfingshadow_hit_002.png", "f4_engulfingshadow_idle_000.png", "f4_engulfingshadow_idle_001.png", "f4_engulfingshadow_idle_002.png", "f4_engulfingshadow_idle_003.png", "f4_engulfingshadow_idle_004.png", "f4_engulfingshadow_idle_005.png", "f4_engulfingshadow_idle_006.png", "f4_engulfingshadow_idle_007.png", "f4_engulfingshadow_idle_008.png", "f4_engulfingshadow_idle_009.png", "f4_engulfingshadow_idle_010.png", "f4_engulfingshadow_idle_011.png", "f4_engulfingshadow_idle_012.png", "f4_engulfingshadow_idle_013.png", "f4_engulfingshadow_run_000.png", "f4_engulfingshadow_run_001.png", "f4_engulfingshadow_run_002.png", "f4_engulfingshadow_run_003.png", "f4_engulfingshadow_run_004.png", "f4_engulfingshadow_run_005.png" ], "frameDIR": "assets/game/extra/units/f4_engulfingshadow/", "idle" : { "frameStartEndIndices" : [ 0, 0 ], "fps" : 8, "loop" : true }, "death" : { "frameStartEndIndices" : [ 0, 0 ], "fps" : 8, "loop" : false }, "attack" : { "frameStartEndIndices" : [ 0, 0 ], "fps" : 8, "loop" : false }, "move" : { "frameStartEndIndices" : [ 0, 0 ], "fps" : 8, "loop" : true }, "channel" : { "frameStartEndIndices" : [ 0, 0 ], "fps" : 8, "loop" : true }, "hit" : { "frameStartEndIndices" : [ 0, 0 ], "fps" : 8, "loop" : false } }, "correction" : { "imgWidth" : 80, "imgHeight" : 80, "scale": 1.5, "offsetX": 0, "offsetY": 10, "spriteTopLeftX" : 0, "spriteTopLeftY" : 0, "reflected" : false } }

+ 1
- 0
conf/gameconfs/units/shadowdancer.json View File

@@ -0,0 +1 @@
{ "id" : 0, "animation" : "idle", "position" : { "xpos" : 0, "ypos" : 0, "tilex" : 0, "tiley" : 0 }, "animations" : { "allFrames" : [ "f4_shadowdancer_attack_000.png", "f4_shadowdancer_attack_001.png", "f4_shadowdancer_attack_002.png", "f4_shadowdancer_attack_003.png", "f4_shadowdancer_attack_004.png", "f4_shadowdancer_attack_005.png", "f4_shadowdancer_attack_006.png", "f4_shadowdancer_attack_007.png", "f4_shadowdancer_attack_008.png", "f4_shadowdancer_attack_009.png", "f4_shadowdancer_attack_010.png", "f4_shadowdancer_attack_011.png", "f4_shadowdancer_breathing_000.png", "f4_shadowdancer_breathing_001.png", "f4_shadowdancer_breathing_002.png", "f4_shadowdancer_breathing_003.png", "f4_shadowdancer_breathing_004.png", "f4_shadowdancer_breathing_005.png", "f4_shadowdancer_breathing_006.png", "f4_shadowdancer_breathing_007.png", "f4_shadowdancer_breathing_008.png", "f4_shadowdancer_breathing_009.png", "f4_shadowdancer_breathing_010.png", "f4_shadowdancer_breathing_011.png", "f4_shadowdancer_breathing_012.png", "f4_shadowdancer_breathing_013.png", "f4_shadowdancer_death_000.png", "f4_shadowdancer_death_001.png", "f4_shadowdancer_death_002.png", "f4_shadowdancer_death_003.png", "f4_shadowdancer_death_004.png", "f4_shadowdancer_death_005.png", "f4_shadowdancer_death_006.png", "f4_shadowdancer_death_007.png", "f4_shadowdancer_death_008.png", "f4_shadowdancer_hit_000.png", "f4_shadowdancer_hit_001.png", "f4_shadowdancer_hit_002.png", "f4_shadowdancer_idle_000.png", "f4_shadowdancer_idle_001.png", "f4_shadowdancer_idle_002.png", "f4_shadowdancer_idle_003.png", "f4_shadowdancer_idle_004.png", "f4_shadowdancer_idle_005.png", "f4_shadowdancer_idle_006.png", "f4_shadowdancer_idle_007.png", "f4_shadowdancer_idle_008.png", "f4_shadowdancer_idle_009.png", "f4_shadowdancer_idle_010.png", "f4_shadowdancer_idle_011.png", "f4_shadowdancer_run_000.png", "f4_shadowdancer_run_001.png", "f4_shadowdancer_run_002.png", "f4_shadowdancer_run_003.png", "f4_shadowdancer_run_004.png", "f4_shadowdancer_run_005.png", "f4_shadowdancer_run_006.png", "f4_shadowdancer_run_007.png" ], "frameDIR": "assets/game/extra/units/f4_shadowdancer/", "idle" : { "frameStartEndIndices" : [ 0, 0 ], "fps" : 8, "loop" : true }, "death" : { "frameStartEndIndices" : [ 0, 0 ], "fps" : 8, "loop" : false }, "attack" : { "frameStartEndIndices" : [ 0, 0 ], "fps" : 8, "loop" : false }, "move" : { "frameStartEndIndices" : [ 0, 0 ], "fps" : 8, "loop" : true }, "channel" : { "frameStartEndIndices" : [ 0, 0 ], "fps" : 8, "loop" : true }, "hit" : { "frameStartEndIndices" : [ 0, 0 ], "fps" : 8, "loop" : false } }, "correction" : { "imgWidth" : 80, "imgHeight" : 80, "scale": 1.5, "offsetX": 0, "offsetY": 10, "spriteTopLeftX" : 0, "spriteTopLeftY" : 0, "reflected" : false } }

+ 1
- 0
conf/gameconfs/units/silverguard_knight.json View File

@@ -0,0 +1 @@
{ "id" : 0, "animation" : "idle", "position" : { "xpos" : 0, "ypos" : 0, "tilex" : 0, "tiley" : 0 }, "animations" : { "allFrames" : [ "f1_tank_attack_000.png", "f1_tank_attack_001.png", "f1_tank_attack_002.png", "f1_tank_attack_003.png", "f1_tank_attack_004.png", "f1_tank_attack_005.png", "f1_tank_attack_006.png", "f1_tank_attack_007.png", "f1_tank_attack_008.png", "f1_tank_attack_009.png", "f1_tank_attack_010.png", "f1_tank_attack_011.png", "f1_tank_attack_012.png", "f1_tank_attack_013.png", "f1_tank_attack_014.png", "f1_tank_attack_015.png", "f1_tank_attack_016.png", "f1_tank_attack_017.png", "f1_tank_attack_018.png", "f1_tank_breathing_000.png", "f1_tank_breathing_001.png", "f1_tank_breathing_002.png", "f1_tank_breathing_003.png", "f1_tank_breathing_004.png", "f1_tank_breathing_005.png", "f1_tank_breathing_006.png", "f1_tank_breathing_007.png", "f1_tank_breathing_008.png", "f1_tank_breathing_009.png", "f1_tank_breathing_010.png", "f1_tank_breathing_011.png", "f1_tank_breathing_012.png", "f1_tank_breathing_013.png", "f1_tank_death_000.png", "f1_tank_death_001.png", "f1_tank_death_002.png", "f1_tank_death_003.png", "f1_tank_death_004.png", "f1_tank_death_005.png", "f1_tank_death_006.png", "f1_tank_death_007.png", "f1_tank_death_008.png", "f1_tank_death_009.png", "f1_tank_death_010.png", "f1_tank_death_011.png", "f1_tank_hit_000.png", "f1_tank_hit_001.png", "f1_tank_hit_002.png", "f1_tank_hit_003.png", "f1_tank_hit_004.png", "f1_tank_idle_000.png", "f1_tank_idle_001.png", "f1_tank_idle_002.png", "f1_tank_idle_003.png", "f1_tank_idle_004.png", "f1_tank_idle_005.png", "f1_tank_idle_006.png", "f1_tank_idle_007.png", "f1_tank_idle_008.png", "f1_tank_idle_009.png", "f1_tank_idle_010.png", "f1_tank_run_000.png", "f1_tank_run_001.png", "f1_tank_run_002.png", "f1_tank_run_003.png", "f1_tank_run_004.png", "f1_tank_run_005.png", "f1_tank_run_006.png", "f1_tank_run_007.png" ], "frameDIR": "assets/game/extra/units/f1_tank/", "idle" : { "frameStartEndIndices" : [ 50, 60 ], "fps" : 8, "loop" : true }, "death" : { "frameStartEndIndices" : [ 33, 44 ], "fps" : 8, "loop" : false }, "attack" : { "frameStartEndIndices" : [ 0, 18 ], "fps" : 8, "loop" : false }, "move" : { "frameStartEndIndices" : [ 61, 68 ], "fps" : 8, "loop" : true }, "channel" : { "frameStartEndIndices" : [ 19, 32 ], "fps" : 8, "loop" : true }, "hit" : { "frameStartEndIndices" : [ 45, 49 ], "fps" : 8, "loop" : false } }, "correction" : { "imgWidth" : 80, "imgHeight" : 80, "scale": 1.5, "offsetX": 0, "offsetY": 10, "spriteTopLeftX" : 0, "spriteTopLeftY" : 0, "reflected" : true } }

+ 1
- 0
conf/gameconfs/units/silverguard_squire.json View File

@@ -0,0 +1 @@
{ "id" : 0, "animation" : "idle", "position" : { "xpos" : 0, "ypos" : 0, "tilex" : 0, "tiley" : 0 }, "animations" : { "allFrames" : [ "f1_silverguardsquire_attack_000.png", "f1_silverguardsquire_attack_001.png", "f1_silverguardsquire_attack_002.png", "f1_silverguardsquire_attack_003.png", "f1_silverguardsquire_attack_004.png", "f1_silverguardsquire_attack_005.png", "f1_silverguardsquire_attack_006.png", "f1_silverguardsquire_attack_007.png", "f1_silverguardsquire_attack_008.png", "f1_silverguardsquire_attack_009.png", "f1_silverguardsquire_attack_010.png", "f1_silverguardsquire_attack_011.png", "f1_silverguardsquire_attack_012.png", "f1_silverguardsquire_breathing_000.png", "f1_silverguardsquire_breathing_001.png", "f1_silverguardsquire_breathing_002.png", "f1_silverguardsquire_breathing_003.png", "f1_silverguardsquire_breathing_004.png", "f1_silverguardsquire_breathing_005.png", "f1_silverguardsquire_breathing_006.png", "f1_silverguardsquire_breathing_007.png", "f1_silverguardsquire_breathing_008.png", "f1_silverguardsquire_breathing_009.png", "f1_silverguardsquire_breathing_010.png", "f1_silverguardsquire_breathing_011.png", "f1_silverguardsquire_breathing_012.png", "f1_silverguardsquire_breathing_013.png", "f1_silverguardsquire_death_000.png", "f1_silverguardsquire_death_001.png", "f1_silverguardsquire_death_002.png", "f1_silverguardsquire_death_003.png", "f1_silverguardsquire_death_004.png", "f1_silverguardsquire_death_005.png", "f1_silverguardsquire_death_006.png", "f1_silverguardsquire_death_007.png", "f1_silverguardsquire_death_008.png", "f1_silverguardsquire_death_009.png", "f1_silverguardsquire_death_010.png", "f1_silverguardsquire_hit_000.png", "f1_silverguardsquire_hit_001.png", "f1_silverguardsquire_hit_002.png", "f1_silverguardsquire_idle_000.png", "f1_silverguardsquire_idle_001.png", "f1_silverguardsquire_idle_002.png", "f1_silverguardsquire_idle_003.png", "f1_silverguardsquire_idle_004.png", "f1_silverguardsquire_idle_005.png", "f1_silverguardsquire_idle_006.png", "f1_silverguardsquire_idle_007.png", "f1_silverguardsquire_idle_008.png", "f1_silverguardsquire_idle_009.png", "f1_silverguardsquire_run_000.png", "f1_silverguardsquire_run_001.png", "f1_silverguardsquire_run_002.png", "f1_silverguardsquire_run_003.png", "f1_silverguardsquire_run_004.png", "f1_silverguardsquire_run_005.png", "f1_silverguardsquire_run_006.png", "f1_silverguardsquire_run_007.png" ], "frameDIR": "assets/game/extra/units/f1_silverguardsquire/", "idle" : { "frameStartEndIndices" : [ 0, 0 ], "fps" : 8, "loop" : true }, "death" : { "frameStartEndIndices" : [ 0, 0 ], "fps" : 8, "loop" : false }, "attack" : { "frameStartEndIndices" : [ 0, 0 ], "fps" : 8, "loop" : false }, "move" : { "frameStartEndIndices" : [ 0, 0 ], "fps" : 8, "loop" : true }, "channel" : { "frameStartEndIndices" : [ 0, 0 ], "fps" : 8, "loop" : true }, "hit" : { "frameStartEndIndices" : [ 0, 0 ], "fps" : 8, "loop" : false } }, "correction" : { "imgWidth" : 80, "imgHeight" : 80, "scale": 1.5, "offsetX": 0, "offsetY": 10, "spriteTopLeftX" : 0, "spriteTopLeftY" : 0, "reflected" : true } }

+ 1
- 0
conf/gameconfs/units/skyrock_golem.json View File

@@ -0,0 +1 @@
{ "id" : 0, "animation" : "idle", "position" : { "xpos" : 0, "ypos" : 0, "tilex" : 0, "tiley" : 0 }, "animations" : { "allFrames" : [ "neutral_golemrunesand_attack_000.png", "neutral_golemrunesand_attack_001.png", "neutral_golemrunesand_attack_002.png", "neutral_golemrunesand_attack_003.png", "neutral_golemrunesand_attack_004.png", "neutral_golemrunesand_attack_005.png", "neutral_golemrunesand_attack_006.png", "neutral_golemrunesand_attack_007.png", "neutral_golemrunesand_attack_008.png", "neutral_golemrunesand_attack_009.png", "neutral_golemrunesand_attack_010.png", "neutral_golemrunesand_attack_011.png", "neutral_golemrunesand_breathing_000.png", "neutral_golemrunesand_breathing_001.png", "neutral_golemrunesand_breathing_002.png", "neutral_golemrunesand_breathing_003.png", "neutral_golemrunesand_breathing_004.png", "neutral_golemrunesand_breathing_005.png", "neutral_golemrunesand_breathing_006.png", "neutral_golemrunesand_breathing_007.png", "neutral_golemrunesand_breathing_008.png", "neutral_golemrunesand_breathing_009.png", "neutral_golemrunesand_breathing_010.png", "neutral_golemrunesand_breathing_011.png", "neutral_golemrunesand_breathing_012.png", "neutral_golemrunesand_breathing_013.png", "neutral_golemrunesand_death_000.png", "neutral_golemrunesand_death_001.png", "neutral_golemrunesand_death_002.png", "neutral_golemrunesand_death_003.png", "neutral_golemrunesand_death_004.png", "neutral_golemrunesand_death_005.png", "neutral_golemrunesand_death_006.png", "neutral_golemrunesand_death_007.png", "neutral_golemrunesand_death_008.png", "neutral_golemrunesand_hit_000.png", "neutral_golemrunesand_hit_001.png", "neutral_golemrunesand_hit_002.png", "neutral_golemrunesand_idle_000.png", "neutral_golemrunesand_idle_001.png", "neutral_golemrunesand_idle_002.png", "neutral_golemrunesand_idle_003.png", "neutral_golemrunesand_idle_004.png", "neutral_golemrunesand_idle_005.png", "neutral_golemrunesand_idle_006.png", "neutral_golemrunesand_idle_007.png", "neutral_golemrunesand_idle_008.png", "neutral_golemrunesand_idle_009.png", "neutral_golemrunesand_idle_010.png", "neutral_golemrunesand_idle_011.png", "neutral_golemrunesand_idle_012.png", "neutral_golemrunesand_idle_013.png", "neutral_golemrunesand_run_000.png", "neutral_golemrunesand_run_001.png", "neutral_golemrunesand_run_002.png", "neutral_golemrunesand_run_003.png", "neutral_golemrunesand_run_004.png", "neutral_golemrunesand_run_005.png", "neutral_golemrunesand_run_006.png", "neutral_golemrunesand_run_007.png" ], "frameDIR": "assets/game/extra/units/neutral_golemrunesand/", "idle" : { "frameStartEndIndices" : [ 0, 0 ], "fps" : 8, "loop" : true }, "death" : { "frameStartEndIndices" : [ 0, 0 ], "fps" : 8, "loop" : false }, "attack" : { "frameStartEndIndices" : [ 0, 0 ], "fps" : 8, "loop" : false }, "move" : { "frameStartEndIndices" : [ 0, 0 ], "fps" : 8, "loop" : true }, "channel" : { "frameStartEndIndices" : [ 0, 0 ], "fps" : 8, "loop" : true }, "hit" : { "frameStartEndIndices" : [ 0, 0 ], "fps" : 8, "loop" : false } }, "correction" : { "imgWidth" : 80, "imgHeight" : 80, "scale": 1.5, "offsetX": 0, "offsetY": 10, "spriteTopLeftX" : 0, "spriteTopLeftY" : 0, "reflected" : true } }

+ 1
- 0
conf/gameconfs/units/swamp_entangler.json View File

@@ -0,0 +1 @@
{ "id" : 0, "animation" : "idle", "position" : { "xpos" : 0, "ypos" : 0, "tilex" : 0, "tiley" : 0 }, "animations" : { "allFrames" : [ "neutral_beastswamp_attack_000.png", "neutral_beastswamp_attack_001.png", "neutral_beastswamp_attack_002.png", "neutral_beastswamp_attack_003.png", "neutral_beastswamp_attack_004.png", "neutral_beastswamp_attack_005.png", "neutral_beastswamp_attack_006.png", "neutral_beastswamp_attack_007.png", "neutral_beastswamp_attack_008.png", "neutral_beastswamp_attack_009.png", "neutral_beastswamp_attack_010.png", "neutral_beastswamp_attack_011.png", "neutral_beastswamp_breathing_000.png", "neutral_beastswamp_breathing_001.png", "neutral_beastswamp_breathing_002.png", "neutral_beastswamp_breathing_003.png", "neutral_beastswamp_breathing_004.png", "neutral_beastswamp_breathing_005.png", "neutral_beastswamp_breathing_006.png", "neutral_beastswamp_breathing_007.png", "neutral_beastswamp_breathing_008.png", "neutral_beastswamp_breathing_009.png", "neutral_beastswamp_breathing_010.png", "neutral_beastswamp_breathing_011.png", "neutral_beastswamp_breathing_012.png", "neutral_beastswamp_breathing_013.png", "neutral_beastswamp_death_000.png", "neutral_beastswamp_death_001.png", "neutral_beastswamp_death_002.png", "neutral_beastswamp_death_003.png", "neutral_beastswamp_death_004.png", "neutral_beastswamp_death_005.png", "neutral_beastswamp_death_006.png", "neutral_beastswamp_death_007.png", "neutral_beastswamp_hit_000.png", "neutral_beastswamp_hit_001.png", "neutral_beastswamp_hit_002.png", "neutral_beastswamp_idle_000.png", "neutral_beastswamp_idle_001.png", "neutral_beastswamp_idle_002.png", "neutral_beastswamp_idle_003.png", "neutral_beastswamp_idle_004.png", "neutral_beastswamp_idle_005.png", "neutral_beastswamp_idle_006.png", "neutral_beastswamp_idle_007.png", "neutral_beastswamp_idle_008.png", "neutral_beastswamp_idle_009.png", "neutral_beastswamp_idle_010.png", "neutral_beastswamp_idle_011.png", "neutral_beastswamp_run_000.png", "neutral_beastswamp_run_001.png", "neutral_beastswamp_run_002.png", "neutral_beastswamp_run_003.png", "neutral_beastswamp_run_004.png", "neutral_beastswamp_run_005.png", "neutral_beastswamp_run_006.png", "neutral_beastswamp_run_007.png", "neutral_beastswamp_run_008.png", "neutral_beastswamp_run_009.png" ], "frameDIR": "assets/game/extra/units/neutral_beastswamp/", "idle" : { "frameStartEndIndices" : [ 0, 0 ], "fps" : 8, "loop" : true }, "death" : { "frameStartEndIndices" : [ 0, 0 ], "fps" : 8, "loop" : false }, "attack" : { "frameStartEndIndices" : [ 0, 0 ], "fps" : 8, "loop" : false }, "move" : { "frameStartEndIndices" : [ 0, 0 ], "fps" : 8, "loop" : true }, "channel" : { "frameStartEndIndices" : [ 0, 0 ], "fps" : 8, "loop" : true }, "hit" : { "frameStartEndIndices" : [ 0, 0 ], "fps" : 8, "loop" : false } }, "correction" : { "imgWidth" : 80, "imgHeight" : 80, "scale": 1.5, "offsetX": 0, "offsetY": 10, "spriteTopLeftX" : 0, "spriteTopLeftY" : 0, "reflected" : true } }

+ 1
- 0
conf/gameconfs/units/wraithling.json View File

@@ -0,0 +1 @@
{ "id" : 0, "animation" : "idle", "position" : { "xpos" : 0, "ypos" : 0, "tilex" : 0, "tiley" : 0 }, "animations" : { "allFrames" : [ "f4_crawler_attack_000.png", "f4_crawler_attack_001.png", "f4_crawler_attack_002.png", "f4_crawler_attack_003.png", "f4_crawler_attack_004.png", "f4_crawler_attack_005.png", "f4_crawler_attack_006.png", "f4_crawler_attack_007.png", "f4_crawler_attack_008.png", "f4_crawler_attack_009.png", "f4_crawler_breathing_000.png", "f4_crawler_breathing_001.png", "f4_crawler_breathing_002.png", "f4_crawler_breathing_003.png", "f4_crawler_breathing_004.png", "f4_crawler_breathing_005.png", "f4_crawler_breathing_006.png", "f4_crawler_breathing_007.png", "f4_crawler_breathing_008.png", "f4_crawler_breathing_009.png", "f4_crawler_breathing_010.png", "f4_crawler_breathing_011.png", "f4_crawler_breathing_012.png", "f4_crawler_breathing_013.png", "f4_crawler_damage_000.png", "f4_crawler_damage_001.png", "f4_crawler_damage_002.png", "f4_crawler_death_000.png", "f4_crawler_death_001.png", "f4_crawler_death_002.png", "f4_crawler_death_003.png", "f4_crawler_death_004.png", "f4_crawler_death_005.png", "f4_crawler_death_006.png", "f4_crawler_death_007.png", "f4_crawler_idle_000.png", "f4_crawler_idle_001.png", "f4_crawler_idle_002.png", "f4_crawler_idle_003.png", "f4_crawler_idle_004.png", "f4_crawler_idle_005.png", "f4_crawler_idle_006.png", "f4_crawler_idle_007.png", "f4_crawler_idle_008.png", "f4_crawler_idle_009.png", "f4_crawler_idle_010.png", "f4_crawler_idle_011.png", "f4_crawler_run_000.png", "f4_crawler_run_001.png", "f4_crawler_run_002.png", "f4_crawler_run_003.png", "f4_crawler_run_004.png", "f4_crawler_run_005.png" ], "frameDIR": "assets/game/extra/units/f4_crawler/", "idle" : { "frameStartEndIndices" : [ 0, 0 ], "fps" : 8, "loop" : true }, "death" : { "frameStartEndIndices" : [ 0, 0 ], "fps" : 8, "loop" : false }, "attack" : { "frameStartEndIndices" : [ 0, 0 ], "fps" : 8, "loop" : false }, "move" : { "frameStartEndIndices" : [ 0, 0 ], "fps" : 8, "loop" : true }, "channel" : { "frameStartEndIndices" : [ 0, 0 ], "fps" : 8, "loop" : true }, "hit" : { "frameStartEndIndices" : [ 0, 0 ], "fps" : 8, "loop" : false } }, "correction" : { "imgWidth" : 80, "imgHeight" : 80, "scale": 1.5, "offsetX": 0, "offsetY": 10, "spriteTopLeftX" : 0, "spriteTopLeftY" : 0, "reflected" : false } }

Some files were not shown because too many files changed in this diff

Loading…
Cancel
Save