diff --git a/.idea/artifacts/SpriteAssemblerApp.xml b/.idea/artifacts/SpriteAssemblerApp.xml
new file mode 100644
index 000000000..cfd3fea8a
--- /dev/null
+++ b/.idea/artifacts/SpriteAssemblerApp.xml
@@ -0,0 +1,71 @@
+
+
+ $PROJECT_DIR$/out
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/runConfigurations/SpriteAssemblerApp.xml b/.idea/runConfigurations/SpriteAssemblerApp.xml
new file mode 100644
index 000000000..9f632f982
--- /dev/null
+++ b/.idea/runConfigurations/SpriteAssemblerApp.xml
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/assets/mods/basegame/sprites/velki/velki_arm_rest_left.tga b/assets/mods/basegame/sprites/velki/velki_arm_rest_left.tga
new file mode 100644
index 000000000..cf8472773
--- /dev/null
+++ b/assets/mods/basegame/sprites/velki/velki_arm_rest_left.tga
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:a061ed90f9a3b464136f0977e41385ca428655a56fc264f65481392b9fda61a9
+size 494
diff --git a/assets/mods/basegame/sprites/velki/velki_arm_rest_right.tga b/assets/mods/basegame/sprites/velki/velki_arm_rest_right.tga
new file mode 100644
index 000000000..7e4b9c9a8
--- /dev/null
+++ b/assets/mods/basegame/sprites/velki/velki_arm_rest_right.tga
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:f142b212364a4b7f89ea4158b2073ecd4493e89af2d3737a1295a1472f3c4f62
+size 522
diff --git a/assets/mods/basegame/sprites/velki/velki_head.tga b/assets/mods/basegame/sprites/velki/velki_head.tga
new file mode 100644
index 000000000..b33245fc6
--- /dev/null
+++ b/assets/mods/basegame/sprites/velki/velki_head.tga
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:b891b4fef5b5064f95d7062ee03e2d952eaf247c1e4e1146e2a74c42e18bfad3
+size 1386
diff --git a/assets/mods/basegame/sprites/velki/velki_leg_rest_left.tga b/assets/mods/basegame/sprites/velki/velki_leg_rest_left.tga
new file mode 100644
index 000000000..648d250ba
--- /dev/null
+++ b/assets/mods/basegame/sprites/velki/velki_leg_rest_left.tga
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:965f93f865c16bd22f0c16abd07709dbebb7a21e099930dc24a3560bc099f9d3
+size 498
diff --git a/assets/mods/basegame/sprites/velki/velki_leg_rest_right.tga b/assets/mods/basegame/sprites/velki/velki_leg_rest_right.tga
new file mode 100644
index 000000000..cfb34a4a4
--- /dev/null
+++ b/assets/mods/basegame/sprites/velki/velki_leg_rest_right.tga
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:e9202719cdff4ffd524eb3dbf3e4333272fd3a5324ec34ff78e864a217289b40
+size 498
diff --git a/assets/mods/basegame/sprites/velki/velki_tail_0.tga b/assets/mods/basegame/sprites/velki/velki_tail_0.tga
new file mode 100644
index 000000000..5596cca54
--- /dev/null
+++ b/assets/mods/basegame/sprites/velki/velki_tail_0.tga
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:78672873daefb2f7aff72eef9f62c617e198216847a3ecbc315c466e6419373c
+size 162
diff --git a/assets/mods/basegame/sprites/velki/velki_torso.tga b/assets/mods/basegame/sprites/velki/velki_torso.tga
new file mode 100644
index 000000000..984dba53e
--- /dev/null
+++ b/assets/mods/basegame/sprites/velki/velki_torso.tga
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:58b2ab620c057497eca0059160897e6849d6ddc3261f320e4d5e761248f4de57
+size 914
diff --git a/assets/mods/basegame/sprites/velki_whitevalley.properties b/assets/mods/basegame/sprites/velki_whitevalley.properties
new file mode 100644
index 000000000..a1a2f1333
--- /dev/null
+++ b/assets/mods/basegame/sprites/velki_whitevalley.properties
@@ -0,0 +1,52 @@
+# Velki Whitevalley is a character made and copyrighted to Pederont, 2018. All rights reserved.
+# Used with permission for testing purpose only.
+
+# complete file name is: SPRITESHEET + bodypart name + EXTENSION
+SPRITESHEET=mods/basegame/sprites/velki/velki_
+EXTENSION=.tga
+# defines frame size and origin point. Origin point is given as: (originx, size.y - 1)
+# ORIGINY is deduced from the sprite size as shown in above; you only need to set ORIGINX
+CONFIG=SIZE 48,56;ORIGINX 29
+
+# note to self: don't implement skeleton hierarchy: there's too many exceptions
+# besides, you have "ALL" key.
+
+! a skeleton also defines what body parts (images) be used.
+! you can also write multiline text using reverse solidus; this is a feature of .properties
+! skeleton joints are ordered: foremost-drawn object comes first, which means lowermost object IN THIS LIST
+! are painted first, and any object that comes before it will paint over it. In other words, this list is
+! first reversed then being iterated.
+! Joints' original point is defined in the document sprite_joints.psd. It also has visual representations.
+# TODO right now accessory points are explicitly defined. Should they be injected in run-time?
+BODYPARTS=HEADGEAR 11,11;\
+ HEAD 11,11;\
+ ARM_REST_RIGHT 4,2;\
+ ARM_REST_LEFT 4,2;\
+ LEG_REST_RIGHT 4,7;\
+ LEG_REST_LEFT 4,7;\
+ TORSO 10,4;\
+ TAIL_0 8,1;\
+ HELD_ITEM 0,0
+SKELETON_STAND=HEADGEAR 0,32;HAIR_FORE 0,32;\
+ ARM_REST_RIGHT -7,23;HELD_ITEM -6,11;\
+ HAIR 0,32;HEAD 0,32;\
+ TORSO 0,22;\
+ LEG_REST_RIGHT -2,7;\
+ LEG_REST_LEFT 2,7;\
+ ARM_REST_LEFT 5,24;\
+ TAIL_0 0,13;TAIL_1 0,13
+
+# skeleton_stand is used for testing purpose
+ANIM_RUN=DELAY 0.15;ROW 2;SKELETON SKELETON_STAND
+ANIM_RUN_1=TAIL_0 0,-999;LEG_REST_RIGHT 1,1;LEG_REST_LEFT -1,0
+ANIM_RUN_2=TAIL_1 0,-999;ALL 0,1;LEG_REST_RIGHT 0,-1;LEG_REST_LEFT 0,1
+ANIM_RUN_3=TAIL_1 0,-999;LEG_REST_RIGHT -1,0;LEG_REST_LEFT 1,1
+ANIM_RUN_4=TAIL_0 0,-999;ALL 0,1;LEG_REST_RIGHT 0,1;LEG_REST_LEFT 0,-1
+
+
+ANIM_IDLE=DELAY 2;ROW 1;SKELETON SKELETON_STAND
+ANIM_IDLE_1=TAIL_1 0,-999
+ANIM_IDLE_2=TAIL_1 0,-999;\
+ TORSO 0,-1;HEAD 0,-1;HAIR 0,-1;HELD_ITEM 0,-1;\
+ ARM_REST_LEFT 0,-1;ARM_REST_RIGHT 0,-1;\
+ HAIR_FORE 0,-1;HEADGEAR 0,-1
diff --git a/assets/mods/basegame/sprites/velki_whitevalley_glow.properties b/assets/mods/basegame/sprites/velki_whitevalley_glow.properties
new file mode 100644
index 000000000..9483362fd
--- /dev/null
+++ b/assets/mods/basegame/sprites/velki_whitevalley_glow.properties
@@ -0,0 +1,52 @@
+# Velki Whitevalley is a character made and copyrighted to Pederont, 2018. All rights reserved.
+# Used with permission for testing purpose only.
+
+# complete file name is: SPRITESHEET + bodypart name + EXTENSION
+SPRITESHEET=mods/basegame/sprites/velki/velkiglow_
+EXTENSION=.tga
+# defines frame size and origin point. Origin point is given as: (originx, size.y - 1)
+# ORIGINY is deduced from the sprite size as shown in above; you only need to set ORIGINX
+CONFIG=SIZE 48,56;ORIGINX 29
+
+# note to self: don't implement skeleton hierarchy: there's too many exceptions
+# besides, you have "ALL" key.
+
+! a skeleton also defines what body parts (images) be used.
+! you can also write multiline text using reverse solidus; this is a feature of .properties
+! skeleton joints are ordered: foremost-drawn object comes first, which means lowermost object IN THIS LIST
+! are painted first, and any object that comes before it will paint over it. In other words, this list is
+! first reversed then being iterated.
+! Joints' original point is defined in the document sprite_joints.psd. It also has visual representations.
+# TODO right now accessory points are explicitly defined. Should they be injected in run-time?
+BODYPARTS=HEADGEAR 11,11;\
+ HEAD 11,11;\
+ ARM_REST_RIGHT 4,2;\
+ ARM_REST_LEFT 4,2;\
+ LEG_REST_RIGHT 4,7;\
+ LEG_REST_LEFT 4,7;\
+ TORSO 10,4;\
+ TAIL_0 8,1;\
+ HELD_ITEM 0,0
+SKELETON_STAND=HEADGEAR 0,32;HAIR_FORE 0,32;\
+ ARM_REST_RIGHT -7,23;HELD_ITEM -6,11;\
+ HAIR 0,32;HEAD 0,32;\
+ TORSO 0,22;\
+ LEG_REST_RIGHT -2,7;\
+ LEG_REST_LEFT 2,7;\
+ ARM_REST_LEFT 5,24;\
+ TAIL_0 0,13;TAIL_1 0,13
+
+# skeleton_stand is used for testing purpose
+ANIM_RUN=DELAY 0.15;ROW 2;SKELETON SKELETON_STAND
+ANIM_RUN_1=TAIL_0 0,-999;LEG_REST_RIGHT 1,1;LEG_REST_LEFT -1,0
+ANIM_RUN_2=TAIL_1 0,-999;ALL 0,1;LEG_REST_RIGHT 0,-1;LEG_REST_LEFT 0,1
+ANIM_RUN_3=TAIL_1 0,-999;LEG_REST_RIGHT -1,0;LEG_REST_LEFT 1,1
+ANIM_RUN_4=TAIL_0 0,-999;ALL 0,1;LEG_REST_RIGHT 0,1;LEG_REST_LEFT 0,-1
+
+
+ANIM_IDLE=DELAY 2;ROW 1;SKELETON SKELETON_STAND
+ANIM_IDLE_1=TAIL_1 0,-999
+ANIM_IDLE_2=TAIL_1 0,-999;\
+ TORSO 0,-1;HEAD 0,-1;HAIR 0,-1;HELD_ITEM 0,-1;\
+ ARM_REST_LEFT 0,-1;ARM_REST_RIGHT 0,-1;\
+ HAIR_FORE 0,-1;HEADGEAR 0,-1
diff --git a/src/META-INF/MANIFEST.MF b/src/META-INF/MANIFEST.MF
index 7382b405b..d6603425b 100644
--- a/src/META-INF/MANIFEST.MF
+++ b/src/META-INF/MANIFEST.MF
@@ -1,3 +1,3 @@
-Manifest-Version: 1.0
-Main-Class: net.torvald.terrarum.App
-
+Manifest-Version: 1.0
+Main-Class: net.torvald.terrarum.App
+
diff --git a/src/net/torvald/terrarum/modulebasegame/gameactors/PlayerBuilderTestSubject1.kt b/src/net/torvald/terrarum/modulebasegame/gameactors/PlayerBuilderTestSubject1.kt
index 5cb669ccc..219f943f8 100644
--- a/src/net/torvald/terrarum/modulebasegame/gameactors/PlayerBuilderTestSubject1.kt
+++ b/src/net/torvald/terrarum/modulebasegame/gameactors/PlayerBuilderTestSubject1.kt
@@ -1,7 +1,6 @@
package net.torvald.terrarum.modulebasegame.gameactors
import net.torvald.spriteanimation.AssembledSpriteAnimation
-import net.torvald.spriteanimation.SpriteAnimation
import net.torvald.terrarum.ModMgr
import net.torvald.terrarum.gameactors.AVKey
@@ -11,8 +10,8 @@ import net.torvald.terrarum.gameactors.AVKey
object PlayerBuilderTestSubject1 {
operator fun invoke(): IngamePlayer {
val p: IngamePlayer = IngamePlayer(
- ModMgr.getGdxFile("basegame", "sprites/test_sprite.properties").path(),
- ModMgr.getGdxFile("basegame", "sprites/test_sprite_glow.properties").path(),
+ ModMgr.getGdxFile("basegame", "sprites/velki_whitevalley.properties").path(),
+ ModMgr.getGdxFile("basegame", "sprites/velki_whitevalley_glow.properties").path(),
-589141658L // random value thrown
)
InjectCreatureRaw(p.actorValue, "basegame", "CreatureHuman.json")
diff --git a/src/net/torvald/terrarum/spriteassembler/META-INF/MANIFEST.MF b/src/net/torvald/terrarum/spriteassembler/META-INF/MANIFEST.MF
new file mode 100644
index 000000000..48d9e14e5
--- /dev/null
+++ b/src/net/torvald/terrarum/spriteassembler/META-INF/MANIFEST.MF
@@ -0,0 +1,3 @@
+Manifest-Version: 1.0
+Main-Class: net.torvald.terrarum.spriteassembler.SpriteAssemblerAppKt
+
diff --git a/work_files/graphics/sprites/furbud2_jointed.psd b/work_files/graphics/sprites/furbud2_jointed.psd
index 68a7138fe..94de1957c 100644
--- a/work_files/graphics/sprites/furbud2_jointed.psd
+++ b/work_files/graphics/sprites/furbud2_jointed.psd
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:cc4218e979c7ccecbb8a8363fe83e8048e54b1cc991e0a486d0e04c87a2e9829
-size 65278
+oid sha256:92616d0e5abbcc36cc9e36c891c8254fd288468e6437a4276bb8261af3487f1a
+size 65322