Generated using https://www.toptal.com/developers/gitignore/api/sbt,playframework and also ignored the game sprites / other UI imagesmain
@@ -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> |
@@ -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/ |
@@ -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> |
@@ -0,0 +1,3 @@ | |||||
#Generated by sbteclipse | |||||
#Thu Feb 02 17:37:38 GMT 2023 | |||||
encoding/<project>=UTF-8 |
@@ -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 |
@@ -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/> |
@@ -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/>. |
@@ -0,0 +1,2 @@ | |||||
# ITSDTeamProject-0 | |||||
@@ -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); | |||||
} | |||||
} |
@@ -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(); | |||||
} | |||||
} | |||||
} |
@@ -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); | |||||
} | |||||
} |
@@ -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); | |||||
} |
@@ -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 | |||||
} | |||||
} |
@@ -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 | |||||
} | |||||
} |
@@ -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();} | |||||
} | |||||
} | |||||
} |
@@ -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(); | |||||
} | |||||
} |
@@ -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) { | |||||
} | |||||
} |
@@ -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); | |||||
} |
@@ -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) { | |||||
} | |||||
} |
@@ -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); | |||||
} | |||||
} | |||||
@@ -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) { | |||||
} | |||||
} | |||||
@@ -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 | |||||
} | |||||
} | |||||
} |
@@ -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(); | |||||
} | |||||
} |
@@ -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(); | |||||
} | |||||
} |
@@ -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; | |||||
} |
@@ -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; | |||||
} | |||||
} |
@@ -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()); | |||||
} | |||||
} |
@@ -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; | |||||
} | |||||
} |
@@ -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; | |||||
} | |||||
} |
@@ -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; | |||||
} | |||||
} |
@@ -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)); | |||||
} | |||||
} |
@@ -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; | |||||
} | |||||
} |
@@ -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; | |||||
} | |||||
} |
@@ -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; | |||||
} | |||||
} |
@@ -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; | |||||
} | |||||
} |
@@ -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()); | |||||
} | |||||
} |
@@ -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; | |||||
}; | |||||
} |
@@ -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; | |||||
} | |||||
} |
@@ -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 | |||||
} |
@@ -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; | |||||
} | |||||
} |
@@ -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; | |||||
} | |||||
} |
@@ -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; | |||||
} | |||||
} |
@@ -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"; | |||||
} |
@@ -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> |
@@ -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" | |||||
) | |||||
) |
@@ -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"] | |||||
@@ -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 } } |
@@ -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" | |||||
} |
@@ -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 | |||||
} |
@@ -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" | |||||
} |
@@ -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" | |||||
} |
@@ -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 | |||||
} |
@@ -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" | |||||
} |
@@ -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" | |||||
} |
@@ -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 | |||||
} |
@@ -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" | |||||
} |
@@ -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" | |||||
} |
@@ -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" | |||||
} |
@@ -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" | |||||
} |
@@ -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" | |||||
} |
@@ -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" | |||||
} |
@@ -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 | |||||
} |
@@ -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" | |||||
} |
@@ -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" | |||||
} |
@@ -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" | |||||
} |
@@ -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 | |||||
} |
@@ -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 | |||||
} |
@@ -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 | |||||
} |
@@ -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 | |||||
} |
@@ -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 | |||||
} |
@@ -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 | |||||
} |
@@ -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 | |||||
} |
@@ -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 | |||||
} |
@@ -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 | |||||
} |
@@ -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 | |||||
} |
@@ -0,0 +1,8 @@ | |||||
{ | |||||
"boardTiles": null, | |||||
"gridxsize": 9, | |||||
"gridysize": 5, | |||||
"gridmargin": 5, | |||||
"gridTopLeftx": 410, | |||||
"gridTopLefty": 280 | |||||
} |
@@ -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 | |||||
} |
@@ -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 } } |
@@ -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 } } |
@@ -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 } } |
@@ -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 } } |
@@ -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 } } |
@@ -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 } } |
@@ -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 } } |
@@ -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 } } |
@@ -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 } } |
@@ -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 } } |
@@ -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 } } |
@@ -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 } } |
@@ -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 } } |
@@ -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 } } |