From 33f986a82d3567b461eadcba9953f31fcfadbcb9 Mon Sep 17 00:00:00 2001 From: Quillraven Date: Sun, 8 Jun 2025 20:09:13 +0200 Subject: [PATCH] add attack training dummy (for QueryAABB example) --- assets/graphics/objects.atlas | 370 +++++++++++++----- assets/graphics/objects.png | Bin 15110 -> 22869 bytes assets/maps/mainmap.tmx | 9 +- assets/maps/mystic.tiled-project | 27 ++ assets/maps/objects.tsx | 37 +- assets/maps/objects/training_dummy.png | Bin 0 -> 900 bytes assets_raw/objects/player/attack_down_00.png | Bin 0 -> 572 bytes assets_raw/objects/player/attack_down_01.png | Bin 0 -> 746 bytes assets_raw/objects/player/attack_down_02.png | Bin 0 -> 646 bytes assets_raw/objects/player/attack_down_03.png | Bin 0 -> 539 bytes assets_raw/objects/player/attack_left_00.png | Bin 0 -> 4589 bytes assets_raw/objects/player/attack_left_01.png | Bin 0 -> 4712 bytes assets_raw/objects/player/attack_left_02.png | Bin 0 -> 4568 bytes assets_raw/objects/player/attack_left_03.png | Bin 0 -> 4521 bytes assets_raw/objects/player/attack_right_00.png | Bin 0 -> 614 bytes assets_raw/objects/player/attack_right_01.png | Bin 0 -> 718 bytes assets_raw/objects/player/attack_right_02.png | Bin 0 -> 589 bytes assets_raw/objects/player/attack_right_03.png | Bin 0 -> 538 bytes assets_raw/objects/player/attack_up_00.png | Bin 0 -> 505 bytes assets_raw/objects/player/attack_up_01.png | Bin 0 -> 607 bytes assets_raw/objects/player/attack_up_02.png | Bin 0 -> 559 bytes assets_raw/objects/player/attack_up_03.png | Bin 0 -> 432 bytes .../training_dummy/damaged_down_00.png | Bin 0 -> 900 bytes .../training_dummy/damaged_down_01.png | Bin 0 -> 974 bytes .../training_dummy/damaged_down_02.png | Bin 0 -> 768 bytes .../training_dummy/damaged_down_03.png | Bin 0 -> 781 bytes .../training_dummy/damaged_down_04.png | Bin 0 -> 948 bytes .../objects/training_dummy/idle_down_00.png | Bin 0 -> 900 bytes .../io/github/com/quillraven/GdxGame.java | 8 +- .../com/quillraven/ai/AnimationState.java | 62 +++ .../com/quillraven/component/Animation2D.java | 9 +- .../com/quillraven/component/Attack.java | 39 ++ .../com/quillraven/component/Damaged.java | 22 ++ .../com/quillraven/screen/GameScreen.java | 8 + .../com/quillraven/system/AttackSystem.java | 95 +++++ .../quillraven/system/ControllerSystem.java | 9 + .../com/quillraven/system/DamagedSystem.java | 25 ++ .../system/PhysicDebugRenderSystem.java | 17 + .../com/quillraven/system/PhysicSystem.java | 15 +- .../tiled/TiledAshleyConfigurator.java | 28 +- 40 files changed, 654 insertions(+), 126 deletions(-) create mode 100644 assets/maps/objects/training_dummy.png create mode 100644 assets_raw/objects/player/attack_down_00.png create mode 100644 assets_raw/objects/player/attack_down_01.png create mode 100644 assets_raw/objects/player/attack_down_02.png create mode 100644 assets_raw/objects/player/attack_down_03.png create mode 100644 assets_raw/objects/player/attack_left_00.png create mode 100644 assets_raw/objects/player/attack_left_01.png create mode 100644 assets_raw/objects/player/attack_left_02.png create mode 100644 assets_raw/objects/player/attack_left_03.png create mode 100644 assets_raw/objects/player/attack_right_00.png create mode 100644 assets_raw/objects/player/attack_right_01.png create mode 100644 assets_raw/objects/player/attack_right_02.png create mode 100644 assets_raw/objects/player/attack_right_03.png create mode 100644 assets_raw/objects/player/attack_up_00.png create mode 100644 assets_raw/objects/player/attack_up_01.png create mode 100644 assets_raw/objects/player/attack_up_02.png create mode 100644 assets_raw/objects/player/attack_up_03.png create mode 100644 assets_raw/objects/training_dummy/damaged_down_00.png create mode 100644 assets_raw/objects/training_dummy/damaged_down_01.png create mode 100644 assets_raw/objects/training_dummy/damaged_down_02.png create mode 100644 assets_raw/objects/training_dummy/damaged_down_03.png create mode 100644 assets_raw/objects/training_dummy/damaged_down_04.png create mode 100644 assets_raw/objects/training_dummy/idle_down_00.png create mode 100644 core/src/main/java/io/github/com/quillraven/component/Attack.java create mode 100644 core/src/main/java/io/github/com/quillraven/component/Damaged.java create mode 100644 core/src/main/java/io/github/com/quillraven/system/AttackSystem.java create mode 100644 core/src/main/java/io/github/com/quillraven/system/DamagedSystem.java diff --git a/assets/graphics/objects.atlas b/assets/graphics/objects.atlas index cdd59d4..f16a607 100644 --- a/assets/graphics/objects.atlas +++ b/assets/graphics/objects.atlas @@ -25,342 +25,496 @@ oak_tree/oak_tree orig: 41, 63 offset: 0, 0 index: -1 -player/idle_down +player/attack_down rotate: false xy: 86, 221 size: 32, 32 orig: 32, 32 offset: 0, 0 index: 0 -player/idle_down +player/attack_down rotate: false xy: 2, 38 size: 32, 32 orig: 32, 32 offset: 0, 0 index: 1 -player/idle_down +player/attack_down rotate: false xy: 47, 105 size: 32, 32 orig: 32, 32 offset: 0, 0 index: 2 -player/idle_down +player/attack_down rotate: false xy: 86, 185 size: 32, 32 orig: 32, 32 offset: 0, 0 index: 3 -player/idle_down +player/attack_left rotate: false xy: 122, 221 size: 32, 32 orig: 32, 32 offset: 0, 0 - index: 4 -player/idle_down + index: 0 +player/attack_left rotate: false xy: 2, 2 size: 32, 32 orig: 32, 32 offset: 0, 0 - index: 5 -player/idle_left + index: 1 +player/attack_left rotate: false xy: 86, 149 size: 32, 32 orig: 32, 32 offset: 0, 0 - index: 0 -player/idle_left + index: 2 +player/attack_left rotate: false xy: 122, 185 size: 32, 32 orig: 32, 32 offset: 0, 0 - index: 1 -player/idle_left + index: 3 +player/attack_right rotate: false xy: 158, 221 size: 32, 32 orig: 32, 32 offset: 0, 0 - index: 2 -player/idle_left + index: 0 +player/attack_right rotate: false xy: 122, 149 size: 32, 32 orig: 32, 32 offset: 0, 0 - index: 3 -player/idle_left + index: 1 +player/attack_right rotate: false xy: 158, 185 size: 32, 32 orig: 32, 32 offset: 0, 0 - index: 4 -player/idle_left + index: 2 +player/attack_right rotate: false xy: 194, 221 size: 32, 32 orig: 32, 32 offset: 0, 0 - index: 5 -player/idle_right + index: 3 +player/attack_up rotate: false xy: 158, 149 size: 32, 32 orig: 32, 32 offset: 0, 0 index: 0 -player/idle_right +player/attack_up rotate: false xy: 194, 185 size: 32, 32 orig: 32, 32 offset: 0, 0 index: 1 -player/idle_right +player/attack_up rotate: false xy: 230, 221 size: 32, 32 orig: 32, 32 offset: 0, 0 index: 2 -player/idle_right +player/attack_up rotate: false xy: 194, 149 size: 32, 32 orig: 32, 32 offset: 0, 0 index: 3 -player/idle_right - rotate: false - xy: 230, 185 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: 4 -player/idle_right - rotate: false - xy: 266, 221 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: 5 -player/idle_up - rotate: false - xy: 230, 149 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: 0 -player/idle_up - rotate: false - xy: 266, 185 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: 1 -player/idle_up - rotate: false - xy: 302, 221 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: 2 -player/idle_up +player/idle_down rotate: false xy: 266, 149 size: 32, 32 orig: 32, 32 offset: 0, 0 - index: 3 -player/idle_up - rotate: false - xy: 302, 185 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: 4 -player/idle_up + index: 0 +player/idle_down rotate: false xy: 338, 221 size: 32, 32 orig: 32, 32 offset: 0, 0 - index: 5 -player/walk_down + index: 1 +player/idle_down rotate: false xy: 302, 149 size: 32, 32 orig: 32, 32 offset: 0, 0 - index: 0 -player/walk_down + index: 2 +player/idle_down rotate: false xy: 338, 185 size: 32, 32 orig: 32, 32 offset: 0, 0 - index: 1 -player/walk_down + index: 3 +player/idle_down rotate: false xy: 374, 221 size: 32, 32 orig: 32, 32 offset: 0, 0 - index: 2 -player/walk_down + index: 4 +player/idle_down rotate: false xy: 338, 149 size: 32, 32 orig: 32, 32 offset: 0, 0 - index: 3 -player/walk_down + index: 5 +player/idle_left rotate: false xy: 374, 185 size: 32, 32 orig: 32, 32 offset: 0, 0 - index: 4 -player/walk_down + index: 0 +player/idle_left rotate: false xy: 410, 221 size: 32, 32 orig: 32, 32 offset: 0, 0 - index: 5 -player/walk_left + index: 1 +player/idle_left rotate: false xy: 374, 149 size: 32, 32 orig: 32, 32 offset: 0, 0 - index: 0 -player/walk_left + index: 2 +player/idle_left rotate: false xy: 410, 185 size: 32, 32 orig: 32, 32 offset: 0, 0 - index: 1 -player/walk_left + index: 3 +player/idle_left rotate: false xy: 446, 221 size: 32, 32 orig: 32, 32 offset: 0, 0 - index: 2 -player/walk_left + index: 4 +player/idle_left rotate: false xy: 410, 149 size: 32, 32 orig: 32, 32 offset: 0, 0 - index: 3 -player/walk_left + index: 5 +player/idle_right rotate: false xy: 446, 185 size: 32, 32 orig: 32, 32 offset: 0, 0 - index: 4 -player/walk_left + index: 0 +player/idle_right rotate: false xy: 446, 149 size: 32, 32 orig: 32, 32 offset: 0, 0 - index: 5 -player/walk_right + index: 1 +player/idle_right rotate: false xy: 47, 69 size: 32, 32 orig: 32, 32 offset: 0, 0 - index: 0 -player/walk_right + index: 2 +player/idle_right rotate: false xy: 38, 33 size: 32, 32 orig: 32, 32 offset: 0, 0 + index: 3 +player/idle_right + rotate: false + xy: 74, 33 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: 4 +player/idle_right + rotate: false + xy: 86, 113 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: 5 +player/idle_up + rotate: false + xy: 122, 113 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: 0 +player/idle_up + rotate: false + xy: 158, 113 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: 1 +player/idle_up + rotate: false + xy: 194, 113 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: 2 +player/idle_up + rotate: false + xy: 230, 113 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: 3 +player/idle_up + rotate: false + xy: 266, 113 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: 4 +player/idle_up + rotate: false + xy: 302, 113 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: 5 +player/walk_down + rotate: false + xy: 338, 113 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: 0 +player/walk_down + rotate: false + xy: 374, 113 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: 1 +player/walk_down + rotate: false + xy: 410, 113 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: 2 +player/walk_down + rotate: false + xy: 446, 113 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: 3 +player/walk_down + rotate: false + xy: 83, 77 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: 4 +player/walk_down + rotate: false + xy: 119, 77 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: 5 +player/walk_left + rotate: false + xy: 155, 77 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: 0 +player/walk_left + rotate: false + xy: 191, 77 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: 1 +player/walk_left + rotate: false + xy: 227, 77 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: 2 +player/walk_left + rotate: false + xy: 263, 77 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: 3 +player/walk_left + rotate: false + xy: 299, 77 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: 4 +player/walk_left + rotate: false + xy: 335, 77 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: 5 +player/walk_right + rotate: false + xy: 371, 77 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: 0 +player/walk_right + rotate: false + xy: 407, 77 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 index: 1 player/walk_right rotate: false - xy: 74, 33 + xy: 443, 77 size: 32, 32 orig: 32, 32 offset: 0, 0 index: 2 player/walk_right rotate: false - xy: 86, 113 + xy: 110, 41 size: 32, 32 orig: 32, 32 offset: 0, 0 index: 3 player/walk_right rotate: false - xy: 122, 113 + xy: 110, 5 size: 32, 32 orig: 32, 32 offset: 0, 0 index: 4 player/walk_right rotate: false - xy: 158, 113 + xy: 146, 5 size: 32, 32 orig: 32, 32 offset: 0, 0 index: 5 player/walk_up rotate: false - xy: 194, 113 + xy: 182, 5 size: 32, 32 orig: 32, 32 offset: 0, 0 index: 0 player/walk_up rotate: false - xy: 230, 113 + xy: 218, 5 size: 32, 32 orig: 32, 32 offset: 0, 0 index: 1 player/walk_up rotate: false - xy: 266, 113 + xy: 254, 5 size: 32, 32 orig: 32, 32 offset: 0, 0 index: 2 player/walk_up rotate: false - xy: 302, 113 + xy: 290, 5 size: 32, 32 orig: 32, 32 offset: 0, 0 index: 3 player/walk_up rotate: false - xy: 338, 113 + xy: 326, 5 size: 32, 32 orig: 32, 32 offset: 0, 0 index: 4 player/walk_up rotate: false - xy: 374, 113 + xy: 362, 5 size: 32, 32 orig: 32, 32 offset: 0, 0 index: 5 +training_dummy/damaged_down + rotate: false + xy: 230, 185 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: 0 +training_dummy/damaged_down + rotate: false + xy: 266, 221 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: 1 +training_dummy/damaged_down + rotate: false + xy: 230, 149 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: 2 +training_dummy/damaged_down + rotate: false + xy: 266, 185 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: 3 +training_dummy/damaged_down + rotate: false + xy: 302, 221 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: 4 +training_dummy/idle_down + rotate: false + xy: 302, 185 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: 0 trap/idle_down rotate: false xy: 38, 13 @@ -370,7 +524,7 @@ trap/idle_down index: 0 trap/idle_down rotate: false - xy: 410, 129 + xy: 482, 217 size: 16, 16 orig: 16, 16 offset: 0, 0 diff --git a/assets/graphics/objects.png b/assets/graphics/objects.png index a1d600d7549e652c6c9259c9d8fa2118cad3f5d3..a893acc608e1567554f5e3d03d7b1ebf7a2cb449 100644 GIT binary patch literal 22869 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 S5^R?Y82oB_v;2n3 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 diff --git a/assets/maps/mainmap.tmx b/assets/maps/mainmap.tmx index 0d417d6..d44726f 100644 --- a/assets/maps/mainmap.tmx +++ b/assets/maps/mainmap.tmx @@ -1,18 +1,18 @@ - + - + - eJylkjsOwjAQRF3z6SI+HVBDzwGIa6BGqYEa+tAHLpCz+G5MJK80Wm2MgeJJibUz6511cM6twdJgA8IXTIyzEhTxew8OiqOh2YKBcV5EjwdoiSeoYs3O0PB/N+sKnKL2Bi7E1ejbeS5iHp48AvlUhi4Xnol9fKZWshSPBtQ92Qp6DzpTpjbqBenH9ZLpPeHJu2vVDngXnjK2emhSWYnPi3x+2ds5zsZ3sN5Nrhdryw/1+n3/yxCMFOOe2tTdpmCmmGf0fwPl7aDo + eJylkjsOwjAQRN3z6SI+HVBDzwGIa6BGqYEa+tAHLpCz+GxMJK80Wm2MgeJJibUz6511cM6twdJgA8IXTIyzEhTxew8OiqOh2YKBcV5EjwdoiSeoYs3O0PB/N+sKnKL2Bi7E1ejbeS5iHp48AvlUhi4Xnol9fKZWshSPBtQ92Qp6DzpTpjbqBenH9ZLpPeHJu2vVDngXnjK2emhSWYnPi3x+2ds5zsZ3sN5Nrhdryw/1+n3/yxCMFOOe2tTdpmCmmGf0fwNwWqII - eJxjYBgFo2AUjALKgQcQC0DZ7kTqAQAhOACg + eJxjYBgFo2AUjALKgScQC0LZHkTqAQAhxACj @@ -36,5 +36,6 @@ + diff --git a/assets/maps/mystic.tiled-project b/assets/maps/mystic.tiled-project index a107de7..0005154 100644 --- a/assets/maps/mystic.tiled-project +++ b/assets/maps/mystic.tiled-project @@ -20,6 +20,17 @@ ], "valuesAsFlags": false }, + { + "id": 4, + "name": "BodyType", + "storageType": "string", + "type": "enum", + "values": [ + "StaticBody", + "DynamicBody" + ], + "valuesAsFlags": false + }, { "color": "#ffa0a0a4", "drawFill": true, @@ -41,6 +52,22 @@ "type": "string", "value": "OBJECTS" }, + { + "name": "bodyType", + "propertyType": "BodyType", + "type": "string", + "value": "DynamicBody" + }, + { + "name": "damage", + "type": "float", + "value": 0 + }, + { + "name": "damageDelay", + "type": "float", + "value": 0 + }, { "name": "life", "type": "int", diff --git a/assets/maps/objects.tsx b/assets/maps/objects.tsx index ef674dd..37acace 100644 --- a/assets/maps/objects.tsx +++ b/assets/maps/objects.tsx @@ -1,10 +1,12 @@ - + + + @@ -14,6 +16,26 @@ + + + + + + + + + + + + + + + + + + + + @@ -43,4 +65,17 @@ + + + + + + + + + + + + + diff --git a/assets/maps/objects/training_dummy.png b/assets/maps/objects/training_dummy.png new file mode 100644 index 0000000000000000000000000000000000000000..e77e1ed84cbae3dd7f86f81e1f086e3d855752ac GIT binary patch literal 900 zcmV-~1AF|5P)0vU`f3K7Lxdcvaj7B9ij!KU2|)?hE8a6<-90WBRJlP*~VolMAZ zkWD5?kfj8qElW{{6Ua!DJlv!l0w2VURS2*5NFA<+l1j#)?-NQXmdRkr43^Ab$qbgv zWI<9o#1tvM-xJ(|$pWNwh^ZG(A5kh-&^oOKnv{<6{hnY!26K|qA*SBEdQQ^L{vq0l zyNi^LVg@N4G$|b=rK3nNxC0yZCfbR+i}YG(+-2(U;pS%6m?v%U9_H?N*kDpwc{`jpBQ(xh~V zDLxW>fk}dt4l%`Nxb*_32bXN`Jw!WkcexmzqaAx~5|mdPe(VjhU_~iFL(7F>#0fK*-q!jZxW+~=#1Yv|W8uZadgFafP)j+fE zO=+G@X$}Ll$3O8&cVaP%NlFk#6!SU0q*ShuR4P}{w)fg-UTut9FYx$vK#Cy6B&C?o zF-s6e{GStd7tO7=i3#Rla!aE@pHjI(+OgLrCW!fd4^2u3&G&nxnIu&0jA#z0s%mGL zr8}|EI;{p9_9iz*gFdBlg&V%#BgyxBe2zg%)y|0Ka7t1TMsz0@+3bqQW>>_q*XCk) zPEx1U;Mi*u6D+_Wp*ftQZLM94?!+PpBed?sBAZOZoR;wOcp2jNLB3&+Sb}N-HCk}@P)7*)Y7{qw~6RjkHuw1vM&gT*XCk zq`Am(6;<6}2x+N&E9moR{vqwA&4eu}#F57Mk)}-8lER&v8DG9xud-k1Yf7k5lH)20 zailT)Fy%7GRa8-90BNawE9kR(aLiTwFeT`E_+d&MX+~A2q&U(TewbneT@NGZddxrj z0O2w1rcG5fhS)tg##mfh#t&2cFeT`E7}K*Yre|AB&$cjvu7@9{_+d(tX+cRfuCc%O zi9*oz7$)d?R3#WfS}I>$T4sA=9iy=@$Jdp|408LyOOi|rDyVUd?TvL#cGfuAS;LrG z-Q+4$tDB6X&Janag|t-8CHLO@OwOE9I6Z1GDnSX-QaR@u3v=AMTgRB3Im0+TYViH@ zPtHE>lVn;@fuJO5sXTex=P!qQ(7I1SK7UA(X+Z^bMs>J{+;~B<^oA!pD;Pe1bbuZu z3Cih6OTBA1Z45t5F_KI_Ww0J42+HYDU5^q3<#i~p$Jp4|zv4IArK`W_v^r)00000< KMNUMnLSTYpz5*Tq literal 0 HcmV?d00001 diff --git a/assets_raw/objects/player/attack_down_01.png b/assets_raw/objects/player/attack_down_01.png new file mode 100644 index 0000000000000000000000000000000000000000..e5c8aae32f4f8497b6dba5038190314002de50ae GIT binary patch literal 746 zcmV^ z;5okOwq2SnA8R~{X|{Z<@hB#UQj#ndDmX()p5vQt+ojp^$t}4axh2=*(%FnRN6w?{ zWBQnqYE;l{`Ai#+Vx~1)K2@Ee1kdqJx9zgzdgR8V80+^mWy$r(T{@fb=E!-JeM}!y zLXDD|EuY+Y6k`QZ%B*I~r-~Y<6htXuzefq+6f5lau)=-?_Yo5$}a)K+g)Z|+;~CGb9}>; zB#VUtVw5Nfc#dySjholVox5D;{MBQu!-EFa`_~^h-rmL93I|NPwYo+w$zox`s5&P| zvRF{wHl}g&8nez{J?8MBf%Wd?6RZoXYdn1V6V}&XU12L6kh`_IW>85M3#vv*NfyiT z_Aa@@g9eN2zS_sy*&DL6H)LmTh_w|C*a`=Dj&D$66iO5ec#dz99|!#Hw^z`)&NT1) zHOe~r<1JR53hq4p2J88a4ZLUfN$&mto$E|XvREj`pz4&fo@DX8=lguJ|1AmNJ-h!i zs@rz40{*hjC!3TYMlm6Z`PQj!lLAIDAt;pTQ{R z5GIVGfGAGEC<=%|2~&)s1X0Xk6eWmaLYQF`{~=LK5egW^zep5w2q!R#&mf8ggo=z} c0Z~-&CngyYkEe^EEC2ui07*qoM6N<$f>Nhmb^rhX literal 0 HcmV?d00001 diff --git a/assets_raw/objects/player/attack_down_02.png b/assets_raw/objects/player/attack_down_02.png new file mode 100644 index 0000000000000000000000000000000000000000..123692747c5829098e821f1859973887a8e35ff8 GIT binary patch literal 646 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=hEVF!_4AIEGX(zCF0#TRM>8z{mI9 z7n={<6=FHLFqnx~(#cwTsk6DF^T`{!uI%FF(SIh|FKBl5I=XhU#hh&QletY-Js(NU-J+$!XuIdGzSkt?Tj@^YT1Bu^^(z6R0Kg=p^qj zVTl4A^SqE8u5E`M_N!m4a}{L0otTj4Ralt2cJ=KHW@bwsQExrwzw=x^H+3Web%Grai)t|HeTi?2NO2}RPc}BFhcZ(O7+lk~88}H0G z^5&VHz5SlV8$kM2>h@l<%^O<8v@|PR=sbs{JsjG@caww&Z$YN0)tCP zU1HL6ec$l>9aghb64DZRbwh#@6#5&1)^6S)HhD(PUzxYBawffe#hYm!zh6*G^Mpb_ z&`l44{*M3SG2hzWuYch`rd1B2bJpuis``Cska-rhWUk!fH|q|)G>q(E(X2ePWyklj zYQeMIN=~ZxEqAY;FD)v4_Hn;hdD#webqU9WWv*q`g-s$86FLsWa2H$O=@wRTY1+7P d7nr^nJYD@<);T3K0RUsU9?t*( literal 0 HcmV?d00001 diff --git a/assets_raw/objects/player/attack_down_03.png b/assets_raw/objects/player/attack_down_03.png new file mode 100644 index 0000000000000000000000000000000000000000..4e8340e97963f08b4f79c8df864a079f762e5848 GIT binary patch literal 539 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=hEVFh25haSW+oe0$I^`$_=Afsg-B zZ{>|S8SUiwDPy_Z3R%86Q=8%+6r2#BpuM9*qmM85rMQ4BlP+J=g>@!gH2c)kB)MD5z`dcR$CL-+yP!`gNV9Z^?Qoy}+wc4?G??{8}aXh3SyTMJ;Y$ z3C*a~g`UOEq1lbieAAY!pXI2p&?Az3*TLu-uZnlEX}kKrs@g2G4No2dg`ZDteYVFS zXveDrN3apQ8dKKjn5@-5c7azV8AsS7ig?tHiisQ$x@fLYR;RMgJ$rY@X$ zg=g9+r^{Z&&f4BdQISH$pYLU#xNrP|b;qX-0av4z>{L9<8!2=-D(>axJ(toem-+*h zUAi;jS=*{>Ox|*Qn^c~aZ&Eon^+4m7(BduIkEX7>Q{@D7JTt$0_w3z&PCa_2H+e=P zQ+WJRotWQVuYV*=v%h$75=8CdtFLY9zc>DDHIDksonG_r%EQNht!?&I&ra9BzwY|- zG-hu(VJo{CPxA#VChW^vwLJevW7JA9t3$SmS$x=F{$$Tz!B0n>Z^#!O6kunv zcHTF6-z~W>Oi`J6E3)>g)o!(Y!Mf$roq(%Vz4B!n6gC(ixyvWU@~!R0?Zm9CSM?ux Y+gKOIyL~T^1x7l9r>mdKI;Vst0IfLp%>V!Z literal 0 HcmV?d00001 diff --git a/assets_raw/objects/player/attack_left_00.png b/assets_raw/objects/player/attack_left_00.png new file mode 100644 index 0000000000000000000000000000000000000000..acf58381fbc352a017ebe47a9fa16c4c578b8019 GIT binary patch literal 4589 zcmeHKdsGu=79Ug)QIslDOVy4+T6|10Gns^BN#j05syJ}T@Ew1lJL0cbHTwSfW-vk6a?KyiqXZs(?nas?6 z{JwjC_ulX1E7K>$1qOr$KoAtD)uw@&CprdXkBanDq{2);a^KL4jfo==&J=4 zHPr*FOW`Lz*Mzb$yESDm;sX$4lj71QRz;E-xYOG|c{$u8mO(%TkA;&hcyf zeAnIS`(nZ6i=l^FzF8K$xOctilSi1(6L-mU&yIadkj>e>o~$kzxAXc|NlD$*#HITUA++Q4nFoOm zhyRpMA_^|vyjXJgQk&w`-FtmKP0ogQA=_=xb~!9)ubH|jByG0}DU;pE2y?9t(033N z6_e|r=nRH~jf{o0DFpZSd?$celR_{W&R4xes ztPDrNxz^0#s6oQ#LJ*>1l8JG|fLKIQwvN^aQIslGxn#^RP zYElOTcvA?{InF_fL~gfR=oSm@PKyYW%jF^z7vVSpED%?ojiYiAn=6cmXva`7F51aD zIM!~1c}&V^&*l^Y0no!QSRGzQkmVO;-O3cipB^+iUR;MW0oLmA_+NxqH-}Ik%=QQS(njt#_0mR$fIJYP%QOo_`;AN9Y8I` zcPaqz%0V`y(#cSq-D$AfGZg|pD46%`RO`S%nJA7@Q5*w6QCvczQWBLJFd0eUBqkn* z;w0M5-fm*edH>6rA0IfXz33X&1=i2=irQx?iOFhzYk$pTy~6~<-mxGlx;+IKmBX04 zaRRJ%6`fAmEDYE`IvVz+oc*0s zc@4U4F~F}~2DUD+6N);w!VbPbtbgREqYi)M5-{Ae$ZPT2Lst)7uf@P?8TWKo4_&Xt zz-t-zbl3llu7Iw?6k`MbfZX7y#O2hsfMb@QF+NTOz2LuV>NhR}l70?NvI~Ox58*E# zsA}afAneO&b?Uyi{QQH)4h&me^c0+>S7=qShMAr_A8(KEl@;6&bGAguDHBzZbM-R+ zi7HrAkXBKkS+@{=9#~7LKU?!;kY>RaU86OyDab!m<7m9*Y=r%!Ei0C9aL4Q!wfmm) zLcyR*&5tiVtAA&g^U>v-+e0G?K0Yutx_)EcaNni%|A1@j%kA-4)BD!I;>qjB4Y>M- zu5I?`b7%V-zn^?!?+vJ|<%grvem=uCx)UqU>`zEp-`LU%ZK_O2sWGhm3pDu*3C)cj zIAQeccNdvUgU%ccX;B=bSI#=t(65iOPwA-B^Hxq?pYc_B7_`hCRViFz{gBHWK+RMC z3oa9`p~6GnIav4YmFZimo({U7Q$&>~J!!7NKKs#dw0usl7bAb#Qy7|@snpbb z5wl#o!f#vAV_9o>^`b@kPk%W4IN-2qRY72!UfZ-e`0r40DjD}(_5A0S^|e19NT^GQ zLw&CoewsRQnY4amc*(jjNZR@nlmnOVa^AeXwPnb|r(Z{7$BQCB-5{+xK~+65t@OVx C_?u_| literal 0 HcmV?d00001 diff --git a/assets_raw/objects/player/attack_left_01.png b/assets_raw/objects/player/attack_left_01.png new file mode 100644 index 0000000000000000000000000000000000000000..7700bf33bf5f8ab4004f96e40d03ac1bf71a4a44 GIT binary patch literal 4712 zcmeHKc~nzp7Jm^Hj0LGI%4TCktYDItmp~Rt6-fldAOop@qVkgW5?>*USxAC|1#RcB zSaBQ2VF35Nb;DNNP(%e!TSe3|QWgibRs>N%rKm993y5&qbLM!?^gojG<-PBI_x`?n zf8V|LmD$5gj_BQ;X2)#6uWuS%*v_vV?_lcc3dj4?p}1ZcmKYdNr`SVmaXl4bWu3g@5zx_ zb9<1J*`AGcm33K!!&S%Tu7xx9e*b*z<4LMt`8!74u(m8NO;iC3Vy zD5u1bd3iZkE>W55{Yy@HxVLK;*k7FR^VI}TCy&+pA&Bw?5gHmD5gPh791ui7`UX*W z`E2jY%NBnt@u#}GuBePIY>`X6Bi(Y7cARiqWP(q1j?L%#PG_!Lom^IyclqF&+~UJd zhgZ|OC{0ZM^wZ(ly^&OgJedEa;>^mtGvnGf zG=C&CQt4i-^I7)t>C@-Ti^X-<-v~zEUtI>}&GuI0YsPDxuWRx>AEq}s2jn8p1kW}{ zP4HcH|MdN*UJp0^xU|Tly7-Z`$@y4xv;07ALPA`YDy#hX&X`i(!=pb~bBklXDSjdP zZS0y+rm5wo{CnX^V(L zO=G?1@Tv&d*G>>t}G@`30GvM2MM*=fXEvWYLVf=OE2O7Hx zH9pc>JEl3~#x&_I$>R1Ko$k38UU{U)PMTOcs=KD3q4pI&9XfvNcDtia=P-ZE$1Cd} z)Mq|v=n>s~(q>S zgU}+P+i->8ofNa^G@FVsSwxSQM$F$JE2sdZB60KCS~&jR3sWkGc;HWOy4)vUo52BRbufb=``hZY7Is8Uu8 zZqSzSIOYAgLnWG z;V}Z02v-oO!~`hDwLxJD;asg=je_GO)Tjz)=`C^r8CZvwzv+Y|=17+}{Y1FZ{mLe@Yl?B|PYI)CD){~Z3r9RT$3Chx`XFkQoRy%z)Tr97Nn z!*snD1Mj6goL&Dnx~T6iQ@95F12TiF(o0@K9=K+WmPdw(p@ImZ2bJa>7Wj z74uvi#3d8MPwIO!w$c*`Lt>KGvyZA?+qu&h75MHxcDC8K@T;=NBeFBIG9&%(B;U^$ z&2akiSeD_5M)~;<4SU*`7PtJ%qqOm5dPjrT)}QNo%r3aosdX|U`9FN;nt2yYyKCbY z-F>mdqhp*s1*-3<%=u#LC`4vc6x{jGH+a8+zd^>CW9B=Qun~-|ol4~JMEeZoJRZq{V{jFxxR{uS( zW-sjojutg$Q~b(0YE2(p_v_wIjXV-Z>3Y_BAgK9f~@ zMlYPXs@?jE%AXcid$W3WMc6*bdzIi`Xxjw~E9Kz!2SWWc;keUpKJ4yoo7j-k(rEHI zFez|bds6GFgX3?X2r8(~`mSNymGrB<*yWbCbANf7CvIMO!S`II_|V-Y_0qjj0UJyo z`57)?H`gtx+0gvpT4}e@Qk3BKPv5Gp4=?NvsyYl(28xhGi4V_7TK!*FAnBw4 literal 0 HcmV?d00001 diff --git a/assets_raw/objects/player/attack_left_02.png b/assets_raw/objects/player/attack_left_02.png new file mode 100644 index 0000000000000000000000000000000000000000..01ae758a1e418d196831e46dc9dcf5c7c176089f GIT binary patch literal 4568 zcmeHKc~BE+7VqeQ42&)#pyKFm6Lki`PP#h@q$5Eg2?jBk0aRFZ@k@6n^g<4k#sDJ< ziU&uDJ32ax$Ec;{RfDVOuwp|JQ?+H)&VMA8 zKHl;B-uu1xzRFi>OrA2>f22QxAcGV2+7x(4g`b}l;4@Q_-vDV#;2tQx9^;Ei!Q6<>&*77 z>$|pd`{y`^6b-}X#7%gwVKaSp^Tf;J8dASVE@47iVZ20Wz%=BltC&8HX$H$jz3ywYgs>EHAzdl@) zF}6~)T_@g+9=3Q+g!@*nj=1spI{`n|?i|?e^Y6%vVe2oiNJkJ+38&E*6E&JQ>A)m5 z7XC@C_e>sjB6Id3U4;Lz;Q9YBZn|&MjYLJxj(C4BX66N?K`qGXhf6Nr4Y(07Olggv+qS_3$>|D^m;EN3xO8>h0)IR^$ zv)aRo!Ya@RQj=sJR^u3*`K+z&iR5_AcV~X0d~Yo|hEz@-MOWE|+5^wnszx>y-Uy5= zCm&J|*Cr1iyXe-DTWudSefsSmHiw?Cxs!h*aKG`cX?J->#;lc=m7W9JQtG3d{&G6M zye8$#ny2a?1D5*aj`QSJ-PF%}H*q^UIev6V8W6|tomy5bZ#g;l75&vDouqV52=1J) z#n)$B%b<>>*BVEjXg;_mxME@=pu}Bt?ju8kZuX;d?Ze8yc^O)m`r8rpJ})k9{Ql}oWg&8);o_sg z4u{{gb>W{h-fk>z{ryCrU!#O}0635uemI4LDb3|e5Wd>aq)Fq>Ut~1A*4ns@X9M%d=U2s*R&yrIT4aRN{fdUI> zb$GoX*?lZ|&fG&*pV$PAH=W*rK=*FkKGtt?_ZmYhgF&UW)44);iCVQ-SYO51X^v5O zA90*eP$ngTnUxBF$)f>lWfZ_j zB8tG|1g^w@Opap;KmvkRFd&MhdqGThaLV?k^5RD>Aj+rPK zjzyCsP%~2?&Dvh(UsXP$)B%pCy&bQ9j9L_sTDC!*x6`(s)aDfFZCgCx@f!5n zVxV8A3~pU;CzN(?g8iu8xB`UkU*xU$?We1suD4>~t&ID-tDmm7V&JWe z`@8G^MwfrjVT!fEe?V?{R4S~M6~SYcuPJGY7U>YaTk3YMfs%I}`V1F>1Oy2`5mL2r z1QZV96AijScYOT#qYlYITI;3_wzZ+#T| ztnTmw^y6(ElC4K3pK2zX8yQ>arU6-@bJs~%DPzwSo@v?dQv{Mf3)9Yd%pN+b8Mkt+ zf6IriqPySTzWTXXq&#|U+4(&I_xCRY$)dIdQ{|V&kTRdMtwTi3(UC~-z0v{+-FY zSpJUo`o-qL>wC+l&Z=lAs|!5!pUk?CkOMms!dL3w|E|75xnTpcaPcSvfBEXl^xyfN z{~^CBbQY5|c!!@@bb05q%gMI`E|t%3TmJOLmW81^g6pzpR|V}J(7NJ5L1pWcdj}cB zGpY9W+zC6@#{0eB6xsO4MH?Q74(u0bB_3(;@zw%3`KdPUKUzzr2a d<6g*K_ym*dt_*m(f`BDL5_QSi>iBs}{tIS=k(2-c literal 0 HcmV?d00001 diff --git a/assets_raw/objects/player/attack_left_03.png b/assets_raw/objects/player/attack_left_03.png new file mode 100644 index 0000000000000000000000000000000000000000..0234eb06256dbb39f704aab09b9a0bc6a642d8bc GIT binary patch literal 4521 zcmeHKdr%bj9bZIw7K%K5fLYEoMP%>xUT}Nm1id@tki#pS3Sx?TyL-n9_wa7v4%G6H zOhIe~677_LMH8!(1}k9V10UonWF~Eb#*8hEks>M4iTFa|tJ>cl?@4Al%ryUTH+#GL zeSE&(@8|dZedm5vnzXfkK1+Nc2=Y@UE7HLoW-l)f@M|kB9sxIJu{M)Q$L+AiYSz>F z6wDM^D4254dI)m#88xc|ov>Hu!#%53yZNo^5#35H=^e6fsH;-jyF)Vd%G{ToIU~9K z$KIt+Y_a;6h9X-QW-dC`Nc4UZ@lD`^=Cq?1qr6Rvo2k1Ax9^J711#&2}W@O2^8TMu=FY%V}gkNDP$UR}ZcO?h5d*S<@C++E$? z>fc%pKXx17N>-dnu6nu72hqh#hI`KL*mu@m`au@8=W>vH@aI=Qt2$Nl@o}FQn?@o_ zBlp750{J?9XuBmM=i7Vt9&tZx|KijCU><|zUC_S7aH8H6Xb$+)RKH|s*FeC^YQcT% z{#$8bul{oI%;3GHLv?@q#lgi_+HVyN1f0;^)-_jWWo@c7R65%Zr=O1-`tx6ls@v1w zYaf+8@!h?k;3v+4`kTpHy;bkRiEAQ4v^Zx?OUj-y(Vd>xpA+vVD7jTzLQrc=lgEO? zcRXM2zHxoYrLQ~Q4BqR0j(6Y@-|exzY@@U7{63_mVBX_{Wh+nKJT5Lfz5dG52xRB{ zADP_4u0^Q(+`0DB%Rg0LRc1f9JQ7-c@!8^C8Os)(U-0x=!HLSa=QYT58?;>^4caSHohl{FMlMd8brjcOw1B>Yp!fub z1t;<-2G&sq+9c!LJ$r!z)1-{ENvuZI7CDtmCl_0(jN&vcQJhC$Bqw2&PrO440E`ra z!wzG<$tHEkI4)c%cxJ^s4(u{v@?@M$wFZ`(trRTcinu7EbkKzY&MF@`-b(7F>58Or z2=FH3HCqilK89gDRKODm5MY7WicAddKuosfEW{Xwg0c}-+QQIg z6U<`bI&%Rd<8Xi;p2*K=QL886O}23s03SRDZsGB{D9>o*P4}=d%0d7#p3wJt*tB4m z^3o}rxxh+L%0kM-ET0ZR5|jRx0&Bjj9FpKs`IHfu+CWtPjF4+pYR#kvOM!tlT3lX$ z>=~8}t)C)mMsBReRnGK8fcqrw4C{&7UBCg5hqB! zh|=j1R6r1jNF*T<443c`3X@305|IEE>ab~0DwB=DO$5b40dOu2a8Q)M`M3l}2tA)f zL_$)BNJv7A5Clc)1+hY*PS2kPvEE99uEg`FXT?I1016}dIED!+0DxhLNH4|_oXtie z77E3Df{#h`5*HLnNR!M~BMz36HsS_~XE7OE3YKu`YK=<95pdBdi6$Rs^uPh^0op{G z?Y1eEmNrru49@b&j}u`c6vf2+SiUGuB%U(bNLg*57gufk1>4x|!%U zv!1czR%*2Y@Cdj94eH_wjv8O86*KMaxfHt&fHDM)MW!g@b9m#$^4N(nQEfc$JAA~u z45p13;5Q}%qYF$z-sC78=ZhUWKj3G49e%(F0D3OStoWUyYmTm2F)%CRx$c^yYgP=* z%6P83{%>^oOdX~u6Zi*Y2S=qpbT@$$G323Jw^jkYWWP=4j=l*b-j?Jn8wB|Vv6mZE z->?V>JsFi+>3Pe;DJAz6-w8U9T&Y{` zdq5RM9Uo2I{bFl!3HleIUjxi-zT#6h@XEFB!c|9qeWyVYyQiFwv=(c)& zXfVIzcl)&qo89-PY_C-`_U}hd?X0)e&4)TK3_rX-dir%=$mBa8dY%_i`p&~=qbc`4 z>A3mT?q@c9bgxcbVN2AOUEbDva>tU?51$Xb-P6+f(jarYxZ-YOtg$Ou^B%nvL$?VW fzw(bLoR{0|Wm(jXMy!47i1-T#Xns`XqE2 z6tV^(Gb6dK)pW5OA5Xa&T_ov)&}C4X%`t2Uh7G}=h7G~kkmC5KUQunoN(TvgBy<^+ zW^;67W+ZVW_=^fz1EI@+4pQ7ftLb89B%xN*#d3T?g{*;@k;IXr53Q!lb*-k0<@ngO zBB6Y_0nQf+S%Yqp^hi&MO3u^?S&q-xkiv3&>{^lW$tgxg)6C77)OQc~dU}qhT#XJA z^uf$XEXT*L6|o#2yH+G$ZV<_r8-zUNYIKp{j_g{I@yRJ}B6JzhMUoz=wqHH?eqOO_ zMIs}kX4R$f)i>|HRZ34L37ww&U}Q8+==frs}s zyxGpZ5fErxpqTlFm0g^@t%U2C|Awhv=FfbtJY#JV{=@W8%8}1hua#T&`ck3oa~4Y`miMcpxUb%oW?2 zwwwLq9D@&Wc}t_ey`iOK-lL=xwB|v4Kzf z(82|7o)i1w*c zsz6WNJve8@(pUB;NW?aho?qQ_7qpje^gN^Nz zZtb(HcYF8SKJLSZqpI8Us$*vEd2(C+{->2|f|J=*w}u8qbKU!A`|Mh7f9}4_|1Fbl z1x-9I=9N_~#Vg_W?8(00KgB@~lFj+_yg~c2;QD2ImP-VM_VU7299t~8Q^lCcLdjgV z@aYG;?EZ80$~-loXjpTYt)EGCt8FhEk9u*@(=f zTeXut51ien6gxGR-cXQ{>DPs5s(I5gY0Y82Ly4{dz_`!<_qTmc!HN@BZxm&?Sga%3 x&wE(pDBd`1^@sn^L#d{&HHS@G4)=2XW41HpbKvxxp8-s#44$rjF6*2UngHW?Npt`J literal 0 HcmV?d00001 diff --git a/assets_raw/objects/player/attack_right_02.png b/assets_raw/objects/player/attack_right_02.png new file mode 100644 index 0000000000000000000000000000000000000000..ce56a51bceb554c605aa3c0470709653786c9f79 GIT binary patch literal 589 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=hEVFo}4&IEGX(zCCE@EuF~F@bJ6$ zIysH+ymDPnF1Rv_wFih#7s*_h{kZ5KgQueXf@JpAcd_dg^4w(y^@TUdpqYSUEe*;Au8*y-le5yKN}c*x-ZP*_$us>=phS%CkiJ#Uxfu}OQ)Qf zbaX+S`GK#>Kv4~?NzGT*rX-h6EOa)?^Qbe;^LTbF$twQq*&jx?oE#ZlgSJoVz3RFy zd792AjSu2iPO$}T7ZSv#!DFkADdkCmXJle`smO?JcUdJUt@X@MflLQAw4b1UnNeYZ1^y zuq>Fk>Na^_)?!b!9_GeHOwONVX16ZoGKZM;ZMl9$pYQ!AUwHb>-(B9mEoswbE0ujc z+X7Sq6iT&!{&}Z4bLMXU4>Gg&0rkv$%+DSo?F$Nl1%@rv>-%QTxPHRtsNGCIZv&o2 zrIpc~E2H_}85pj=XkPle$!EFhjvKkc#~Kybd0i7_ID(3%KS}u}88YqU9GN$t@9KEm zdJ?KI-|G76$<7n+djv&m)`h7r&HnW8*G;*p-}PVaspz{`cNoN(yj^DQJmGk^^^K_s z@~lnTDw;t`NBK)X-E?bwz&}ZZxkaEqU~{k1LDNYh;R2d@9t$))4IP$9Nd6SBVb-|6 WX;$X9_HJM@VeoYIb6Mw<&;$S@Vf_dI literal 0 HcmV?d00001 diff --git a/assets_raw/objects/player/attack_right_03.png b/assets_raw/objects/player/attack_right_03.png new file mode 100644 index 0000000000000000000000000000000000000000..fe20af2b90277d9ddf5f2c89c136b31957fcea5c GIT binary patch literal 538 zcmV+#0_FXQP)(FJP}cs3i!c?^#MH_LK-|Vhjh#nd;XmV{oZPm;CiC6M5 zk>MX`1P-q4r)bErhWRYUEBPq%SxguSlt$p-m3&O(FfgCR+%=!Ygppv;FWyBNHFO) z2_wOz-=x+VvQ+B~Q4$$jXv(mrNx#W{rOMyRqDd}9Z+d;(o%EY56?TifY&~V^=)mK6 zG(|2%4^3GN$c5;goL+TXhZU5YuU{za7EvzF&!}~VBr>)zkYf!`-d&(Ce53FcoAcwv-KRp}2f-!`VKxqUHO2{v5V1Nb-eQnGP&|qPvjh+D; c8yo+NAKF=*4)eW_Y5)KL07*qoM6N<$f?xUa1ONa4 literal 0 HcmV?d00001 diff --git a/assets_raw/objects/player/attack_up_00.png b/assets_raw/objects/player/attack_up_00.png new file mode 100644 index 0000000000000000000000000000000000000000..4699d0c9ef57e2ffb5acc6dd8cace6f1e49c5eb7 GIT binary patch literal 505 zcmVa_q)<7RNKNcfkVgShsJz|qv4Xl{ zCK<(8(Lj@$*rR|lj-*g|yWtbm6*XV-tC}yV`I4Jg48yVLnoNf{Dp5dCS1c0L6-AYC zAce{|?=^AJy0ylKFVn8cbcllze_07f$tcD}GKwjpLIKGr#tQ0+dC4ed8D$)pOozj< z=r#j^HPM=h)=ac!qBRq(nTZA(%VavlL5V-$&D%qyP&p3DI5L?Ihhxz_J)hDH1oNVS z=Jb5Z&fY%i`Wp8)AMpCctFFm($O07#s&2H14*JZiZnU^K=wrP*`pEj7CN3&0;p(Gx zuHC+1=Io@(*H7PAMu{bzomBaq-R&)ksNhHnm8VY+v6AEWSf7vi=>|ypq$c)ux3}`0 zy?tDGIFdr;?S_x_^6nEX`TQ|fyWukv4K%5VJtkwQIdH+-yUps`XD vKjd;f9C*0tP+SiO9_~80>#?%3@~`*~m#mtN!ZagN00000NkvXXu0mjf>P_y? literal 0 HcmV?d00001 diff --git a/assets_raw/objects/player/attack_up_01.png b/assets_raw/objects/player/attack_up_01.png new file mode 100644 index 0000000000000000000000000000000000000000..01062c9db8325be100cd00de3ae7c2dedf3fef02 GIT binary patch literal 607 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=hEVFsXUEIEGX(zCCD|EtM#7;NySc zDcmCZ%_$!@i7GboZJgjcfiLp$l#SjV_73|U_B(0DGV#_m^NDXtowRG|5fLuVn9Y@X z2M=0v$%);w)1Ra8=;ci|uY>pdw{ETXjhOhlqK)TpAb;Q*hloQOLD93VO;)R}DLR^* zbb){4AB8lFSBAbK+#HfUNvEzo<2#$xS#(tS^aA-u?1qN}`y&_4SbTtI@ri(S6*@ud zDg^Er_XlbO`UozQI4T1)X^u(R$<$p*KU5ES;7f%fzL!da<83ETeNBbjM;WlZ!zZAPWoFtEm7-l|R?%y+BTm51*y*>Bl41+x>rV^E1=!>f|-YcPm{x z-yR?Fc(q;_&?+G}(E#_aY}Z_upFQ|bPx$)w?^ojXJ=o;B?CoB|{&LqfA48{WaJGty z1Oy6ky;^b4V2PepF5kEEjX>(vSGKT^8`{2Bgr`*JpSdpt^1}=v)rCN65r6KFGH0>v zU#9^z&uN(xbKDphx}5eM8y8Lf9gTe~DWM4fB#9Ay literal 0 HcmV?d00001 diff --git a/assets_raw/objects/player/attack_up_02.png b/assets_raw/objects/player/attack_up_02.png new file mode 100644 index 0000000000000000000000000000000000000000..e66c6f3e2fff59ea2aafc13b587d8313158240d4 GIT binary patch literal 559 zcmV+~0?_@5P)0D|HNXbTyXii@Lk$n5G| z5u^@jp_INXazih4cunQ?UWx7XNc5ehNFl!;V`FzsP>>9jWrW0NK|z87WTq9 zrbvkt12R;$UW>R%yVD~vTHvWfj!iLOQ~YCs44Yy=q{xw>vZU&@h`e^Ehm#mBC?H@6 zkz$1M;vDUx6Y|Q7bM%i+kfE}P(E?8a12%=H`^|Z#X8Jf6=VhF)AHH+EvxKwIJhX|? z0uLo}M2aC~s4PQF&Gh*j0Ul(i?D5VL&eJ#VaW2lwOwIJkT4)~PBt{E71>8V}%90U3 zdr5ry7U$C`zdZ!W35n5y0s=BbiVPVlyV2UkS!k~E)2lVE$o+Ma7-N4@-V`F3giyuvisKF;rgLnV{002ovPDHLkV1ggB0r3C; literal 0 HcmV?d00001 diff --git a/assets_raw/objects/player/attack_up_03.png b/assets_raw/objects/player/attack_up_03.png new file mode 100644 index 0000000000000000000000000000000000000000..0d796691b9f18f905393b2c67cea3bd86ffaa201 GIT binary patch literal 432 zcmV;h0Z;ykP)Fvq(Ues56If2>X3ZCfg>6q^0rvM(3;`k|2VX#uvF_kY3_jpt60E5@q2XV5t-h%h74e1A!GamCntf64mdidZu?@c8u$cK6l{Zm#DHzJC19 zCK3W^Y5e8s0b{#+Ywlg19-yW1L`c}s&GnprK@dSp?j@m2&7gewWRVltWh aFMa??3u^fBzWXQu00000vU`f3K7Lxdcvaj7B9ij!KU2|)?hE8a6<-90WBRJlP*~VolMAZ zkWD5?kfj8qElW{{6Ua!DJlv!l0w2VURS2*5NFA<+l1j#)?-NQXmdRkr43^Ab$qbgv zWI<9o#1tvM-xJ(|$pWNwh^ZG(A5kh-&^oOKnv{<6{hnY!26K|qA*SBEdQQ^L{vq0l zyNi^LVg@N4G$|b=rK3nNxC0yZCfbR+i}YG(+-2(U;pS%6m?v%U9_H?N*kDpwc{`jpBQ(xh~V zDLxW>fk}dt4l%`Nxb*_32bXN`Jw!WkcexmzqaAx~5|mdPe(VjhU_~iFL(7F>#0fK*-q!jZxW+~=#1Yv|W8uZadgFafP)j+fE zO=+G@X$}Ll$3O8&cVaP%NlFk#6!SU0q*ShuR4P}{w)fg-UTut9FYx$vK#Cy6B&C?o zF-s6e{GStd7tO7=i3#Rla!aE@pHjI(+OgLrCW!fd4^2u3&G&nxnIu&0jA#z0s%mGL zr8}|EI;{p9_9iz*gFdBlg&V%#BgyxBe2zg%)y|0Ka7t1TMsz0@+3bqQW>>_q*XCk) zPEx1U;Mi*u6D+_Wp*ftQZLM94?!+PpBed?sBAZOZoR;wOcp2jNLB3&+Sb}N-HCTOR-+w~eEFhhXW`dh3K`inW32n20bTXQWwppNU7O0m}+Gc@zDWzUY zsh3hRf;k!s2!bK=>ZO$NG{sMJ(KZX@s^ub5wOl0UCo|@0EQz1!qFzcFPgA~5XP(9q z_=zs+rIc#9$aN>98DFEZMC0it^ZZ2T=wJuKvXRbCkC7awCW2t7kWpEJdv{h9Khcq@ zT&7?zE6c6v-M2!?2U1IMY6 z5k0p_qt)RiM+ZB^QHWvLNL_D0&uuD>Q$yw3h@RV|(dr<@QAjS1LZpk)Ifi9pST=DK z()9-P+@``6jU|br5W}*O;wZ$hY;tF($23|U49iC9dIO{&7^1Nt$Ek^)+oaLz5Jw?~ zWh0%P9wS|h&gpssyxj@uUj_br@ru7!ekK3RdsPLH`5opUidr|S)P`}(;8C|z%W^mMDr)?JfF zFNWwp&5(j%NKR#O;@N}uteYD&S{>HS4ZPh6oA)0IzEHTv?N{)2Cpb<`a7AS?!rPtj z_~ja(C%>?H{~;gW^>F(Yyxj>I0f?ttRqm93;L(dA83j<>eua4|3v&AvB)4CoZ5DX^ zat+DtSGa-T3k6WPqOlkS5N)%7G@f1pIvFJhhB!`*jNnSWlu|7hIT_6aUnq`KLsD5l z5DfW0p8h`O*WdoYPjtr9OWJ0Ewpkz}01*U36d?rPgX7f5h`f9J{{R3007*qoM6N<$f@C+oAOHXW literal 0 HcmV?d00001 diff --git a/assets_raw/objects/training_dummy/damaged_down_02.png b/assets_raw/objects/training_dummy/damaged_down_02.png new file mode 100644 index 0000000000000000000000000000000000000000..bbc1ca042fb7f3602939bcdc07d70ef35cba0248 GIT binary patch literal 768 zcmV+b1ONPqP)hrTxjLB$7rB=s?!hp47Z->Fc zVQsK*P%0KS`3SF5)+hUyNa<=4Q5dlH=*e@^{ML*={`v`{SuJrfzXBYjbg{`nsTe6; zj=CEhdpm6J9gw!YcR&;d+`E2-bAN@`DFc0si}@9Ug~OW7H#ph9q7&mL2$)k&+=>KKjPK8D|# z;dRO=6$?_NbTMrH2T>TX=5@*>gp@9~vB^P7SHFDrm`bhA=Nh|*qzI*Aq;xTqius() z9hi)URBCmiFu*wWb_9vG-^WlY=1VLxYBYYpcsqVWS`-Gf{XXYsr=somY5RSYiuo@# z8NGXVO+vK&z9yyZ_eqGx?jeR!F<-+XAAPca$%E=cw)YNrP<@Esnvu|CWRacrTQiQj z8~i)(&@I%WLUjD%Jy=4)Bx;C0FvUZ+g6TH>g?f#G$^WMz|`-~-*PmN2$9 yZx}2bl!^rzS!ASC%v};%Yl>u1FpGj&6zm_QJ`Y~qDbPg#0000DNpO`1)ic!83s2PKmU^3dZ=(q?>WO4zjc<1+)mk?Y8IUaBA$J4XyLdZq8g+o z_W$rhVGhB71$yVspV%z2{$h%eR04;fhNf`$|AgR10Y=v#HIJDKR(5|j{-kp>+r%*H zt)8nBi-Z%4SBFF4@n^!Ef-8V>r#|T{_33aZ{Uhbd$FFcc=o*mE)y~T)xIj~psS9Yf z0a$nB>>jo?K*5!L@yXjF81=IGW(Q{!=KD!pwY;-8ZC8mVP+sD1#ThjjEsHyQ)p}m- zsrl76`61u26qAIvyWiI@(Rg>3bFr1{<)z(II*-b>cUjf-0;QKfOa?h?ZQ1mb83*oN z&A#Jq-V!K#mMP@;dc){74C0DROMDD+w0?Z*J|CIAb@!7%~Q~j*ucK$@7GD|_uo2P@m1$R^ZfdQGxTCvBQp5DPf6Ew zo3~VA@DjzMr6qr69hF^w@yLnIQ|$HYpTGEF zIZM^$z%m)FUoZQ=XN1|yX>7|KflNV%>ss1?f-@y=I+5EDZz8Q zs*C;FtnZwwe*n}TzJIQeTj`^FGQOTOH)zhT=2&dyCUN!U4^yBLiNuiQTJ2oG#G~_X zp;aC4X+d4Nn{FD-*4=z_(|*Rv$;?&fv<;2{lR1N@tDnm{ Hr-UW|UZ!U2 literal 0 HcmV?d00001 diff --git a/assets_raw/objects/training_dummy/damaged_down_04.png b/assets_raw/objects/training_dummy/damaged_down_04.png new file mode 100644 index 0000000000000000000000000000000000000000..692718502a4fc5bc707d9e5d1cc9fde3acc45726 GIT binary patch literal 948 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=hEVFjsrJIEGX(9zE!o5uM6#;N$=5 z>RIf)B>}e;BD{((w6NWOzA#{k!lgrgx;h=963yy-le?R_`1Yz4?tLS4<7CevCg%wv zo(trTDeU~J6j<3f<;fH|CMPkbX92f4p5Fd#AlpA-+sU#M@0WXO&QzJpd3mM*GGQz+ zQ9w-ZB*XEQ8GG8YPo_*-&5`(UlE2)Yr?>O>Jvyy#7HQ!B3B2GmeN#36lZqH41+NK2reY0|k zm=vB+z^bS-#cgfZr4^x)Q-M|jm1Jz&-EdN&S&;RxAW+83K<43{z`p|eiaIfq{%6J< zT;R{aJ^cyO>e=NMH}0!S^j%mH%Gst|vGh%8%LbKoZ_2o>We=>rV^}z+>sSNOGdN6a*@x4~aFSzx?t|&a-`LchdK_Qpd}jaAz`qj~|5EJCnK)N||ML}fC$3f3 ze|*`iS7z1V&75NLWbw^+pT2iGs!jGhnpC)l=UB;x{oaeifYvWqbN7zZOzVH5f6w;+ zd~a#9i#7g#%)}kD-s(N=JL$^fb|I%+a#`SNAs%-P(V{bq=l`wveDILWsm0M^`nG>% zm)AMuF@J8_jI`aS7eK@B;6J^kPJGs}N0u5Y zHHQaiJ&EAaEnEk7)rX=vTwMZUU5`T~jxEra`jq*z%HPe|u1&MtCq`ZFU=G*xiyu4MYNGbtJG}blyP$V7e*6uVs@1HH^-k%Y!et3`xcgUU zplZEd!5KfsWZ&R@{B` zg3!&kVtSe_M=eTzy}N&3G5-BRo%3_Dp7wd}O#XDyy6){?^LfQ(YJqw8t2H*?)_qic z-7@>{fmhFD`~LeRE@w{J9=$^)+2F0vU`f3K7Lxdcvaj7B9ij!KU2|)?hE8a6<-90WBRJlP*~VolMAZ zkWD5?kfj8qElW{{6Ua!DJlv!l0w2VURS2*5NFA<+l1j#)?-NQXmdRkr43^Ab$qbgv zWI<9o#1tvM-xJ(|$pWNwh^ZG(A5kh-&^oOKnv{<6{hnY!26K|qA*SBEdQQ^L{vq0l zyNi^LVg@N4G$|b=rK3nNxC0yZCfbR+i}YG(+-2(U;pS%6m?v%U9_H?N*kDpwc{`jpBQ(xh~V zDLxW>fk}dt4l%`Nxb*_32bXN`Jw!WkcexmzqaAx~5|mdPe(VjhU_~iFL(7F>#0fK*-q!jZxW+~=#1Yv|W8uZadgFafP)j+fE zO=+G@X$}Ll$3O8&cVaP%NlFk#6!SU0q*ShuR4P}{w)fg-UTut9FYx$vK#Cy6B&C?o zF-s6e{GStd7tO7=i3#Rla!aE@pHjI(+OgLrCW!fd4^2u3&G&nxnIu&0jA#z0s%mGL zr8}|EI;{p9_9iz*gFdBlg&V%#BgyxBe2zg%)y|0Ka7t1TMsz0@+3bqQW>>_q*XCk) zPEx1U;Mi*u6D+_Wp*ftQZLM94?!+PpBed?sBAZOZoR;wOcp2jNLB3&+Sb}N-HC, Screen> screenCache = new HashMap<>(); @@ -51,6 +53,7 @@ public class GdxGame extends Game { glProfiler = new GLProfiler(Gdx.graphics); glProfiler.enable(); + fpsLogger = new FPSLogger(); addScreen(new LoadingScreen(this)); setScreen(LoadingScreen.class); @@ -81,9 +84,8 @@ public class GdxGame extends Game { super.render(); - Gdx.graphics.setTitle("Mystic Tutorial " + - "- Draw Calls: " + glProfiler.getDrawCalls() + " " + - "- FPS: " + Gdx.graphics.getFramesPerSecond()); + Gdx.graphics.setTitle("Mystic Tutorial - Draw Calls: " + glProfiler.getDrawCalls()); + fpsLogger.log(); } @Override diff --git a/core/src/main/java/io/github/com/quillraven/ai/AnimationState.java b/core/src/main/java/io/github/com/quillraven/ai/AnimationState.java index 2400931..3b09b1d 100644 --- a/core/src/main/java/io/github/com/quillraven/ai/AnimationState.java +++ b/core/src/main/java/io/github/com/quillraven/ai/AnimationState.java @@ -5,6 +5,8 @@ import com.badlogic.gdx.ai.fsm.State; import com.badlogic.gdx.ai.msg.Telegram; import io.github.com.quillraven.component.Animation2D; import io.github.com.quillraven.component.Animation2D.AnimationType; +import io.github.com.quillraven.component.Attack; +import io.github.com.quillraven.component.Damaged; import io.github.com.quillraven.component.Fsm; import io.github.com.quillraven.component.Move; @@ -20,6 +22,18 @@ public enum AnimationState implements State { Move move = Move.MAPPER.get(entity); if (move != null && !move.getDirection().isZero()) { Fsm.MAPPER.get(entity).getAnimationFsm().changeState(WALK); + return; + } + + Attack attack = Attack.MAPPER.get(entity); + if (attack != null && attack.isAttacking()) { + Fsm.MAPPER.get(entity).getAnimationFsm().changeState(ATTACK); + return; + } + + Damaged damaged = Damaged.MAPPER.get(entity); + if (damaged != null) { + Fsm.MAPPER.get(entity).getAnimationFsm().changeState(DAMAGED); } } @@ -51,6 +65,54 @@ public enum AnimationState implements State { public void exit(Entity entity) { } + @Override + public boolean onMessage(Entity entity, Telegram telegram) { + return false; + } + }, + + ATTACK { + @Override + public void enter(Entity entity) { + Animation2D.MAPPER.get(entity).setType(AnimationType.ATTACK); + } + + @Override + public void update(Entity entity) { + Attack attack = Attack.MAPPER.get(entity); + if (attack.canAttack()) { + Fsm.MAPPER.get(entity).getAnimationFsm().changeState(IDLE); + } + } + + @Override + public void exit(Entity entity) { + } + + @Override + public boolean onMessage(Entity entity, Telegram telegram) { + return false; + } + }, + + DAMAGED { + @Override + public void enter(Entity entity) { + Animation2D.MAPPER.get(entity).setType(AnimationType.DAMAGED); + } + + @Override + public void update(Entity entity) { + Animation2D animation2D = Animation2D.MAPPER.get(entity); + if (animation2D.isFinished()) { + Fsm.MAPPER.get(entity).getAnimationFsm().changeState(IDLE); + } + } + + @Override + public void exit(Entity entity) { + } + @Override public boolean onMessage(Entity entity, Telegram telegram) { return false; diff --git a/core/src/main/java/io/github/com/quillraven/component/Animation2D.java b/core/src/main/java/io/github/com/quillraven/component/Animation2D.java index 151d3d3..7a4923d 100644 --- a/core/src/main/java/io/github/com/quillraven/component/Animation2D.java +++ b/core/src/main/java/io/github/com/quillraven/component/Animation2D.java @@ -85,9 +85,16 @@ public class Animation2D implements Component { return this.stateTime; } + public boolean isFinished() { + return animation.isAnimationFinished(stateTime); + } + public enum AnimationType { IDLE, - WALK; + WALK, + ATTACK, + DAMAGED, + ; private final String atlasKey; diff --git a/core/src/main/java/io/github/com/quillraven/component/Attack.java b/core/src/main/java/io/github/com/quillraven/component/Attack.java new file mode 100644 index 0000000..5a1b53d --- /dev/null +++ b/core/src/main/java/io/github/com/quillraven/component/Attack.java @@ -0,0 +1,39 @@ +package io.github.com.quillraven.component; + +import com.badlogic.ashley.core.Component; +import com.badlogic.ashley.core.ComponentMapper; + +public class Attack implements Component { + public static final ComponentMapper MAPPER = ComponentMapper.getFor(Attack.class); + + private float damage; + private float damageDelay; + private float attackTimer; + + public Attack(float damage, float damageDelay) { + this.damage = damage; + this.damageDelay = damageDelay; + this.attackTimer = 0f; + } + + public boolean canAttack() { + return this.attackTimer == 0f; + } + + public boolean isAttacking() { + return this.attackTimer > 0f; + } + + public void startAttack() { + this.attackTimer = this.damageDelay; + } + + public void decAttackTimer(float deltaTime) { + attackTimer = Math.max(0f, attackTimer - deltaTime); + } + + public float getDamage() { + return damage; + } + +} diff --git a/core/src/main/java/io/github/com/quillraven/component/Damaged.java b/core/src/main/java/io/github/com/quillraven/component/Damaged.java new file mode 100644 index 0000000..d415613 --- /dev/null +++ b/core/src/main/java/io/github/com/quillraven/component/Damaged.java @@ -0,0 +1,22 @@ +package io.github.com.quillraven.component; + +import com.badlogic.ashley.core.Component; +import com.badlogic.ashley.core.ComponentMapper; + +public class Damaged implements Component { + public static final ComponentMapper MAPPER = ComponentMapper.getFor(Damaged.class); + + private float damage; + + public Damaged(float damage) { + this.damage = damage; + } + + public void addDamage(float amount) { + this.damage += amount; + } + + public float getDamage() { + return damage; + } +} diff --git a/core/src/main/java/io/github/com/quillraven/screen/GameScreen.java b/core/src/main/java/io/github/com/quillraven/screen/GameScreen.java index 904118f..5331989 100644 --- a/core/src/main/java/io/github/com/quillraven/screen/GameScreen.java +++ b/core/src/main/java/io/github/com/quillraven/screen/GameScreen.java @@ -19,8 +19,10 @@ import io.github.com.quillraven.audio.AudioService; import io.github.com.quillraven.input.GameControllerState; import io.github.com.quillraven.input.KeyboardController; import io.github.com.quillraven.system.AnimationSystem; +import io.github.com.quillraven.system.AttackSystem; import io.github.com.quillraven.system.CameraSystem; import io.github.com.quillraven.system.ControllerSystem; +import io.github.com.quillraven.system.DamagedSystem; import io.github.com.quillraven.system.FacingSystem; import io.github.com.quillraven.system.FsmSystem; import io.github.com.quillraven.system.LifeSystem; @@ -67,7 +69,13 @@ public class GameScreen extends ScreenAdapter { this.engine.addSystem(new PhysicMoveSystem()); this.engine.addSystem(new PhysicSystem(physicWorld, 1 / 60f)); this.engine.addSystem(new FacingSystem()); + this.engine.addSystem(new AttackSystem(physicWorld)); this.engine.addSystem(new FsmSystem()); + // DamagedSystem must run after FsmSystem to correctly + // detect when a damaged animation should be played. + // This is done by checking if an entity has a Damaged component, + // and this component is removed in the DamagedSystem. + this.engine.addSystem(new DamagedSystem()); this.engine.addSystem(new TriggerSystem(audioService)); this.engine.addSystem(new LifeSystem(this.viewModel)); this.engine.addSystem(new AnimationSystem(game.getAssetService())); diff --git a/core/src/main/java/io/github/com/quillraven/system/AttackSystem.java b/core/src/main/java/io/github/com/quillraven/system/AttackSystem.java new file mode 100644 index 0000000..307eb38 --- /dev/null +++ b/core/src/main/java/io/github/com/quillraven/system/AttackSystem.java @@ -0,0 +1,95 @@ +package io.github.com.quillraven.system; + +import com.badlogic.ashley.core.Entity; +import com.badlogic.ashley.core.Family; +import com.badlogic.ashley.systems.IteratingSystem; +import com.badlogic.gdx.math.Rectangle; +import com.badlogic.gdx.math.Vector2; +import com.badlogic.gdx.physics.box2d.Body; +import com.badlogic.gdx.physics.box2d.Fixture; +import com.badlogic.gdx.physics.box2d.PolygonShape; +import com.badlogic.gdx.physics.box2d.Shape.Type; +import com.badlogic.gdx.physics.box2d.World; +import com.badlogic.gdx.utils.Array; +import com.badlogic.gdx.utils.GdxRuntimeException; +import io.github.com.quillraven.component.Attack; +import io.github.com.quillraven.component.Damaged; +import io.github.com.quillraven.component.Facing; +import io.github.com.quillraven.component.Facing.FacingDirection; +import io.github.com.quillraven.component.Life; +import io.github.com.quillraven.component.Physic; + +public class AttackSystem extends IteratingSystem { + public static final Rectangle attackAABB = new Rectangle(); + + private final World world; + private final Vector2 tmpVertex; + private Body attackerBody; + private float attackDamage; + + public AttackSystem(World world) { + super(Family.all(Attack.class, Facing.class, Physic.class).get()); + this.world = world; + this.tmpVertex = new Vector2(); + this.attackerBody = null; + this.attackDamage = 0f; + } + + @Override + protected void processEntity(Entity entity, float deltaTime) { + Attack attack = Attack.MAPPER.get(entity); + if (attack.canAttack()) return; + + attack.decAttackTimer(deltaTime); + if (attack.canAttack()) { + FacingDirection facingDirection = Facing.MAPPER.get(entity).getDirection(); + attackerBody = Physic.MAPPER.get(entity).getBody(); + PolygonShape attackPolygonShape = getAttackFixture(attackerBody, facingDirection); + updateAttackAABB(attackerBody.getPosition(), attackPolygonShape); + + this.attackDamage = attack.getDamage(); + world.QueryAABB(this::attackCallback, attackAABB.x, attackAABB.y, attackAABB.width, attackAABB.height); + } + } + + private boolean attackCallback(Fixture fixture) { + Body body = fixture.getBody(); + if (body.equals(attackerBody)) return true; + if (!(body.getUserData() instanceof Entity entity)) return true; + + Life life = Life.MAPPER.get(entity); + if (life == null) { + return true; + } + + Damaged damaged = Damaged.MAPPER.get(entity); + if (damaged == null) { + entity.add(new Damaged(this.attackDamage)); + } else { + damaged.addDamage(this.attackDamage); + } + return true; + } + + private void updateAttackAABB(Vector2 bodyPosition, PolygonShape attackPolygonShape) { + attackPolygonShape.getVertex(0, tmpVertex); + tmpVertex.add(bodyPosition); + attackAABB.setPosition(tmpVertex.x, tmpVertex.y); + + attackPolygonShape.getVertex(2, tmpVertex); + tmpVertex.add(bodyPosition); + attackAABB.setSize(tmpVertex.x, tmpVertex.y); + } + + private PolygonShape getAttackFixture(Body body, FacingDirection direction) { + Array fixtureList = body.getFixtureList(); + String fixtureName = "attack_sensor_" + direction.getAtlasKey(); + for (Fixture fixture : fixtureList) { + if (fixtureName.equals(fixture.getUserData()) && Type.Polygon.equals(fixture.getShape().getType())) { + return (PolygonShape) fixture.getShape(); + } + } + + throw new GdxRuntimeException("Entity has no polygon attack sensor with userData '" + fixtureName + "'"); + } +} diff --git a/core/src/main/java/io/github/com/quillraven/system/ControllerSystem.java b/core/src/main/java/io/github/com/quillraven/system/ControllerSystem.java index 6895707..7e54b40 100644 --- a/core/src/main/java/io/github/com/quillraven/system/ControllerSystem.java +++ b/core/src/main/java/io/github/com/quillraven/system/ControllerSystem.java @@ -4,6 +4,7 @@ import com.badlogic.ashley.core.Entity; import com.badlogic.ashley.core.Family; import com.badlogic.ashley.systems.IteratingSystem; import io.github.com.quillraven.GdxGame; +import io.github.com.quillraven.component.Attack; import io.github.com.quillraven.component.Controller; import io.github.com.quillraven.component.Move; import io.github.com.quillraven.input.Command; @@ -30,6 +31,7 @@ public class ControllerSystem extends IteratingSystem { case DOWN -> moveEntity(entity, 0f, -1f); case LEFT -> moveEntity(entity, -1f, 0f); case RIGHT -> moveEntity(entity, 1f, 0f); + case SELECT -> startEntityAttack(entity); case CANCEL -> game.setScreen(MenuScreen.class); } } @@ -46,6 +48,13 @@ public class ControllerSystem extends IteratingSystem { controller.getReleasedCommands().clear(); } + private void startEntityAttack(Entity entity) { + Attack attack = Attack.MAPPER.get(entity); + if (attack != null && attack.canAttack()) { + attack.startAttack(); + } + } + private void moveEntity(Entity entity, float dx, float dy) { Move move = Move.MAPPER.get(entity); if (move != null) { diff --git a/core/src/main/java/io/github/com/quillraven/system/DamagedSystem.java b/core/src/main/java/io/github/com/quillraven/system/DamagedSystem.java new file mode 100644 index 0000000..06b68ef --- /dev/null +++ b/core/src/main/java/io/github/com/quillraven/system/DamagedSystem.java @@ -0,0 +1,25 @@ +package io.github.com.quillraven.system; + +import com.badlogic.ashley.core.Entity; +import com.badlogic.ashley.core.Family; +import com.badlogic.ashley.systems.IteratingSystem; +import io.github.com.quillraven.component.Damaged; +import io.github.com.quillraven.component.Life; + +public class DamagedSystem extends IteratingSystem { + + public DamagedSystem() { + super(Family.all(Damaged.class).get()); + } + + @Override + protected void processEntity(Entity entity, float deltaTime) { + Damaged damaged = Damaged.MAPPER.get(entity); + entity.remove(Damaged.class); + + Life life = Life.MAPPER.get(entity); + if (life != null) { + life.addLife(-damaged.getDamage()); + } + } +} diff --git a/core/src/main/java/io/github/com/quillraven/system/PhysicDebugRenderSystem.java b/core/src/main/java/io/github/com/quillraven/system/PhysicDebugRenderSystem.java index 242f965..f273d99 100644 --- a/core/src/main/java/io/github/com/quillraven/system/PhysicDebugRenderSystem.java +++ b/core/src/main/java/io/github/com/quillraven/system/PhysicDebugRenderSystem.java @@ -2,6 +2,9 @@ package io.github.com.quillraven.system; import com.badlogic.ashley.core.EntitySystem; import com.badlogic.gdx.graphics.Camera; +import com.badlogic.gdx.graphics.Color; +import com.badlogic.gdx.graphics.glutils.ShapeRenderer; +import com.badlogic.gdx.math.Rectangle; import com.badlogic.gdx.physics.box2d.Box2DDebugRenderer; import com.badlogic.gdx.physics.box2d.World; import com.badlogic.gdx.utils.Disposable; @@ -9,10 +12,12 @@ import com.badlogic.gdx.utils.Disposable; public class PhysicDebugRenderSystem extends EntitySystem implements Disposable { private final World physicWorld; private final Box2DDebugRenderer box2DDebugRenderer; + private final ShapeRenderer shapeRenderer; private final Camera camera; public PhysicDebugRenderSystem(World physicWorld, Camera camera) { this.box2DDebugRenderer = new Box2DDebugRenderer(); + this.shapeRenderer = new ShapeRenderer(); this.physicWorld = physicWorld; this.camera = camera; setProcessing(false); @@ -21,10 +26,22 @@ public class PhysicDebugRenderSystem extends EntitySystem implements Disposable @Override public void update(float deltaTime) { this.box2DDebugRenderer.render(physicWorld, camera.combined); + + this.shapeRenderer.setProjectionMatrix(camera.combined); + this.shapeRenderer.begin(ShapeRenderer.ShapeType.Line); + this.shapeRenderer.setColor(Color.RED); + Rectangle attackAABB = AttackSystem.attackAABB; + this.shapeRenderer.rect( + attackAABB.x, + attackAABB.y, + attackAABB.width - attackAABB.x, + attackAABB.height - attackAABB.y); + this.shapeRenderer.end(); } @Override public void dispose() { this.box2DDebugRenderer.dispose(); + this.shapeRenderer.dispose(); } } diff --git a/core/src/main/java/io/github/com/quillraven/system/PhysicSystem.java b/core/src/main/java/io/github/com/quillraven/system/PhysicSystem.java index 6408911..e0465e9 100644 --- a/core/src/main/java/io/github/com/quillraven/system/PhysicSystem.java +++ b/core/src/main/java/io/github/com/quillraven/system/PhysicSystem.java @@ -10,6 +10,7 @@ import com.badlogic.gdx.physics.box2d.Body; import com.badlogic.gdx.physics.box2d.Contact; import com.badlogic.gdx.physics.box2d.ContactImpulse; import com.badlogic.gdx.physics.box2d.ContactListener; +import com.badlogic.gdx.physics.box2d.Fixture; import com.badlogic.gdx.physics.box2d.Manifold; import com.badlogic.gdx.physics.box2d.World; import io.github.com.quillraven.component.Physic; @@ -95,26 +96,28 @@ public class PhysicSystem extends IteratingSystem implements EntityListener, Con @Override public void beginContact(Contact contact) { - Object userDataA = contact.getFixtureA().getBody().getUserData(); - Object userDataB = contact.getFixtureB().getBody().getUserData(); + Fixture fixtureA = contact.getFixtureA(); + Object userDataA = fixtureA.getBody().getUserData(); + Fixture fixtureB = contact.getFixtureB(); + Object userDataB = fixtureB.getBody().getUserData(); if (!(userDataA instanceof Entity entityA) || !(userDataB instanceof Entity entityB)) { return; } - playerTriggerContact(entityA, entityB); + playerTriggerContact(entityA, fixtureA, entityB, fixtureB); } - private static void playerTriggerContact(Entity entityA, Entity entityB) { + private static void playerTriggerContact(Entity entityA, Fixture fixtureA, Entity entityB, Fixture fixtureB) { Trigger trigger = Trigger.MAPPER.get(entityA); - boolean isPlayer = Player.MAPPER.get(entityB) != null; + boolean isPlayer = Player.MAPPER.get(entityB) != null && !fixtureB.isSensor(); if (trigger != null && isPlayer) { trigger.setTriggeringEntity(entityB); return; } trigger = Trigger.MAPPER.get(entityB); - isPlayer = Player.MAPPER.get(entityA) != null; + isPlayer = Player.MAPPER.get(entityA) != null && !fixtureA.isSensor(); if (trigger != null && isPlayer) { trigger.setTriggeringEntity(entityA); } diff --git a/core/src/main/java/io/github/com/quillraven/tiled/TiledAshleyConfigurator.java b/core/src/main/java/io/github/com/quillraven/tiled/TiledAshleyConfigurator.java index 4dc15b1..9c925cc 100644 --- a/core/src/main/java/io/github/com/quillraven/tiled/TiledAshleyConfigurator.java +++ b/core/src/main/java/io/github/com/quillraven/tiled/TiledAshleyConfigurator.java @@ -17,6 +17,7 @@ import com.badlogic.gdx.math.Vector2; import com.badlogic.gdx.physics.box2d.Body; import com.badlogic.gdx.physics.box2d.BodyDef; import com.badlogic.gdx.physics.box2d.BodyDef.BodyType; +import com.badlogic.gdx.physics.box2d.Fixture; import com.badlogic.gdx.physics.box2d.FixtureDef; import com.badlogic.gdx.physics.box2d.World; import com.badlogic.gdx.utils.GdxRuntimeException; @@ -25,6 +26,7 @@ import io.github.com.quillraven.asset.AssetService; import io.github.com.quillraven.asset.AtlasAsset; import io.github.com.quillraven.component.Animation2D; import io.github.com.quillraven.component.Animation2D.AnimationType; +import io.github.com.quillraven.component.Attack; import io.github.com.quillraven.component.CameraFollow; import io.github.com.quillraven.component.Controller; import io.github.com.quillraven.component.Facing; @@ -92,7 +94,6 @@ public class TiledAshleyConfigurator { Entity entity = this.engine.createEntity(); TiledMapTile tile = tileMapObject.getTile(); TextureRegion textureRegion = getTextureRegion(tile); - String classType = tile.getProperties().get("type", "", String.class); float sortOffsetY = tile.getProperties().get("sortOffsetY", 0, Integer.class); sortOffsetY *= GdxGame.UNIT_SCALE; int z = tile.getProperties().get("z", 1, Integer.class); @@ -103,9 +104,10 @@ public class TiledAshleyConfigurator { tileMapObject.getScaleX(), tileMapObject.getScaleY(), sortOffsetY, entity); + BodyType bodyType = getObjectBodyType(tile); addEntityPhysic( tile.getObjects(), - "Prop".equals(classType) ? BodyType.StaticBody : BodyType.DynamicBody, + bodyType, Vector2.Zero, entity); addEntityAnimation(tile, entity); @@ -114,6 +116,7 @@ public class TiledAshleyConfigurator { addEntityCameraFollow(tileMapObject, entity); addEntityLife(tile, entity); addEntityPlayer(tileMapObject, entity); + addEntityAttack(tile, entity); entity.add(new Facing(FacingDirection.DOWN)); entity.add(new Fsm(entity)); entity.add(new Graphic(textureRegion, Color.WHITE.cpy())); @@ -122,6 +125,24 @@ public class TiledAshleyConfigurator { this.engine.addEntity(entity); } + private BodyType getObjectBodyType(TiledMapTile tile) { + String classType = tile.getProperties().get("type", "", String.class); + if ("Prop".equals(classType)) { + return BodyType.StaticBody; + } + + String bodyTypeStr = tile.getProperties().get("bodyType", "DynamicBody", String.class); + return BodyType.valueOf(bodyTypeStr); + } + + private void addEntityAttack(TiledMapTile tile, Entity entity) { + float damage = tile.getProperties().get("damage", 0f, Float.class); + if (damage == 0f) return; + + float damageDelay = tile.getProperties().get("damageDelay", 0f, Float.class); + entity.add(new Attack(damage, damageDelay)); + } + private void addEntityPlayer(TiledMapTileMapObject tileMapObject, Entity entity) { if ("Player".equals(tileMapObject.getName())) { entity.add(new Player()); @@ -227,7 +248,8 @@ public class TiledAshleyConfigurator { body.setUserData(userData); for (MapObject object : mapObjects) { FixtureDef fixtureDef = TiledPhysics.fixtureDefOf(object, scaling, relativeTo); - body.createFixture(fixtureDef); + Fixture fixture = body.createFixture(fixtureDef); + fixture.setUserData(object.getName()); fixtureDef.shape.dispose(); } return body;