From 499dd75bb1adcf93e96f5d788a713af9f58df05e Mon Sep 17 00:00:00 2001 From: Jigyasu Date: Tue, 17 Oct 2023 13:10:18 +1000 Subject: [PATCH] tests and projectile animations --- .DS_Store | Bin 0 -> 6148 bytes .../assets/images/mobs/arcane_archer.atlas | 446 +++--- source/core/assets/images/mobs/coat.atlas | 334 ++-- .../assets/images/mobs/dragon_knight.atlas | 7 + .../core/assets/images/mobs/dragon_knight.png | Bin 13025 -> 4228 bytes .../core/assets/images/mobs/fire_worm.atlas | 7 + source/core/assets/images/mobs/fire_worm.png | Bin 30034 -> 40405 bytes .../assets/images/mobs/fire_worm_attack.atlas | 236 +-- source/core/assets/images/mobs/fire_worm_walk | 138 +- .../core/assets/images/mobs/firewizard.atlas | 160 -- source/core/assets/images/mobs/firewizard.png | Bin 26405 -> 0 bytes .../core/assets/images/mobs/necromancer.atlas | 167 -- .../core/assets/images/mobs/necromancer.png | Bin 38038 -> 0 bytes .../core/assets/images/mobs/night_borne.atlas | 502 +++--- .../assets/images/mobs/rangeBossRight.atlas | 108 +- source/core/assets/images/mobs/robot.atlas | 112 +- source/core/assets/images/mobs/rocky.atlas | 174 --- source/core/assets/images/mobs/rocky.png | Bin 3151 -> 0 bytes source/core/assets/images/mobs/skeleton.atlas | 7 + source/core/assets/images/mobs/skeleton.png | Bin 26501 -> 8096 bytes .../core/assets/images/mobs/water_queen.atlas | 7 + .../core/assets/images/mobs/water_queen.png | Bin 23040 -> 7901 bytes .../core/assets/images/mobs/water_slime.atlas | 7 + .../core/assets/images/mobs/water_slime.png | Bin 3428 -> 1435 bytes source/core/assets/images/mobs/wizard.atlas | 7 + source/core/assets/images/mobs/wizard.png | Bin 66838 -> 79136 bytes source/core/assets/images/mobs/xeno-Grunt.png | Bin 22457 -> 36839 bytes .../core/assets/images/mobs/xenoGrunt.atlas | 7 + .../assets/images/projectiles/arrow.atlas | 54 + .../core/assets/images/projectiles/arrow.png | Bin 0 -> 1557 bytes .../projectiles/attack_projectile.atlas | 66 +- .../images/projectiles/basic_projectile.atlas | 38 +- .../images/projectiles/basic_projectile.png | Bin 1014 -> 1952 bytes .../images/projectiles/bossProjectile.atlas | 206 +-- .../images/projectiles/burn_effect.atlas | 108 +- .../projectiles/engineer_projectile.atlas | 24 +- .../projectiles/engineer_projectile.png | Bin 386 -> 770 bytes .../images/projectiles/firework_anim.atlas | 82 +- .../projectiles/mobBoss_projectile.atlas | 124 +- .../images/projectiles/mobProjectile.atlas | 82 +- .../images/projectiles/oldstun_effect.atlas | 80 +- .../images/projectiles/pierce_anim.atlas | 82 +- .../projectiles/projectile_explosion.atlas | 194 +-- .../assets/images/projectiles/snow_ball.atlas | 96 +- .../images/projectiles/stun_effect.atlas | 23 +- .../assets/images/projectiles/stun_effect.png | Bin 647 -> 2141 bytes .../game/ai/tasks/AITaskComponent.java | 7 +- .../csse3200/game/components/Component.java | 204 +-- .../game/components/TouchAttackComponent.java | 482 +++--- .../npc/DragonKnightAnimationController.java | 12 +- .../npc/FireWormAnimationController.java | 11 +- .../npc/SkeletonAnimationController.java | 18 +- .../npc/WaterQueenAnimationController.java | 11 +- .../npc/WaterSlimeAnimationController.java | 13 +- .../npc/WizardAnimationController.java | 9 + .../npc/XenoAnimationController.java | 8 + ...rnEffectProjectileAnimationController.java | 27 +- .../EngineerBulletsAnimationController.java | 38 +- .../PierceArrowAnimationController.java | 25 + .../ProjectileAnimationController.java | 28 +- ...SnowBallProjectileAnimationController.java | 26 + ...unEffectProjectileAnimationController.java | 27 +- .../game/components/tasks/MobAttackTask.java | 79 +- .../game/components/tasks/MobDodgeTask.java | 30 +- .../components/tasks/MobMeleeAttackTask.java | 170 +- .../components/tasks/MobRangedAttackTask.java | 106 +- .../game/components/tasks/MobShootTask.java | 61 +- .../components/tasks/MobTask/MobTask.java | 596 +++---- .../components/tasks/MobTask/MobType.java | 51 +- .../game/components/tasks/MobWanderTask.java | 87 +- .../game/entities/PredefinedWeapons.java | 6 + .../game/entities/factories/NPCFactory.java | 1370 +++++++++-------- .../entities/factories/ProjectileFactory.java | 792 +++++----- .../archer/ArcherAnimationControllerTest.java | 67 + ...ngineerBulletsAnimationControllerTest.java | 67 + .../xenos/XenoAnimationControllerTest.java | 145 +- 76 files changed, 4340 insertions(+), 3918 deletions(-) create mode 100644 .DS_Store delete mode 100644 source/core/assets/images/mobs/firewizard.atlas delete mode 100644 source/core/assets/images/mobs/firewizard.png delete mode 100644 source/core/assets/images/mobs/necromancer.atlas delete mode 100644 source/core/assets/images/mobs/necromancer.png delete mode 100644 source/core/assets/images/mobs/rocky.atlas delete mode 100644 source/core/assets/images/mobs/rocky.png create mode 100644 source/core/assets/images/projectiles/arrow.atlas create mode 100644 source/core/assets/images/projectiles/arrow.png create mode 100644 source/core/src/main/com/csse3200/game/components/projectile/PierceArrowAnimationController.java create mode 100644 source/core/src/test/com/csse3200/game/components/archer/ArcherAnimationControllerTest.java create mode 100644 source/core/src/test/com/csse3200/game/components/projectile/EngineerBulletsAnimationControllerTest.java diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..b30eb7c29dae713271d0d496a01b40f11f683a5a GIT binary patch literal 6148 zcmeHK&5P4O6o0cD+o_9CL}djJVHfvQw5uX4USh2mk4E&MQj<++gGnYdsRc_RC()aK zg5b%s;MJ2i&tCi+{2zStk?y3i9z}FsnfXoL$IP2wK3)d^$Y2&60(1d@V&iC?#_kuw z?YuQ)OKHv`5uv*-Os{ zpyc_qz=IrrArz3;vf2CITDR-Dy!yDxr8bA2$tIs#9{X=)9yu^%WD3U+`tv+fynphu zILeED{~OubwobL$v`u&DQ+LAVZs8TPeBezV^Q#Ap#eOyR{D)CEA9c^&VQJw-X*d-D zQ4pfblSfe+u=#+^(jXVHt~AgN?Toq?7K?t*zH$9%*|Qf%*Tneda@nEh_pjc%KYAV~ zDSORR#sYv9K*$+|6}-Vg3t3(5NN0BUN3yeS*O|pT^O?#gtu}|w>?R+b*^3{V%)W4^ zY0T0wu3zO|<@|r3+BM~Oz=&bMFkl$a8Q|Xs8yiPQVJT63Ikv{;vm_E5m?c;GbfESVMO>z%8lT+SnYgwKleA*tl@NQlbdKPL*RZ;H7vM cn-H|we1PaEEG41_#rzQvG?>mX@JAW=3FjifS^xk5 literal 0 HcmV?d00001 diff --git a/source/core/assets/images/mobs/arcane_archer.atlas b/source/core/assets/images/mobs/arcane_archer.atlas index 5acf48d80..b43656e7f 100644 --- a/source/core/assets/images/mobs/arcane_archer.atlas +++ b/source/core/assets/images/mobs/arcane_archer.atlas @@ -1,223 +1,223 @@ - -arcane_archer.png -size: 512, 256 -format: RGBA8888 -filter: Nearest, Nearest -repeat: none -arcane_archer_attack - rotate: false - xy: 290, 2 - size: 65, 44 - orig: 65, 44 - offset: 0, 0 - index: -1 -arcane_archer_attack - rotate: false - xy: 362, 140 - size: 70, 44 - orig: 70, 44 - offset: 0, 0 - index: -1 -arcane_archer_attack - rotate: false - xy: 146, 94 - size: 70, 44 - orig: 70, 44 - offset: 0, 0 - index: -1 -arcane_archer_attack - rotate: false - xy: 74, 186 - size: 70, 44 - orig: 70, 44 - offset: 0, 0 - index: -1 -arcane_archer_attack - rotate: false - xy: 362, 186 - size: 70, 44 - orig: 70, 44 - offset: 0, 0 - index: -1 -arcane_archer_attack - rotate: false - xy: 218, 186 - size: 70, 44 - orig: 70, 44 - offset: 0, 0 - index: -1 -arcane_archer_attack - rotate: false - xy: 362, 94 - size: 70, 44 - orig: 70, 44 - offset: 0, 0 - index: -1 -arcane_archer_death - rotate: false - xy: 2, 2 - size: 70, 44 - orig: 70, 44 - offset: 0, 0 - index: -1 -arcane_archer_death - rotate: false - xy: 2, 140 - size: 70, 44 - orig: 70, 44 - offset: 0, 0 - index: -1 -arcane_archer_death - rotate: false - xy: 146, 48 - size: 70, 44 - orig: 70, 44 - offset: 0, 0 - index: -1 -arcane_archer_death - rotate: false - xy: 74, 94 - size: 70, 44 - orig: 70, 44 - offset: 0, 0 - index: -1 -arcane_archer_death - rotate: false - xy: 434, 186 - size: 70, 44 - orig: 70, 44 - offset: 0, 0 - index: -1 -arcane_archer_death - rotate: false - xy: 218, 140 - size: 70, 44 - orig: 70, 44 - offset: 0, 0 - index: -1 -arcane_archer_death - rotate: false - xy: 2, 94 - size: 70, 44 - orig: 70, 44 - offset: 0, 0 - index: -1 -arcane_archer_death - rotate: false - xy: 146, 2 - size: 70, 44 - orig: 70, 44 - offset: 0, 0 - index: -1 -arcane_archer_dodge - rotate: false - xy: 434, 140 - size: 69, 44 - orig: 69, 44 - offset: 0, 0 - index: -1 -arcane_archer_dodge - rotate: false - xy: 290, 140 - size: 70, 44 - orig: 70, 44 - offset: 0, 0 - index: -1 -arcane_archer_dodge - rotate: false - xy: 146, 140 - size: 70, 44 - orig: 70, 44 - offset: 0, 0 - index: -1 -arcane_archer_dodge - rotate: false - xy: 290, 48 - size: 70, 44 - orig: 70, 44 - offset: 0, 0 - index: -1 -arcane_archer_dodge - rotate: false - xy: 74, 2 - size: 70, 44 - orig: 70, 44 - offset: 0, 0 - index: -1 -arcane_archer_dodge - rotate: false - xy: 146, 186 - size: 70, 44 - orig: 70, 44 - offset: 0, 0 - index: -1 -arcane_archer_dodge - rotate: false - xy: 290, 94 - size: 70, 44 - orig: 70, 44 - offset: 0, 0 - index: -1 -arcane_archer_run - rotate: false - xy: 74, 48 - size: 70, 44 - orig: 70, 44 - offset: 0, 0 - index: -1 -arcane_archer_run - rotate: false - xy: 2, 186 - size: 70, 44 - orig: 70, 44 - offset: 0, 0 - index: -1 -arcane_archer_run - rotate: false - xy: 218, 94 - size: 70, 44 - orig: 70, 44 - offset: 0, 0 - index: -1 -arcane_archer_run - rotate: false - xy: 2, 48 - size: 70, 44 - orig: 70, 44 - offset: 0, 0 - index: -1 -arcane_archer_run - rotate: false - xy: 218, 2 - size: 70, 44 - orig: 70, 44 - offset: 0, 0 - index: -1 -arcane_archer_run - rotate: false - xy: 290, 186 - size: 70, 44 - orig: 70, 44 - offset: 0, 0 - index: -1 -arcane_archer_run - rotate: false - xy: 74, 140 - size: 70, 44 - orig: 70, 44 - offset: 0, 0 - index: -1 -arcane_archer_run - rotate: false - xy: 218, 48 - size: 70, 44 - orig: 70, 44 - offset: 0, 0 - index: -1 -default - rotate: false - xy: 218, 48 - size: 70, 44 - orig: 70, 44 - offset: 0, 0 - index: -1 + +arcane_archer.png +size: 512, 256 +format: RGBA8888 +filter: Nearest, Nearest +repeat: none +arcane_archer_attack + rotate: false + xy: 290, 2 + size: 65, 44 + orig: 65, 44 + offset: 0, 0 + index: -1 +arcane_archer_attack + rotate: false + xy: 362, 140 + size: 70, 44 + orig: 70, 44 + offset: 0, 0 + index: -1 +arcane_archer_attack + rotate: false + xy: 146, 94 + size: 70, 44 + orig: 70, 44 + offset: 0, 0 + index: -1 +arcane_archer_attack + rotate: false + xy: 74, 186 + size: 70, 44 + orig: 70, 44 + offset: 0, 0 + index: -1 +arcane_archer_attack + rotate: false + xy: 362, 186 + size: 70, 44 + orig: 70, 44 + offset: 0, 0 + index: -1 +arcane_archer_attack + rotate: false + xy: 218, 186 + size: 70, 44 + orig: 70, 44 + offset: 0, 0 + index: -1 +arcane_archer_attack + rotate: false + xy: 362, 94 + size: 70, 44 + orig: 70, 44 + offset: 0, 0 + index: -1 +arcane_archer_death + rotate: false + xy: 2, 2 + size: 70, 44 + orig: 70, 44 + offset: 0, 0 + index: -1 +arcane_archer_death + rotate: false + xy: 2, 140 + size: 70, 44 + orig: 70, 44 + offset: 0, 0 + index: -1 +arcane_archer_death + rotate: false + xy: 146, 48 + size: 70, 44 + orig: 70, 44 + offset: 0, 0 + index: -1 +arcane_archer_death + rotate: false + xy: 74, 94 + size: 70, 44 + orig: 70, 44 + offset: 0, 0 + index: -1 +arcane_archer_death + rotate: false + xy: 434, 186 + size: 70, 44 + orig: 70, 44 + offset: 0, 0 + index: -1 +arcane_archer_death + rotate: false + xy: 218, 140 + size: 70, 44 + orig: 70, 44 + offset: 0, 0 + index: -1 +arcane_archer_death + rotate: false + xy: 2, 94 + size: 70, 44 + orig: 70, 44 + offset: 0, 0 + index: -1 +arcane_archer_death + rotate: false + xy: 146, 2 + size: 70, 44 + orig: 70, 44 + offset: 0, 0 + index: -1 +arcane_archer_dodge + rotate: false + xy: 434, 140 + size: 69, 44 + orig: 69, 44 + offset: 0, 0 + index: -1 +arcane_archer_dodge + rotate: false + xy: 290, 140 + size: 70, 44 + orig: 70, 44 + offset: 0, 0 + index: -1 +arcane_archer_dodge + rotate: false + xy: 146, 140 + size: 70, 44 + orig: 70, 44 + offset: 0, 0 + index: -1 +arcane_archer_dodge + rotate: false + xy: 290, 48 + size: 70, 44 + orig: 70, 44 + offset: 0, 0 + index: -1 +arcane_archer_dodge + rotate: false + xy: 74, 2 + size: 70, 44 + orig: 70, 44 + offset: 0, 0 + index: -1 +arcane_archer_dodge + rotate: false + xy: 146, 186 + size: 70, 44 + orig: 70, 44 + offset: 0, 0 + index: -1 +arcane_archer_dodge + rotate: false + xy: 290, 94 + size: 70, 44 + orig: 70, 44 + offset: 0, 0 + index: -1 +arcane_archer_run + rotate: false + xy: 74, 48 + size: 70, 44 + orig: 70, 44 + offset: 0, 0 + index: -1 +arcane_archer_run + rotate: false + xy: 2, 186 + size: 70, 44 + orig: 70, 44 + offset: 0, 0 + index: -1 +arcane_archer_run + rotate: false + xy: 218, 94 + size: 70, 44 + orig: 70, 44 + offset: 0, 0 + index: -1 +arcane_archer_run + rotate: false + xy: 2, 48 + size: 70, 44 + orig: 70, 44 + offset: 0, 0 + index: -1 +arcane_archer_run + rotate: false + xy: 218, 2 + size: 70, 44 + orig: 70, 44 + offset: 0, 0 + index: -1 +arcane_archer_run + rotate: false + xy: 290, 186 + size: 70, 44 + orig: 70, 44 + offset: 0, 0 + index: -1 +arcane_archer_run + rotate: false + xy: 74, 140 + size: 70, 44 + orig: 70, 44 + offset: 0, 0 + index: -1 +arcane_archer_run + rotate: false + xy: 218, 48 + size: 70, 44 + orig: 70, 44 + offset: 0, 0 + index: -1 +default + rotate: false + xy: 218, 48 + size: 70, 44 + orig: 70, 44 + offset: 0, 0 + index: -1 diff --git a/source/core/assets/images/mobs/coat.atlas b/source/core/assets/images/mobs/coat.atlas index f98ef17d8..ae65fd9ac 100644 --- a/source/core/assets/images/mobs/coat.atlas +++ b/source/core/assets/images/mobs/coat.atlas @@ -1,167 +1,167 @@ - -coat.png -size: 1024, 64 -format: RGBA8888 -filter: Nearest, Nearest -repeat: none -coat_attack - rotate: false - xy: 498, 24 - size: 38, 38 - orig: 38, 38 - offset: 0, 0 - index: -1 -coat_attack - rotate: false - xy: 98, 24 - size: 38, 38 - orig: 38, 38 - offset: 0, 0 - index: -1 -coat_attack - rotate: false - xy: 218, 24 - size: 38, 38 - orig: 38, 38 - offset: 0, 0 - index: -1 -coat_attack - rotate: false - xy: 2, 25 - size: 54, 37 - orig: 54, 37 - offset: 0, 0 - index: -1 -coat_attack - rotate: false - xy: 378, 24 - size: 38, 38 - orig: 38, 38 - offset: 0, 0 - index: -1 -coat_attack - rotate: false - xy: 138, 24 - size: 38, 38 - orig: 38, 38 - offset: 0, 0 - index: -1 -coat_attack - rotate: false - xy: 618, 24 - size: 38, 38 - orig: 38, 38 - offset: 0, 0 - index: -1 -coat_attack - rotate: false - xy: 258, 24 - size: 38, 38 - orig: 38, 38 - offset: 0, 0 - index: -1 -coat_attack - rotate: false - xy: 698, 24 - size: 38, 38 - orig: 38, 38 - offset: 0, 0 - index: -1 -coat_attack - rotate: false - xy: 418, 24 - size: 38, 38 - orig: 38, 38 - offset: 0, 0 - index: -1 -coat_death - rotate: false - xy: 578, 24 - size: 38, 38 - orig: 38, 38 - offset: 0, 0 - index: -1 -coat_death - rotate: false - xy: 298, 24 - size: 38, 38 - orig: 38, 38 - offset: 0, 0 - index: -1 -coat_death - rotate: false - xy: 738, 32 - size: 33, 30 - orig: 33, 30 - offset: 0, 0 - index: -1 -coat_death - rotate: false - xy: 773, 36 - size: 31, 26 - orig: 31, 26 - offset: 0, 0 - index: -1 -coat_death - rotate: false - xy: 2, 2 - size: 30, 21 - orig: 30, 21 - offset: 0, 0 - index: -1 -coat_death - rotate: false - xy: 806, 44 - size: 25, 18 - orig: 25, 18 - offset: 0, 0 - index: -1 -coat_run - rotate: false - xy: 458, 24 - size: 38, 38 - orig: 38, 38 - offset: 0, 0 - index: -1 -coat_run - rotate: false - xy: 178, 24 - size: 38, 38 - orig: 38, 38 - offset: 0, 0 - index: -1 -coat_run - rotate: false - xy: 658, 24 - size: 38, 38 - orig: 38, 38 - offset: 0, 0 - index: -1 -coat_run - rotate: false - xy: 338, 24 - size: 38, 38 - orig: 38, 38 - offset: 0, 0 - index: -1 -coat_run - rotate: false - xy: 58, 24 - size: 38, 38 - orig: 38, 38 - offset: 0, 0 - index: -1 -coat_run - rotate: false - xy: 538, 24 - size: 38, 38 - orig: 38, 38 - offset: 0, 0 - index: -1 -default - rotate: false - xy: 538, 24 - size: 38, 38 - orig: 38, 38 - offset: 0, 0 - index: -1 + +coat.png +size: 1024, 64 +format: RGBA8888 +filter: Nearest, Nearest +repeat: none +coat_attack + rotate: false + xy: 498, 24 + size: 38, 38 + orig: 38, 38 + offset: 0, 0 + index: -1 +coat_attack + rotate: false + xy: 98, 24 + size: 38, 38 + orig: 38, 38 + offset: 0, 0 + index: -1 +coat_attack + rotate: false + xy: 218, 24 + size: 38, 38 + orig: 38, 38 + offset: 0, 0 + index: -1 +coat_attack + rotate: false + xy: 2, 25 + size: 54, 37 + orig: 54, 37 + offset: 0, 0 + index: -1 +coat_attack + rotate: false + xy: 378, 24 + size: 38, 38 + orig: 38, 38 + offset: 0, 0 + index: -1 +coat_attack + rotate: false + xy: 138, 24 + size: 38, 38 + orig: 38, 38 + offset: 0, 0 + index: -1 +coat_attack + rotate: false + xy: 618, 24 + size: 38, 38 + orig: 38, 38 + offset: 0, 0 + index: -1 +coat_attack + rotate: false + xy: 258, 24 + size: 38, 38 + orig: 38, 38 + offset: 0, 0 + index: -1 +coat_attack + rotate: false + xy: 698, 24 + size: 38, 38 + orig: 38, 38 + offset: 0, 0 + index: -1 +coat_attack + rotate: false + xy: 418, 24 + size: 38, 38 + orig: 38, 38 + offset: 0, 0 + index: -1 +coat_death + rotate: false + xy: 578, 24 + size: 38, 38 + orig: 38, 38 + offset: 0, 0 + index: -1 +coat_death + rotate: false + xy: 298, 24 + size: 38, 38 + orig: 38, 38 + offset: 0, 0 + index: -1 +coat_death + rotate: false + xy: 738, 32 + size: 33, 30 + orig: 33, 30 + offset: 0, 0 + index: -1 +coat_death + rotate: false + xy: 773, 36 + size: 31, 26 + orig: 31, 26 + offset: 0, 0 + index: -1 +coat_death + rotate: false + xy: 2, 2 + size: 30, 21 + orig: 30, 21 + offset: 0, 0 + index: -1 +coat_death + rotate: false + xy: 806, 44 + size: 25, 18 + orig: 25, 18 + offset: 0, 0 + index: -1 +coat_run + rotate: false + xy: 458, 24 + size: 38, 38 + orig: 38, 38 + offset: 0, 0 + index: -1 +coat_run + rotate: false + xy: 178, 24 + size: 38, 38 + orig: 38, 38 + offset: 0, 0 + index: -1 +coat_run + rotate: false + xy: 658, 24 + size: 38, 38 + orig: 38, 38 + offset: 0, 0 + index: -1 +coat_run + rotate: false + xy: 338, 24 + size: 38, 38 + orig: 38, 38 + offset: 0, 0 + index: -1 +coat_run + rotate: false + xy: 58, 24 + size: 38, 38 + orig: 38, 38 + offset: 0, 0 + index: -1 +coat_run + rotate: false + xy: 538, 24 + size: 38, 38 + orig: 38, 38 + offset: 0, 0 + index: -1 +default + rotate: false + xy: 538, 24 + size: 38, 38 + orig: 38, 38 + offset: 0, 0 + index: -1 diff --git a/source/core/assets/images/mobs/dragon_knight.atlas b/source/core/assets/images/mobs/dragon_knight.atlas index 59a0335b8..4d698370a 100644 --- a/source/core/assets/images/mobs/dragon_knight.atlas +++ b/source/core/assets/images/mobs/dragon_knight.atlas @@ -25,6 +25,13 @@ dragon_knight_attack orig: 99, 99 offset: 0, 0 index: -1 +dragon_knight_freeze + rotate: false + xy: 407, 2 + size: 99, 99 + orig: 99, 99 + offset: 0, 0 + index: -1 dragon_knight_attack rotate: false xy: 2, 308 diff --git a/source/core/assets/images/mobs/dragon_knight.png b/source/core/assets/images/mobs/dragon_knight.png index 85bcd9340668a2660ac3be744f860765a283ef6e..2a18fb0c014f95ab9b36c623bd4a70ab4ed30acf 100644 GIT binary patch literal 4228 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≀;q5I z^7jF+E^*x|*1UpIuGEFi54_2?UyPo9=@N&1V2d#Fpwq89_t`euy`Ww8K`89FNV5Nu zQ_f8%yXdmdU8dQ|=9e-CB$m{HxO>CPWx^7XjLCNweUfax?5f9DCD{mRW}K@kx<9M#*#5ly1Ao%sUg!4TvNSdoBo5k|8nZ@ZlP~tCgd2RcdIg>Z0HC3&d$;(ub;$n! D*y2tw diff --git a/source/core/assets/images/mobs/fire_worm.atlas b/source/core/assets/images/mobs/fire_worm.atlas index d647dd3a1..4014b6279 100644 --- a/source/core/assets/images/mobs/fire_worm.atlas +++ b/source/core/assets/images/mobs/fire_worm.atlas @@ -130,6 +130,13 @@ fire_worm_death orig: 75, 75 offset: 0, 0 index: -1 +fire_worm_freeze + rotate: false + xy: 770, 2 + size: 75, 75 + orig: 75, 75 + offset: 0, 0 + index: -1 fire_worm_death rotate: false xy: 2, 156 diff --git a/source/core/assets/images/mobs/fire_worm.png b/source/core/assets/images/mobs/fire_worm.png index 9311b527aa2349b3e325b8514f794283ae4e7349..ab3cf4698357fc326ab8c8bca602606d7bc3b6bb 100644 GIT binary patch literal 40405 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 literal 30034 zcmdp-^;=s}^WcM&LMbhU0>w*#(4xhiP@uTGySrHy0_tRH%=R+M#?pK#t{UAD&h}M1evs`WU9P=%sz0$eDay@Jz65Z{49+q zI@(Ws@t@feg`(J)))c)T3DG&;Pfw%22qJVCGrlZ;|1L!0=bO5`d$1i;H$}tgq=FOb zR&n?!Jmq`J?=e~KcPMOEYXaG(pb5bj!~VYy(g{|c-e%MP`%~3-b?19@fd5{kDkk3# zr6y$n{P%){hF9r;2nMwOp5v<$98(2yzUsvR{8x0bJSGreO8f6w7-k(5Vni*iIRwmUqLW&SU-6NDvkxuvT+r;p45LM@%Tfk7a9h}Md^|Cnjn@jNy5(jKo_&>W&RG@ivHyz-E&*RS_JASEqwVYwv43y z3fi=8DC~xDL@fdl207NjN&HTY);A2Z+rRof&cgC&id8l>rCVZ3Aww`7gRlblPq)g}5-I}Hht7>EapD1Q$k0V1oj%Z!ZdGw? z#o~)CD=I2mI9KBjzC7f}=mycdWlM_asnVKI4@;$d`ae1K@OSo=1@1fs_}0CbF5Wx?ckocg=kp zHo^Ah=dOvse1p-bAb5}V#-hVlSaJ#AfDUbf4?#9?m|S47>Cuo&F=4t^Tvl^P)f^$XtK207lytV%x5To&URC61mcOSmeO^rCNFTKz6wvD|XJ0wx_ zogu-Yq5BDpQGVy+a?myURC($UKxVc@y?!FZQs z%q2s_`CX-!%-lNtf*++|XGq+poyJ;GmG^~&*)gC(C&4IB)H*lt}lg<~XHU4vM`a6jKgx!u=k`PH_d^hYR5Ar*`dxIo4 z%>W)S-wO05PcMbB7-A^E`%0*?j${}(tAP|46b}4jbACOB8RR3Z!Bt6wbKiZ`esD@bL}Cypp)|HR;pR=oZ7|l4qvw0vX*<)~cD` z^0mARUNNoO_1rwV<(KKTxGB}eyi$oJ=(&3MW;4$e92BrlXV~p~&&_=0il0LTJy1CP zo`Z-FeE2)*q<9O>>Fils<1x8u>#N+P;=W=kiVsBmgjl8d-Z%1D?EUG<09*dCQG766 z*Q8amWI!t{iAe&WaXjF%1jOI!Y5;c%2SMCu`3fR;6pHBk5<$8WADU=F5>kVV(A&_ZOyxyzj_ye#ltRWh(5JctJ; zcHa4-I?DG6*Ju+rgM##aA1(dQ2u<+H`Prk9%~dUOBkZ){#))}Cry{5&)IH_8tiVY) z*lbRpqFy$jWuxh)4W73$Ke6OFZ6w0`VDJf-%OV>9xOiYPAM+yLt;y*z%ElcP`9P8h zz&BEb5;zmQ-SBdGh%(jskJ=?)w+R{Yr!hr!2;=N;D&lLL9vWF$gUKGQo6H{Xi~03# zde;J+ii83JCMCeR9HtL+JOfAYS~FFVP)*Ii3X*B|a=aMf(@=$bgI)=yTD17&GKHpA zsBqhuUbm+%9fYy4IYBe}eeBuqu&sqg!k)A!6M+wg+@K^JKs~=1^rU!(+M9wa2NQt& z@Q4ZEs{TaCVXDpebmO+aUVB%DzeuMJuJzH;;#Vz`CB-Hcaz^;aWEyI`l+(N@m;E_& zc7J#Ry;@=O(BMY-`Q&=kMBPJP3K5ucHsPqFB?AO}Y zkpx?6RJC_^*&%t47X?P`P|!t|>}`f3z__2fp_fk7h5<0`Wt$Oc(I@maWDpo9P8rSj z;bt`tsqY=g<@-yw>;=t7OOxY{$15}3>ZddzP4e&I)(PX!a+?VhzoS=lf1c@BQ9LJW z%5>j(9|T5hUQNhEsO=T|0JiQMf&Uw=Ac1gyE03~M+8|PMM0A7 z-3(@t!f4=Vm6~uwTy2Yd z3qLbZC!!+75&pALRYVg@K`h&4lqV7=$j0b5vxN^KAnmjhx2EB5(AhRz`N7w{>CYWS zzC^od-$Mp3)h}u-*3LREgmrThyX+YU&5GR_A5FXptzDSd;U{bw78;qoc)(ayC zL2_wY9C#@3{Brhy{ueZQ$R3}%z%1Hk9^IpS`8xqDzsGCg1^M6vI6v^!73iuz^o;r- zRdH!*&2I}Y^jdf&U5C1IXsUQ5B|SyG2HIU`sZhW@V!AG)*WS)xzrz5iJAbKwUgi{O z2+iXBU7aqBqorfr>!pey{D|yHn_6Q0{?wkfa%)^<2;$6K5eb@H^HRFWx<73Z(UC^V zS(AOm1B*b0%Hp}jX<%RVEN639`orn&t2-pgN$=(??)sjQ|2 zwDhCi<}%&d$VSBCF;(;LmFH}sXF5i9;d!AziKr48;-QJ9pE-PXa^ZM^!|v#!9`J)$ zNZV7V4q}uwVm)eeRI5-JNC48!=N2r%+8d^cv!lrc`#h3&m=q>U=bwynRF-#MD7{|n`6s!r8}FmP3J@_#RgaCvNi4w zsjbaHkxfcV@*UOZ8-d7AnSnRMQAZDSfaY<@Yx9-v-zRSZEpk47Z6nHN{-mHx-rPW~ zqsoSZjP7-@9jbj}YghfehXDaQ^$uXfmT wtcu*sy!*KpkjJ!!Wv&8pLUcC4iMK)6nc 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 R=DTOsP|;DYQhfLMe*nZyYkB|x diff --git a/source/core/assets/images/mobs/fire_worm_attack.atlas b/source/core/assets/images/mobs/fire_worm_attack.atlas index c8d2e2d1f..fcb3d0597 100644 --- a/source/core/assets/images/mobs/fire_worm_attack.atlas +++ b/source/core/assets/images/mobs/fire_worm_attack.atlas @@ -1,118 +1,118 @@ - -fire_worm_attack.png -size: 256, 512 -format: RGBA8888 -filter: Nearest, Nearest -repeat: none -fire_worm_attack1 - rotate: false - xy: 2, 156 - size: 75, 75 - orig: 75, 75 - offset: 0, 0 - index: -1 -fire_worm_attack10 - rotate: false - xy: 2, 79 - size: 75, 75 - orig: 75, 75 - offset: 0, 0 - index: -1 -fire_worm_attack11 - rotate: false - xy: 79, 387 - size: 75, 75 - orig: 75, 75 - offset: 0, 0 - index: -1 -fire_worm_attack12 - rotate: false - xy: 79, 79 - size: 75, 75 - orig: 75, 75 - offset: 0, 0 - index: -1 -fire_worm_attack13 - rotate: false - xy: 79, 233 - size: 75, 75 - orig: 75, 75 - offset: 0, 0 - index: -1 -fire_worm_attack14 - rotate: false - xy: 2, 387 - size: 75, 75 - orig: 75, 75 - offset: 0, 0 - index: -1 -fire_worm_attack15 - rotate: false - xy: 156, 233 - size: 75, 75 - orig: 75, 75 - offset: 0, 0 - index: -1 -fire_worm_attack16 - rotate: false - xy: 79, 310 - size: 75, 75 - orig: 75, 75 - offset: 0, 0 - index: -1 -fire_worm_attack2 - rotate: false - xy: 79, 2 - size: 75, 75 - orig: 75, 75 - offset: 0, 0 - index: -1 -fire_worm_attack3 - rotate: false - xy: 79, 156 - size: 75, 75 - orig: 75, 75 - offset: 0, 0 - index: -1 -fire_worm_attack4 - rotate: false - xy: 2, 233 - size: 75, 75 - orig: 75, 75 - offset: 0, 0 - index: -1 -fire_worm_attack5 - rotate: false - xy: 156, 156 - size: 75, 75 - orig: 75, 75 - offset: 0, 0 - index: -1 -fire_worm_attack6 - rotate: false - xy: 156, 310 - size: 75, 75 - orig: 75, 75 - offset: 0, 0 - index: -1 -fire_worm_attack7 - rotate: false - xy: 2, 310 - size: 75, 75 - orig: 75, 75 - offset: 0, 0 - index: -1 -fire_worm_attack8 - rotate: false - xy: 2, 2 - size: 75, 75 - orig: 75, 75 - offset: 0, 0 - index: -1 -fire_worm_attack9 - rotate: false - xy: 156, 387 - size: 75, 75 - orig: 75, 75 - offset: 0, 0 - index: -1 + +fire_worm_attack.png +size: 256, 512 +format: RGBA8888 +filter: Nearest, Nearest +repeat: none +fire_worm_attack1 + rotate: false + xy: 2, 156 + size: 75, 75 + orig: 75, 75 + offset: 0, 0 + index: -1 +fire_worm_attack10 + rotate: false + xy: 2, 79 + size: 75, 75 + orig: 75, 75 + offset: 0, 0 + index: -1 +fire_worm_attack11 + rotate: false + xy: 79, 387 + size: 75, 75 + orig: 75, 75 + offset: 0, 0 + index: -1 +fire_worm_attack12 + rotate: false + xy: 79, 79 + size: 75, 75 + orig: 75, 75 + offset: 0, 0 + index: -1 +fire_worm_attack13 + rotate: false + xy: 79, 233 + size: 75, 75 + orig: 75, 75 + offset: 0, 0 + index: -1 +fire_worm_attack14 + rotate: false + xy: 2, 387 + size: 75, 75 + orig: 75, 75 + offset: 0, 0 + index: -1 +fire_worm_attack15 + rotate: false + xy: 156, 233 + size: 75, 75 + orig: 75, 75 + offset: 0, 0 + index: -1 +fire_worm_attack16 + rotate: false + xy: 79, 310 + size: 75, 75 + orig: 75, 75 + offset: 0, 0 + index: -1 +fire_worm_attack2 + rotate: false + xy: 79, 2 + size: 75, 75 + orig: 75, 75 + offset: 0, 0 + index: -1 +fire_worm_attack3 + rotate: false + xy: 79, 156 + size: 75, 75 + orig: 75, 75 + offset: 0, 0 + index: -1 +fire_worm_attack4 + rotate: false + xy: 2, 233 + size: 75, 75 + orig: 75, 75 + offset: 0, 0 + index: -1 +fire_worm_attack5 + rotate: false + xy: 156, 156 + size: 75, 75 + orig: 75, 75 + offset: 0, 0 + index: -1 +fire_worm_attack6 + rotate: false + xy: 156, 310 + size: 75, 75 + orig: 75, 75 + offset: 0, 0 + index: -1 +fire_worm_attack7 + rotate: false + xy: 2, 310 + size: 75, 75 + orig: 75, 75 + offset: 0, 0 + index: -1 +fire_worm_attack8 + rotate: false + xy: 2, 2 + size: 75, 75 + orig: 75, 75 + offset: 0, 0 + index: -1 +fire_worm_attack9 + rotate: false + xy: 156, 387 + size: 75, 75 + orig: 75, 75 + offset: 0, 0 + index: -1 diff --git a/source/core/assets/images/mobs/fire_worm_walk b/source/core/assets/images/mobs/fire_worm_walk index 0cb3f5ec3..bea8b8b25 100644 --- a/source/core/assets/images/mobs/fire_worm_walk +++ b/source/core/assets/images/mobs/fire_worm_walk @@ -1,69 +1,69 @@ - -fire_worm_walk.png -size: 1024, 128 -format: RGBA8888 -filter: Nearest, Nearest -repeat: none -fire_worm_walk1 - rotate: false - xy: 646, 2 - size: 90, 90 - orig: 90, 90 - offset: 0, 0 - index: -1 -fire_worm_walk2 - rotate: false - xy: 278, 2 - size: 90, 90 - orig: 90, 90 - offset: 0, 0 - index: -1 -fire_worm_walk3 - rotate: false - xy: 2, 2 - size: 90, 90 - orig: 90, 90 - offset: 0, 0 - index: -1 -fire_worm_walk4 - rotate: false - xy: 462, 2 - size: 90, 90 - orig: 90, 90 - offset: 0, 0 - index: -1 -fire_worm_walk5 - rotate: false - xy: 186, 2 - size: 90, 90 - orig: 90, 90 - offset: 0, 0 - index: -1 -fire_worm_walk6 - rotate: false - xy: 738, 2 - size: 90, 90 - orig: 90, 90 - offset: 0, 0 - index: -1 -fire_worm_walk7 - rotate: false - xy: 370, 2 - size: 90, 90 - orig: 90, 90 - offset: 0, 0 - index: -1 -fire_worm_walk8 - rotate: false - xy: 94, 2 - size: 90, 90 - orig: 90, 90 - offset: 0, 0 - index: -1 -fire_worm_walk9 - rotate: false - xy: 554, 2 - size: 90, 90 - orig: 90, 90 - offset: 0, 0 - index: -1 + +fire_worm_walk.png +size: 1024, 128 +format: RGBA8888 +filter: Nearest, Nearest +repeat: none +fire_worm_walk1 + rotate: false + xy: 646, 2 + size: 90, 90 + orig: 90, 90 + offset: 0, 0 + index: -1 +fire_worm_walk2 + rotate: false + xy: 278, 2 + size: 90, 90 + orig: 90, 90 + offset: 0, 0 + index: -1 +fire_worm_walk3 + rotate: false + xy: 2, 2 + size: 90, 90 + orig: 90, 90 + offset: 0, 0 + index: -1 +fire_worm_walk4 + rotate: false + xy: 462, 2 + size: 90, 90 + orig: 90, 90 + offset: 0, 0 + index: -1 +fire_worm_walk5 + rotate: false + xy: 186, 2 + size: 90, 90 + orig: 90, 90 + offset: 0, 0 + index: -1 +fire_worm_walk6 + rotate: false + xy: 738, 2 + size: 90, 90 + orig: 90, 90 + offset: 0, 0 + index: -1 +fire_worm_walk7 + rotate: false + xy: 370, 2 + size: 90, 90 + orig: 90, 90 + offset: 0, 0 + index: -1 +fire_worm_walk8 + rotate: false + xy: 94, 2 + size: 90, 90 + orig: 90, 90 + offset: 0, 0 + index: -1 +fire_worm_walk9 + rotate: false + xy: 554, 2 + size: 90, 90 + orig: 90, 90 + offset: 0, 0 + index: -1 diff --git a/source/core/assets/images/mobs/firewizard.atlas b/source/core/assets/images/mobs/firewizard.atlas deleted file mode 100644 index dacee9afe..000000000 --- a/source/core/assets/images/mobs/firewizard.atlas +++ /dev/null @@ -1,160 +0,0 @@ - -firewizard.png -size: 2048, 128 -format: RGBA8888 -filter: Nearest, Nearest -repeat: none -firewizard_attack - rotate: false - xy: 492, 8 - size: 96, 72 - orig: 96, 72 - offset: 0, 0 - index: -1 -firewizard_attack - rotate: false - xy: 296, 8 - size: 96, 72 - orig: 96, 72 - offset: 0, 0 - index: -1 -firewizard_attack - rotate: false - xy: 2, 8 - size: 96, 72 - orig: 96, 72 - offset: 0, 0 - index: -1 -firewizard_attack - rotate: false - xy: 394, 8 - size: 96, 72 - orig: 96, 72 - offset: 0, 0 - index: -1 -firewizard_attack - rotate: false - xy: 198, 8 - size: 96, 72 - orig: 96, 72 - offset: 0, 0 - index: -1 -firewizard_attack - rotate: false - xy: 688, 11 - size: 96, 69 - orig: 96, 69 - offset: 0, 0 - index: -1 -firewizard_attack - rotate: false - xy: 590, 11 - size: 96, 69 - orig: 96, 69 - offset: 0, 0 - index: -1 -firewizard_attack - rotate: false - xy: 100, 8 - size: 96, 72 - orig: 96, 72 - offset: 0, 0 - index: -1 -firewizard_death - rotate: false - xy: 1389, 16 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -firewizard_death - rotate: false - xy: 1521, 16 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -firewizard_death - rotate: false - xy: 1323, 16 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -firewizard_death - rotate: false - xy: 1587, 16 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -firewizard_death - rotate: false - xy: 1455, 16 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -firewizard_move - rotate: false - xy: 1189, 2 - size: 65, 78 - orig: 65, 78 - offset: 0, 0 - index: -1 -firewizard_move - rotate: false - xy: 988, 2 - size: 65, 78 - orig: 65, 78 - offset: 0, 0 - index: -1 -firewizard_mov - rotate: false - xy: 786, 2 - size: 66, 78 - orig: 66, 78 - offset: 0, 0 - index: -1 -firewizard_move - rotate: false - xy: 1122, 2 - size: 65, 78 - orig: 65, 78 - offset: 0, 0 - index: -1 -firewizard_move - rotate: false - xy: 921, 2 - size: 65, 78 - orig: 65, 78 - offset: 0, 0 - index: -1 -firewizard_move - rotate: false - xy: 1256, 2 - size: 65, 78 - orig: 65, 78 - offset: 0, 0 - index: -1 -firewizard_move - rotate: false - xy: 1055, 2 - size: 65, 78 - orig: 65, 78 - offset: 0, 0 - index: -1 -firewizard_move - rotate: false - xy: 854, 2 - size: 65, 78 - orig: 65, 78 - offset: 0, 0 - index: -1 -default - rotate: false - xy: 854, 2 - size: 65, 78 - orig: 65, 78 - offset: 0, 0 - index: -1 \ No newline at end of file diff --git a/source/core/assets/images/mobs/firewizard.png b/source/core/assets/images/mobs/firewizard.png deleted file mode 100644 index d612b5352da14b1c4333aca4246e13e3024014e2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26405 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 diff --git a/source/core/assets/images/mobs/necromancer.atlas b/source/core/assets/images/mobs/necromancer.atlas deleted file mode 100644 index b83e6c86f..000000000 --- a/source/core/assets/images/mobs/necromancer.atlas +++ /dev/null @@ -1,167 +0,0 @@ - -necromancer.png -size: 2048, 256 -format: RGBA8888 -filter: Nearest, Nearest -repeat: none -necromancer_attack - rotate: false - xy: 304, 5 - size: 70, 105 - orig: 70, 105 - offset: 0, 0 - index: -1 -necromancer_attack - rotate: false - xy: 1558, 116 - size: 70, 110 - orig: 70, 110 - offset: 0, 0 - index: -1 -necromancer_attack - rotate: false - xy: 1702, 121 - size: 70, 105 - orig: 70, 105 - offset: 0, 0 - index: -1 -necromancer_attack - rotate: false - xy: 1630, 121 - size: 70, 105 - orig: 70, 105 - offset: 0, 0 - index: -1 -necromancer_attack - rotate: false - xy: 1774, 121 - size: 70, 105 - orig: 70, 105 - offset: 0, 0 - index: -1 -necromancer_attack - rotate: false - xy: 160, 5 - size: 70, 105 - orig: 70, 105 - offset: 0, 0 - index: -1 -necromancer_attack - rotate: false - xy: 88, 5 - size: 70, 105 - orig: 70, 105 - offset: 0, 0 - index: -1 -necromancer_attack - rotate: false - xy: 232, 5 - size: 70, 105 - orig: 70, 105 - offset: 0, 0 - index: -1 -necromancer_attack - rotate: false - xy: 2, 112 - size: 1554, 114 - orig: 1554, 114 - offset: 0, 0 - index: -1 -necromancer_attack - rotate: false - xy: 2, 2 - size: 84, 108 - orig: 84, 108 - offset: 0, 0 - index: -1 -necromancer_death - rotate: false - xy: 601, 37 - size: 73, 73 - orig: 73, 73 - offset: 0, 0 - index: -1 -necromancer_death - rotate: false - xy: 451, 37 - size: 73, 73 - orig: 73, 73 - offset: 0, 0 - index: -1 -necromancer_death - rotate: false - xy: 376, 37 - size: 73, 73 - orig: 73, 73 - offset: 0, 0 - index: -1 -necromancer_death - rotate: false - xy: 526, 37 - size: 73, 73 - orig: 73, 73 - offset: 0, 0 - index: -1 -necromancer_death - rotate: false - xy: 1921, 153 - size: 73, 73 - orig: 73, 73 - offset: 0, 0 - index: -1 -necromancer_death - rotate: false - xy: 1846, 153 - size: 73, 73 - orig: 73, 73 - offset: 0, 0 - index: -1 -necromancer_walk - rotate: false - xy: 676, 37 - size: 69, 73 - orig: 69, 73 - offset: 0, 0 - index: -1 -necromancer_walk - rotate: false - xy: 960, 37 - size: 69, 73 - orig: 69, 73 - offset: 0, 0 - index: -1 -necromancer_walk - rotate: false - xy: 818, 37 - size: 69, 73 - orig: 69, 73 - offset: 0, 0 - index: -1 -necromancer_walk - rotate: false - xy: 1031, 37 - size: 69, 73 - orig: 69, 73 - offset: 0, 0 - index: -1 -necromancer_walk - rotate: false - xy: 889, 37 - size: 69, 73 - orig: 69, 73 - offset: 0, 0 - index: -1 -necromancer_walk - rotate: false - xy: 747, 37 - size: 69, 73 - orig: 69, 73 - offset: 0, 0 - index: -1 -default - rotate: false - xy: 747, 37 - size: 69, 73 - orig: 69, 73 - offset: 0, 0 - index: -1 \ No newline at end of file diff --git a/source/core/assets/images/mobs/necromancer.png b/source/core/assets/images/mobs/necromancer.png deleted file mode 100644 index c86c5cc2cce0b90a51c1571457acf12043bd37c9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 38038 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 diff --git a/source/core/assets/images/mobs/night_borne.atlas b/source/core/assets/images/mobs/night_borne.atlas index bc5f17c49..e01ece4c4 100644 --- a/source/core/assets/images/mobs/night_borne.atlas +++ b/source/core/assets/images/mobs/night_borne.atlas @@ -1,251 +1,251 @@ - -night_borne.png -size: 2048, 128 -format: RGBA8888 -filter: Nearest, Nearest -repeat: none -night_borne_attack - rotate: false - xy: 84, 13 - size: 80, 50 - orig: 80, 50 - offset: 0, 0 - index: -1 -night_borne_attack - rotate: false - xy: 2, 54 - size: 80, 61 - orig: 80, 61 - offset: 0, 0 - index: -1 -night_borne_attack - rotate: false - xy: 1232, 65 - size: 80, 50 - orig: 80, 50 - offset: 0, 0 - index: -1 -night_borne_attack - rotate: false - xy: 740, 13 - size: 80, 50 - orig: 80, 50 - offset: 0, 0 - index: -1 -night_borne_attack - rotate: false - xy: 822, 65 - size: 80, 50 - orig: 80, 50 - offset: 0, 0 - index: -1 -night_borne_attack - rotate: false - xy: 330, 13 - size: 80, 50 - orig: 80, 50 - offset: 0, 0 - index: -1 -night_borne_attack - rotate: false - xy: 1068, 13 - size: 80, 50 - orig: 80, 50 - offset: 0, 0 - index: -1 -night_borne_attack - rotate: false - xy: 658, 65 - size: 80, 50 - orig: 80, 50 - offset: 0, 0 - index: -1 -night_borne_attack - rotate: false - xy: 166, 13 - size: 80, 50 - orig: 80, 50 - offset: 0, 0 - index: -1 -night_borne_attack - rotate: false - xy: 904, 65 - size: 80, 50 - orig: 80, 50 - offset: 0, 0 - index: -1 -night_borne_attack - rotate: false - xy: 412, 13 - size: 80, 50 - orig: 80, 50 - offset: 0, 0 - index: -1 -night_borne_attack - rotate: false - xy: 1150, 13 - size: 80, 50 - orig: 80, 50 - offset: 0, 0 - index: -1 -night_borne_death - rotate: false - xy: 1232, 19 - size: 70, 44 - orig: 70, 44 - offset: 0, 0 - index: -1 -night_borne_death - rotate: false - xy: 904, 13 - size: 80, 50 - orig: 80, 50 - offset: 0, 0 - index: -1 -night_borne_death - rotate: false - xy: 904, 13 - size: 80, 50 - orig: 80, 50 - offset: 0, 0 - index: -1 -night_borne_death - rotate: false - xy: 412, 65 - size: 80, 50 - orig: 80, 50 - offset: 0, 0 - index: -1 -night_borne_death - rotate: false - xy: 740, 65 - size: 80, 50 - orig: 80, 50 - offset: 0, 0 - index: -1 -night_borne_death - rotate: false - xy: 248, 13 - size: 80, 50 - orig: 80, 50 - offset: 0, 0 - index: -1 -night_borne_death - rotate: false - xy: 986, 13 - size: 80, 50 - orig: 80, 50 - offset: 0, 0 - index: -1 -night_borne_death - rotate: false - xy: 576, 65 - size: 80, 50 - orig: 80, 50 - offset: 0, 0 - index: -1 -night_borne_death - rotate: false - xy: 84, 65 - size: 80, 50 - orig: 80, 50 - offset: 0, 0 - index: -1 -night_borne_death - rotate: false - xy: 822, 13 - size: 80, 50 - orig: 80, 50 - offset: 0, 0 - index: -1 -night_borne_death - rotate: false - xy: 330, 65 - size: 80, 50 - orig: 80, 50 - offset: 0, 0 - index: -1 -night_borne_death - rotate: false - xy: 1068, 65 - size: 80, 50 - orig: 80, 50 - offset: 0, 0 - index: -1 -night_borne_death - rotate: false - xy: 576, 13 - size: 80, 50 - orig: 80, 50 - offset: 0, 0 - index: -1 -night_borne_death - rotate: false - xy: 576, 13 - size: 80, 50 - orig: 80, 50 - offset: 0, 0 - index: -1 -night_borne_death - rotate: false - xy: 166, 65 - size: 80, 50 - orig: 80, 50 - offset: 0, 0 - index: -1 -night_borne_death - rotate: false - xy: 494, 13 - size: 80, 50 - orig: 80, 50 - offset: 0, 0 - index: -1 -night_borne_run - rotate: false - xy: 1150, 65 - size: 80, 50 - orig: 80, 50 - offset: 0, 0 - index: -1 -night_borne_run - rotate: false - xy: 658, 13 - size: 80, 50 - orig: 80, 50 - offset: 0, 0 - index: -1 -night_borne_run - rotate: false - xy: 248, 65 - size: 80, 50 - orig: 80, 50 - offset: 0, 0 - index: -1 -night_borne_run - rotate: false - xy: 986, 65 - size: 80, 50 - orig: 80, 50 - offset: 0, 0 - index: -1 -night_borne_run - rotate: false - xy: 494, 65 - size: 80, 50 - orig: 80, 50 - offset: 0, 0 - index: -1 -night_borne_run - rotate: false - xy: 2, 2 - size: 80, 50 - orig: 80, 50 - offset: 0, 0 - index: -1 -default - rotate: false - xy: 2, 2 - size: 80, 50 - orig: 80, 50 - offset: 0, 0 - index: -1 + +night_borne.png +size: 2048, 128 +format: RGBA8888 +filter: Nearest, Nearest +repeat: none +night_borne_attack + rotate: false + xy: 84, 13 + size: 80, 50 + orig: 80, 50 + offset: 0, 0 + index: -1 +night_borne_attack + rotate: false + xy: 2, 54 + size: 80, 61 + orig: 80, 61 + offset: 0, 0 + index: -1 +night_borne_attack + rotate: false + xy: 1232, 65 + size: 80, 50 + orig: 80, 50 + offset: 0, 0 + index: -1 +night_borne_attack + rotate: false + xy: 740, 13 + size: 80, 50 + orig: 80, 50 + offset: 0, 0 + index: -1 +night_borne_attack + rotate: false + xy: 822, 65 + size: 80, 50 + orig: 80, 50 + offset: 0, 0 + index: -1 +night_borne_attack + rotate: false + xy: 330, 13 + size: 80, 50 + orig: 80, 50 + offset: 0, 0 + index: -1 +night_borne_attack + rotate: false + xy: 1068, 13 + size: 80, 50 + orig: 80, 50 + offset: 0, 0 + index: -1 +night_borne_attack + rotate: false + xy: 658, 65 + size: 80, 50 + orig: 80, 50 + offset: 0, 0 + index: -1 +night_borne_attack + rotate: false + xy: 166, 13 + size: 80, 50 + orig: 80, 50 + offset: 0, 0 + index: -1 +night_borne_attack + rotate: false + xy: 904, 65 + size: 80, 50 + orig: 80, 50 + offset: 0, 0 + index: -1 +night_borne_attack + rotate: false + xy: 412, 13 + size: 80, 50 + orig: 80, 50 + offset: 0, 0 + index: -1 +night_borne_attack + rotate: false + xy: 1150, 13 + size: 80, 50 + orig: 80, 50 + offset: 0, 0 + index: -1 +night_borne_death + rotate: false + xy: 1232, 19 + size: 70, 44 + orig: 70, 44 + offset: 0, 0 + index: -1 +night_borne_death + rotate: false + xy: 904, 13 + size: 80, 50 + orig: 80, 50 + offset: 0, 0 + index: -1 +night_borne_death + rotate: false + xy: 904, 13 + size: 80, 50 + orig: 80, 50 + offset: 0, 0 + index: -1 +night_borne_death + rotate: false + xy: 412, 65 + size: 80, 50 + orig: 80, 50 + offset: 0, 0 + index: -1 +night_borne_death + rotate: false + xy: 740, 65 + size: 80, 50 + orig: 80, 50 + offset: 0, 0 + index: -1 +night_borne_death + rotate: false + xy: 248, 13 + size: 80, 50 + orig: 80, 50 + offset: 0, 0 + index: -1 +night_borne_death + rotate: false + xy: 986, 13 + size: 80, 50 + orig: 80, 50 + offset: 0, 0 + index: -1 +night_borne_death + rotate: false + xy: 576, 65 + size: 80, 50 + orig: 80, 50 + offset: 0, 0 + index: -1 +night_borne_death + rotate: false + xy: 84, 65 + size: 80, 50 + orig: 80, 50 + offset: 0, 0 + index: -1 +night_borne_death + rotate: false + xy: 822, 13 + size: 80, 50 + orig: 80, 50 + offset: 0, 0 + index: -1 +night_borne_death + rotate: false + xy: 330, 65 + size: 80, 50 + orig: 80, 50 + offset: 0, 0 + index: -1 +night_borne_death + rotate: false + xy: 1068, 65 + size: 80, 50 + orig: 80, 50 + offset: 0, 0 + index: -1 +night_borne_death + rotate: false + xy: 576, 13 + size: 80, 50 + orig: 80, 50 + offset: 0, 0 + index: -1 +night_borne_death + rotate: false + xy: 576, 13 + size: 80, 50 + orig: 80, 50 + offset: 0, 0 + index: -1 +night_borne_death + rotate: false + xy: 166, 65 + size: 80, 50 + orig: 80, 50 + offset: 0, 0 + index: -1 +night_borne_death + rotate: false + xy: 494, 13 + size: 80, 50 + orig: 80, 50 + offset: 0, 0 + index: -1 +night_borne_run + rotate: false + xy: 1150, 65 + size: 80, 50 + orig: 80, 50 + offset: 0, 0 + index: -1 +night_borne_run + rotate: false + xy: 658, 13 + size: 80, 50 + orig: 80, 50 + offset: 0, 0 + index: -1 +night_borne_run + rotate: false + xy: 248, 65 + size: 80, 50 + orig: 80, 50 + offset: 0, 0 + index: -1 +night_borne_run + rotate: false + xy: 986, 65 + size: 80, 50 + orig: 80, 50 + offset: 0, 0 + index: -1 +night_borne_run + rotate: false + xy: 494, 65 + size: 80, 50 + orig: 80, 50 + offset: 0, 0 + index: -1 +night_borne_run + rotate: false + xy: 2, 2 + size: 80, 50 + orig: 80, 50 + offset: 0, 0 + index: -1 +default + rotate: false + xy: 2, 2 + size: 80, 50 + orig: 80, 50 + offset: 0, 0 + index: -1 diff --git a/source/core/assets/images/mobs/rangeBossRight.atlas b/source/core/assets/images/mobs/rangeBossRight.atlas index e96a1893f..7403df738 100644 --- a/source/core/assets/images/mobs/rangeBossRight.atlas +++ b/source/core/assets/images/mobs/rangeBossRight.atlas @@ -1,54 +1,54 @@ -rangeBossRight.png -size: 243, 62 -format: RGBA8888 -filter: Linear,Linear -repeat: none -Walk - rotate: false - xy: 205, 0 - size: 38, 61 - orig: 96, 114 - offset: 15, 30 - index: -1 -Walk - rotate: false - xy: 123, 0 - size: 35, 62 - orig: 96, 114 - offset: 15, 30 - index: -1 -Walk - rotate: false - xy: 0, 0 - size: 43, 62 - orig: 96, 114 - offset: 10, 30 - index: -1 -Walk - rotate: false - xy: 158, 0 - size: 47, 61 - orig: 96, 114 - offset: 8, 30 - index: -1 -Walk - rotate: false - xy: 43, 0 - size: 43, 62 - orig: 96, 114 - offset: 10, 30 - index: -1 -Walk - rotate: false - xy: 86, 0 - size: 37, 62 - orig: 96, 114 - offset: 15, 30 - index: -1 -default - rotate: false - xy: 86, 0 - size: 37, 62 - orig: 96, 114 - offset: 15, 30 - index: -1 +rangeBossRight.png +size: 243, 62 +format: RGBA8888 +filter: Linear,Linear +repeat: none +Walk + rotate: false + xy: 205, 0 + size: 38, 61 + orig: 96, 114 + offset: 15, 30 + index: -1 +Walk + rotate: false + xy: 123, 0 + size: 35, 62 + orig: 96, 114 + offset: 15, 30 + index: -1 +Walk + rotate: false + xy: 0, 0 + size: 43, 62 + orig: 96, 114 + offset: 10, 30 + index: -1 +Walk + rotate: false + xy: 158, 0 + size: 47, 61 + orig: 96, 114 + offset: 8, 30 + index: -1 +Walk + rotate: false + xy: 43, 0 + size: 43, 62 + orig: 96, 114 + offset: 10, 30 + index: -1 +Walk + rotate: false + xy: 86, 0 + size: 37, 62 + orig: 96, 114 + offset: 15, 30 + index: -1 +default + rotate: false + xy: 86, 0 + size: 37, 62 + orig: 96, 114 + offset: 15, 30 + index: -1 diff --git a/source/core/assets/images/mobs/robot.atlas b/source/core/assets/images/mobs/robot.atlas index 843e14ce1..9021ebcc7 100644 --- a/source/core/assets/images/mobs/robot.atlas +++ b/source/core/assets/images/mobs/robot.atlas @@ -1,56 +1,56 @@ -robot.png -size: 1024, 256 -format: RGBA8888 -filter: Linear,Linear -repeat: none -Walk - rotate: false - xy: 334, 34 - size: 30, 74 - orig: 30, 74 - offset: 46, -54 - index: -1 -Walk - rotate: false - xy: 632, 34 - size: 30, 73 - orig: 30, 73 - offset: 46, -55 - index: -1 -Walk - rotate: false - xy: 781, 34 - size: 32, 72 - orig: 32, 72 - offset: 46, -56 - index: -1 -Walk - rotate: false - xy: 483, 34 - size: 30, 73 - orig: 30, 73 - offset: 46, -55 - index: -1 -Walk - rotate: false - xy: 185, 34 - size: 30, 74 - orig: 30, 74 - offset: 46, -54 - index: -1 -Walk - rotate: false - xy: 34, 34 - size: 32, 75 - orig: 32, 75 - offset: 46, -53 - index: -1 -default - rotate: false - xy: 34, 34 - size: 32, 75 - orig: 32, 75 - offset: 46, -53 - index: -1 - - +robot.png +size: 1024, 256 +format: RGBA8888 +filter: Linear,Linear +repeat: none +Walk + rotate: false + xy: 334, 34 + size: 30, 74 + orig: 30, 74 + offset: 46, -54 + index: -1 +Walk + rotate: false + xy: 632, 34 + size: 30, 73 + orig: 30, 73 + offset: 46, -55 + index: -1 +Walk + rotate: false + xy: 781, 34 + size: 32, 72 + orig: 32, 72 + offset: 46, -56 + index: -1 +Walk + rotate: false + xy: 483, 34 + size: 30, 73 + orig: 30, 73 + offset: 46, -55 + index: -1 +Walk + rotate: false + xy: 185, 34 + size: 30, 74 + orig: 30, 74 + offset: 46, -54 + index: -1 +Walk + rotate: false + xy: 34, 34 + size: 32, 75 + orig: 32, 75 + offset: 46, -53 + index: -1 +default + rotate: false + xy: 34, 34 + size: 32, 75 + orig: 32, 75 + offset: 46, -53 + index: -1 + + diff --git a/source/core/assets/images/mobs/rocky.atlas b/source/core/assets/images/mobs/rocky.atlas deleted file mode 100644 index c29e734ba..000000000 --- a/source/core/assets/images/mobs/rocky.atlas +++ /dev/null @@ -1,174 +0,0 @@ - -rocky.png -size: 512, 32 -format: RGBA8888 -filter: Nearest, Nearest -repeat: none -rocky_death - rotate: false - xy: 359, 7 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -rocky_death - rotate: false - xy: 449, 7 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -rocky_death - rotate: false - xy: 395, 7 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -rocky_death - rotate: false - xy: 341, 6 - size: 16, 17 - orig: 16, 17 - offset: 0, 0 - index: -1 -rocky_death - rotate: false - xy: 431, 7 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -rocky_death - rotate: false - xy: 377, 7 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -rocky_death - rotate: false - xy: 467, 7 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -rocky_death - rotate: false - xy: 413, 7 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -rocky_move - rotate: false - xy: 231, 3 - size: 20, 20 - orig: 20, 20 - offset: 0, 0 - index: -1 -rocky_move - rotate: false - xy: 319, 3 - size: 20, 20 - orig: 20, 20 - offset: 0, 0 - index: -1 -rocky_move - rotate: false - xy: 275, 3 - size: 20, 20 - orig: 20, 20 - offset: 0, 0 - index: -1 -rocky_move - rotate: false - xy: 209, 3 - size: 20, 20 - orig: 20, 20 - offset: 0, 0 - index: -1 -rocky_move - rotate: false - xy: 297, 3 - size: 20, 20 - orig: 20, 20 - offset: 0, 0 - index: -1 -rocky_move - rotate: false - xy: 253, 3 - size: 20, 20 - orig: 20, 20 - offset: 0, 0 - index: -1 -rocky_move - rotate: false - xy: 187, 3 - size: 20, 20 - orig: 20, 20 - offset: 0, 0 - index: -1 -rocky_attack - rotate: false - xy: 164, 2 - size: 21, 21 - orig: 21, 21 - offset: 0, 0 - index: -1 -rocky_attack - rotate: false - xy: 95, 2 - size: 21, 21 - orig: 21, 21 - offset: 0, 0 - index: -1 -rocky_attack - rotate: false - xy: 49, 2 - size: 21, 21 - orig: 21, 21 - offset: 0, 0 - index: -1 -rocky_attack - rotate: false - xy: 141, 2 - size: 21, 21 - orig: 21, 21 - offset: 0, 0 - index: -1 -rocky_attack - rotate: false - xy: 2, 2 - size: 22, 21 - orig: 22, 21 - offset: 0, 0 - index: -1 -rocky_attack - rotate: false - xy: 26, 2 - size: 21, 21 - orig: 21, 21 - offset: 0, 0 - index: -1 -rocky_attack - rotate: false - xy: 118, 2 - size: 21, 21 - orig: 21, 21 - offset: 0, 0 - index: -1 -rocky_attack - rotate: false - xy: 72, 2 - size: 21, 21 - orig: 21, 21 - offset: 0, 0 - index: -1 -default - rotate: false - xy: 253, 3 - size: 20, 20 - orig: 20, 20 - offset: 0, 0 - index: -1 \ No newline at end of file diff --git a/source/core/assets/images/mobs/rocky.png b/source/core/assets/images/mobs/rocky.png deleted file mode 100644 index 86375354a08f317bd7e2c8dde4ff2bda06dcaa41..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3151 zcmV-V46yTwP)3py$^;29 z1Ng>ri zU;gJOC+CN`@p>y<&umcJ^k7MU1#QjiMF~ysMK2~z8E1N}mL&}*Qt4{YJYKY*d0X=b z!KFb5a?inRTDmB&x*1IxC(C|I-syhvt-(yM!$vyO8_UOrmwW0R%KPRW&7btZ_bgft z8YQOky#>EflfA$r+GG5CEls>p@PhSMX%FO`#l7WgHQKX0iFU2k<21=|Hs+-?nKBGd z3w>y@O8au!WMtaML(}B)>-`#*@>k|lRAW`0UZ|Ig_7iN7sgpZwavrRuuX$U_@O<*3 zLy^>+G!nt-bTQJ6G*yO&tM{!lz1dT*qlxR!et2(4pYy=w@CK*{jh1#dP*$exoAuPE zc|=T_4Q~NTnvQ<59TlXRBC(Nho7ZUDy`^#CkLjWwYo!i9sf`)eI6S8NiE*$_`?h$e zuzRjPYjUL8H`O*dNH^)D1ee!Z{w81_8o?Dq2cK?o>kdTL;6=HmjA;NC7M;>YYD`** zKpOSTWld#NZcZh=lIC#zEM9*3mv@%xiS%AM-o{tEC!!vgWQ@ovFm*wgnkIaJ$g z8`bns4>frdY*kNGvqmM|9Sb&!@xG6y6{-P5HG#4I_P?dzyGhW3hTnolO#6~x$!g@TubTa z%1CLb4o_gam)b-<*f-*jH;?er$-B$t5s|VIS4S` zyii^CYk{$u^K8_#gX)(K7PXpA{}r_vq~oZ?(xPoJpS^zBHd3FZF?|u9dIA3!$F*bh z%2B(pdjnAi1A?A_hIBd!y~&p<1E_|@-riTH;A=FAT`fiZTm1U)aPhN){i!@HOUp5T zDRNplP0zdfgeK>)zC?d&IS6a_8t;JXpnjog_b{I9-x8bfS);i$-sT(LQrqKiZ}a!Y zF>f3kDOx<6&RBTJB=%;3%eIQ5P1>iMnu?C zt_7D-GqF=;0G-Gd_wV1Ig0GogPOFCRzJ7i2!Hw4!SRkNn|JvVN4!osEX|ZqBEO|%! z>Iv4u%0hWwJJotOEn5st`!`=boN2-@*9V$5o@`u|=;f1X)%?@#vjdA4z&m{M2FjaK z%@exP>bcYoU;gsF#TOsFweYk~Pfv%SaW>TnbOH@J@LFrY}Jo}GQFsU>&11e8T&hn zHkJjR(m&jPW48G41Su^(q?cSoELtYEmH|=|8R1RnlvWLQuI*V_vxUwUPG0D+kiuIE z)ne~F;aj|0yQZExyz^FXC0{_%&0i~oN9s|ELyYC-RJ_s;5t$ZcMp*U~sBd1bio zFfZWULbX3R9v)m&W?~h;pBx^buT^e_-RJqIukMHIg{OAp^)`QugPC4N3m{!8N=#|x zPy;WmetKbL>3WAK9RdNTH{q2* z+8S+3SL(Y>`qke;Snx(t^VHt*W~rnF-`{^VPLWmv<)z>>7JR5_t(!spnT-;b=FzJM zRVz>5M&Q6&Q#alGxxH)arruL=sX&ELX|1d+0(%t`#45&<4!U-juvd;>e02Wn^f89} z)G*Cu08e8~KSYaG4O|{JXa20^Sftoh@9012)5+^9noKXB%qBEbhtD2|PWEdWInTAe zfAsME#iK_*p4y|!dIXpJum0|sycCGHF{M!A;hX+f)h0u-C+A;Svp1xV~!p2ug z%lurwKCIzGjEB0}e8pRh+;4OA_h6`7>n3Tar&J(K3QlA53ZA%~Tk587G+GW@z3Q}e zP$5)aDmy#{?5!~AOw$I#^9Lu3=O3I*`y(*xXJoHJ$-xD1{~0|d;9zQQ~5P)!Yjl2s;%B@ zbT{P}Y2LqibI|s}#)WN6A0Hef_4LgWd%@qVm3p%TKgY+%SwD7Qd3-ncSd{8kuFJ{_Od-@<`ldIOM}AT^WDbW(wQ z>y%N_Xwj;H%Y*i)IfPuxmb0tgxetFaPA(^ZlO}_7PX4tubCcAfW%ENi%g37qFW9X< z0n(3tmV9bpfytGD``iZFzNml8LIvHPUKyl?Z}!ZeYx@pqdizBh%fn-U!|pveJ1{5p z^v#lOKvqXQnew>Gy;J{5^MV{Q>8xjgnV})AN`( zJRF{)XJetpJEyCS8o!i&X)Lsi2i95V%~CHvd>}!3{+D%f2NI)~r(QZ-H_O9c<6-kI z)vcG8O9hPfT!fV#W#lvvwOTb;K5y~JT}y#U&!Ft2YAH;U`FZUPVVYrIw9}byN$! zSSNKLF*f1p=;&w&%ZJaa=-3+;!}1yUx}{V%*3kO2)ag=TCcO!lyVgoc&%36i(ql36 z7P^#HEvlD`9PEW-7rZl?FBi3FzFb@sR(9{V3fn^cAucoO)r*USe01Bmk!O_+MRkyG zT|cYV%kZ>%dBVoOt`2{$(eX4^snex{DprhDQJq|*&~%($ua&g6jr!Up??Jkcya=u~ z)YsFZzwXA3yknjr zj?qi&GU@ct2!bF8b{JdOdweCt_q{ycH4nSq%TEs-qnFlY(&?cQ1VIq&IJ)5HB8R5U zMGj4yiyWFZ7bP@(E^=tvT;$NSxk#buauEbU5ClOG1VIo4K@bE%5ClOG1VIo4K@bE% p5ClOG1VIo4K@bE%5ClPx;D50DM^8S%q3{3z002ovPDHLkV1iCEQ&9i_ diff --git a/source/core/assets/images/mobs/skeleton.atlas b/source/core/assets/images/mobs/skeleton.atlas index f0117d879..75c312c80 100644 --- a/source/core/assets/images/mobs/skeleton.atlas +++ b/source/core/assets/images/mobs/skeleton.atlas @@ -46,6 +46,13 @@ skeleton_attack orig: 62, 48 offset: 0, 0 index: -1 +skeleton_freeze + rotate: false + xy: 1152, 2 + size: 62, 48 + orig: 62, 48 + offset: 0, 0 + index: -1 skeleton_attack rotate: false xy: 642, 2 diff --git a/source/core/assets/images/mobs/skeleton.png b/source/core/assets/images/mobs/skeleton.png index cbcbd1ed123c4a385f11fd030d7bfe924ac773e2..dd724a4bb4609d079421c1c61115335488233b29 100644 GIT binary patch literal 8096 zcmdUUXHZko)Avb2?^S8ik*ZV$r6eE-N^b&6Rf>qxm7WAdiXu$}1tdrjP*fBV5C~nG z6s0Lrq6APn0SS?i`^NwCzBBLVXXg3v+?jj#?983r-|pSLXLnDkjg=`Un+O{Kfb*Q0 zu^j*`^d-QuAn4D^qfsq%0t>S)*m+9~{g7VhQynil=ZdV(sw0T4fT&e+f)(tYg-cg*z3^p8)3 zdo;gvrQe{$PP)geowj;A6G*m>z(anz*hJa$C9(-4pL9O&uZ%ipTkfy zFEI1{Bc698VgF%S{+lczW>Lxb63jjI`UG4!WZR0y2WqYnMhrPp4;|q-jfZtzn7=-aAx#48 z34}FBGONz4{VVWveo!WNnUA(Sqgxh2S4I=t3CS`_7uC5X8Qy%O@CTe2+UZ;S6e%t9 z^A$7T31+mvKB4nt%`|=O&k47uU$;1u(iu5=XYxAh?{oi6a1GczyHojLn|3fbIA~=B zz?`7`&W-&z+nmtC+i#ldqB1nF9Mc-0Gt+B(>IASNNj^KhQ!YDkG0lK-h6_d#i+WgfTd(Qoul_wo3rpu*> zNKn2AohB$MF3OLY|B<>KXKU9aa8d)o+>K#_-g9_9UJu~-IEE z_mlNMl0N?YThybsSthVuuzVw~p+EmG+fYcJk7HjHleKkyy+lzFi67XLqna)mWUar5 zKnj@_r~mqOsV$|a2a1lhhWz9J6Q>?>ZVnTRK1daLxGnhzYF zJzG$+1kva;-4wlPx-m$4q7cfAkKFHznW))#8iQ$?>1UMtNSavGPgU--W&V_Q{)f56 zN2uB0`YY<#oUakvk#gIcg|KN`Dzw!jv5;`+HfsTIA=$RAcz+u=$Qs6mXAuTiF76Uy3G+a6o+M9=be8IpYH9s}( zrq>>@UO~*f_OQQ3Ue?ohDZHsO>x+3Fp&H;GOp%I|z#ROpXq7|&g17PXmHB9ruQkla zMNEbE-FbGZSw;#Q3F+=esMA$iQ2pM;1$)f}wZ12Y@SWx|kvdFjXlgq6mI>?nfQdWC zTt%$(`Wkm24vt=7u-jd%c2c+~Dtw+@D9Zz}Nn707I{Y(P0-g1Oje{vRvH=nl2B51lFJyb;<0)VU@%Y$1HQ zcfpv0iAV;q%^36|2f?Y42{`BXHGNh~R$>3JO>SoWg|g>qtZbuO9ec)zi#V++RRKGq zNEDI6AeVlco*xdrS@$iNp-LsFy*x_Pa+*t!vf;WgGh??2wS5N|8fEEHW2MwJqjcHl z!zbUqt3i=DWkzlk&21(xRdq3s!dt%Tuipw}#0LMyx>{fUgk@!lYN#MUS@kg5-<8+o zP+m}@mDQ9bpFw>P>vxMqkwWpvqdCb*^eu$DR#E90%BlF~W248}p-V=JBJwI2i{3lx zCFS;;yxyfLl8C+0OCrpxZ3}mEn<|=g>*1TkbmH@bbk=i+K6JfF#5|<>>&cx7E$f_( z>twmEJuHt2<&m)3bzjvX*)vHF!`8!D+aAG|Zjd&qn}iFXXeP^*5vY6`xv|-C#0Ll% zzU@TLQ8{L4jL0O5`c_x#I}zNE`@i3P5j>lhwVjmCC(F`{(^wDsnEKGFG*$B15yG^= z{lrg%5YsH^cd7>Vdy{;16l!TE}%Y;EqebOn3WJqpqt zz8M53u-}!#vLc3rKPDe6Wi-RvDk6{21KEpkLY5XFHo=3ZWP~q;eHl(BvhK}=H{?9k z%X_Q!x-*LY&?Zxk`VUd@}*S#bRx$;@~;-6Rcf9jJ#f=Hqq_EJPw zAGWE8!w-9ef44VM#X7ZoAF)zp>e($(Xy0aW?BvNxm6orKQP8VdI3fLkCRPzKB$O@z z^hkVdExJFw+uWGxA5RTdoYP`+!|*Pl{zy|_ax0|{7Mn_cuOtMn=xgp>D zcs5ryn@w4zr{O$?q$aBv01ZwrD6BdNR^hBDZQ6D=R!M48yH#cw8W(Kd6#Kbg z;)dTk^?2PWH3Bc*X#6hy^>bogf@_hi$}wgEu4$2LU%uSpH_Sd`CLqEQT4vN?kd+7C zwQzGItXkoO-c_{ZJ2C&Wk{Gt7Tf->GdJ~+a3=G z$*%I7(YH;-&i%|q_CUsOaiON}DW$EU`o-r!K6u66Zb`9L?FzU>`Ly^aW#eVYq%ljQ z0O9yBudNiOwrO9z02VHtQh@j{;Nq}f`tDVmD&WCIF%q`@PTTo_&$AJ|G3psb)$2V( z>w4Hs2(?OIFudOF?~MGsa>=1M)r3vxjuXJg{y5VQ6sjyDGlQnEqu&ZVfFz#8);9S% zJdp!nAMiBhDF*WF$F;BY5YaiGkq!F=0Kd=|Ff|tMuM`O1IYW!iow$86 zj^&X#h~`b~9R&SmE4A-dpq@Dc=#O?iKnbHhFiInSX?Wj6UeoVp38!dd_$G-#r|0`@ z0t)(9O$IkSXuC}wpz`rrcN(nX0+{*(%}aPdwB$>mn1g`pYCZ4)ZFXH73ne8K84Qo) zQlri!|509lSaE#6z0d>xqgAmz2g~=Cq}(I;D5DG)yTiD4zT5+vf}GMUyw?olgY;t# z2zy1D;+#$x^Q+w&h`K4oB~02SRyP@Zy-01+JdjH06O-{4R;v(f=6Vf@v0V z^oQfutzy>oT2VvNQz_IS*`k<`&W9cLf){IHcW8FP*t&gpS|CN1GZ=0P4LlAx=>K|e zCa*P)@@3`#7ucdZoG60pX-Y31^d#6RPg?@(J9tsB=(c+dY#f!{n zb4UDPXdGsCzw0lo=ab~3yL-3i*YQfN~<|Vvqp}ca!LaesvULc)#F|P zga}|u<>m(uVN zYGtlQv0{7Y^c{4DJJBP!$xnmsqLm2;?&*l^0ecCizzs2B6j1!U@;dF0HEEhwnD-;}d$vbZ>B+-tK#osUG=~ zz8Q;SBA7Sknj|cqb6PSHlVLQ%?F@;TQ`-_0R^XiU__4R6&#+Y7gmpPNZtlTfpnWQ{ za^4ILVkM#&mkY^1>&5$iz~9;9ni;T=4U^Yh&Kl*iUt2CN_5H@oJLpx7FOa{dbD$DrYW?(>Q(LxQ`zo9b0R znz-=$?o639uDlYZ12*4eB55pG#&{sy1sypwoV#akF;gy;Dk3?xJHWxMcj5HQgFL6! zKP$lmRmO%~H)8a+{ay2NH%e;&KUQqKD(A3Juvxg;doKqkrM5o$ ztM8V$QReDcQ6(IYnRebOL)f%ji58GaliHs6aa&1t!y&zMp8E984K zS25*yo5lDWIeu0SGZ*e7qfz?oucV~-m@@13W$Ru@@ zbLArX@NosS!}y7AZZwzOzVzsE!);-y>5Cs)5pmmAGBG2ur)rGgYx|&J68Js0`n*4Z zr8=e@KkV7zm^lXXUN!g;Aauyeu5%>z^a1O8_szrbn0#i~1D{^a;t@P|O%$hEH-y}h z0>E5jp1F^`CEQ)MU|CcN$>Xmm0@2EoV7f#wf&Y`Nv(Q)c05 z1SvDKS(M+qrgPh&Ph1PhV#3P74=lHjG?fR*L@;^R_C@^u9533A<|WdL&2z&E*JtEo z8E?P!zgAN)d}X;?4Q7@rHHz&}gYA)V>qrb7I43mfe#2C`YQ~-4Eg~i?^z!eCkDvCf z3AcH0(LH}vr{vpCyF5UDE38OI8-2T4JTg>*IN`n8sqyeuj6x&AkW`#K^FBqinRoBi zEMw(Wye|4njE89O1|b8ha9f7|OX?+dNw+dC$xGz#S=uR0=l%d?M}RWJ{{&mj^+=2^ zyrg}(ckg@@eKjXlk-;cRVVz|VfV4M=Lb08NiuXF#*xSeh+G@hn?jBeAKL|L9l5vIc z+Cyj$fpW13ok=6Evut2ay;OUza-~n+Ps8vt6s%)2oxQDjc>?Qp=b6aQJA%qUUI;ES zi>0Y@-o&Qt#Lq+3!g*`0f4Qi;{Dw94?m>1Yr{Hr_LVn29xb+)G( z*2HFcB2B;wcY10;J0#@5!vISW?@Bat>2;YvFAKzeTZ935&#vUOrlRe(wY-HNZ7$g2 zi#zXPBx;#fm9)myF6ua@-eR=jJnVq0gL@dX9xztkz3k!Gu5S~z-~^5y^S|Jk*Sv>u zIe>v@!dp_MuS^FWLr1tm@TDp*&JVFJk%*D$jLjJ?h+BgB*MyV{n_(kLt?F3!i%^gh z_QvzLy40IL`hCD?eXdLV$>Y;{Kr)_JLSs34?0TrdU)A2YU?!d}D92Hil}2!s~u znMTZ4FmFJvIyK-to?C%Cca-Ta#C7Wal?%l(G24S0g9t$HF!+VT^!-Zyb^cR%_Q}4C zp0JH8|K-@T>=n`BrBsKn0w~p&kT!4Ip136I`|mGZgU$AE=fEd6Zv~p4FSw`0O)ns? zSjnzO4>5H^Z#Q-$Kij7-Id|+oI^pT`v?}RMM<3VB(biK~cV{R_8f&}ncvJ6s{iLCU z?B8MZd*2Jim#dAPi=+O{S}eikS4**(+r_!{$plSoh>J`L`Ax(BbG4n0Tk1*5AZ)DK z;0j}qEcT&K$gds45{No0QVYM~+CUef#~tfF&UL;?bKJ0^9wxMlsXL6{u zflgjO5nUqkRSEtpjg4PzTumAi4ZremP6#!)T)P7O+^Ut_A~$D-7CU@(%O+SijI#DK z{tf!kL3c7=if(rLN>)IJZ&=b~X7-ZYWK3o69q;2Xp7QPk<3iP8U+%s}>vwR$XCh}8 zthbny@cY{M2a8TU%JaO~7RO*>&?wf5Mjw4}sS@Xsl z_=j!Kqi0Tr9|I#ppHfa(^x+a6(JLI8Q`%L-3a#oGXZU+4>rV05%j}Wi-q(J`8YdY= z8iTh1R^T!%@rmht^mJnwHt>=GMB9l0VzP!NhKX_`(%amx+MZlHupqoQob)sFo~cJzBxAhBQH&JQ3|KxByO6I*fMIBt;VN~6^F-L za^l=moE$kvNfn;CbBYE??8MsA$)FsJv#Vn3!H@kIMWht@C~BH)KH(vE(w0yb!&9P*g&S0HYzo^= zX$GSPkv*9mqR1i<*Q0_#f)PPWy7k&8aW3sOIuG#<;Ds~8ja{!g9Pf(*0G7NW%})-= z43kyv9X3?G9bq_h(9jXcpFeewrs(;q@RV7 zdSl!T`>cUGav{A)u4amxKC1nwpTDh7gpNOgH5?=2?xt1LxUrN_M5CbMnxO;dCqZs! zCSd_*co;vsGgh6b*^Oi*CXnpG8WZpVM-o-bccn#a90(tR{O33#u+hPv(EPTiYzU`f zY%ZMKhXJdBO4D2Tr9Dz;`&yHGBA(qU*>{*o?ffD_zH$q1O6Du1QQhPiCQ-14*Vr zpPb=@IBp-%_)4Cu)y9m=kC)dy)T8q(4XVr2SD4P2p`7PD#J!p`&TVLHB=DlnFLO@6 z!&IdA)=$|ERHP+CK;!uqpnM zAeA7rPm6XNqbK7n7^4sD84;>QO2}`g`Cwn>t$o-$G|&x*c=(sOD{K9udliP?MUATz z6M5C2mVT=BGKRX$m=CqYu%2ucV=60<0Ku0(2L7F(lrv@bIGlddc155X8D+$?o^yZv5w?r0=uxizA`Z0G`=o2D(>cSBFcamEGf}3 zw^6WcbW!*!n~JFjm6%*Hyq=S~k7w~+5_M4HF>twCoNtqq@@)Un!p7Lhis1*Ut6Fu+ zx#O01_I*-!K7Q|L&ooz^9mi4&ZE1UJMCC9;tq`u6-@1YiWCX3C7A>XO_}+0+H)AZB zjrm|^z#)qRn!k(PTUiMR6((v@3*(!MV%VnlrMnMPlf`2RW_+2X z8%#V~p&_4!>gU5_I^@j_!x{V^-7N8?#5jgW7iZ0xNS@l2&Aa6*x`S-g`7FSdRC5_F zGI@|l>RBGTWU`U8R()Tr?%N0b)QC2>wV9Tp=e-|dSe2$u;D^u%=crH?P@@?w&$KQ- zPELWoySlyUl$`dP9J(zKL-va8oBOPcd4l={k9jfTpE4hyiEY>reT&`Z4EWX9?x5I! zIAVCsxAc)4&3$KON79Xk9u_v)pg?%Iz>i%$9%jtAd~a-{tvb?xYe0y z%A*a@8oJ)!>^OyPfzj?Y68YM%UAo3c-yB*t`V7ksbN637_SL71(o3A!75>_n5+V6b zq3@lx`#|NvM|4&zJ1My7Q&kB1 QsUiU9OstGw8F?oB9}Joo&;S4c literal 26501 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 Ntu5@#OHX*m{6E*b7EAyD diff --git a/source/core/assets/images/mobs/water_queen.atlas b/source/core/assets/images/mobs/water_queen.atlas index f3d5ea8fc..03e97ae14 100644 --- a/source/core/assets/images/mobs/water_queen.atlas +++ b/source/core/assets/images/mobs/water_queen.atlas @@ -151,6 +151,13 @@ water_queen_walk orig: 90, 60 offset: 0, 0 index: -1 +water_queen_freeze + rotate: false + xy: 1104, 2 + size: 90, 60 + orig: 90, 60 + offset: 0, 0 + index: -1 water_queen_walk rotate: false xy: 554, 2 diff --git a/source/core/assets/images/mobs/water_queen.png b/source/core/assets/images/mobs/water_queen.png index bbed31311d9702376d9190ec3a97839dd6eec228..bf4ae76594cd5832fe5955e973f46e70d545f114 100644 GIT binary patch literal 7901 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 literal 23040 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 diff --git a/source/core/assets/images/mobs/wizard.atlas b/source/core/assets/images/mobs/wizard.atlas index f9a87a81f..74cccd6e8 100644 --- a/source/core/assets/images/mobs/wizard.atlas +++ b/source/core/assets/images/mobs/wizard.atlas @@ -102,6 +102,13 @@ wizard_death orig: 110, 90 offset: 0, 0 index: -1 +wizard_freeze + rotate: false + xy: 1250, 94 + size: 110, 90 + orig: 110, 90 + offset: 0, 0 + index: -1 wizard_death rotate: false xy: 804, 2 diff --git a/source/core/assets/images/mobs/wizard.png b/source/core/assets/images/mobs/wizard.png index bcb6208b06d987cba8ea1db08dbecc5cc012f2d1..e948ce12e41d0bcb886188815efa7617e3195cc6 100644 GIT binary patch literal 79136 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

gBUTsi#?4*Wjod9A)&2mF*3d->ULW-ey*_r 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 bq0$PzloHbZ5}h>$k3JeXn&z8tAE0Q7}^+ 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 Hu0mjfBXGD% literal 0 HcmV?d00001 diff --git a/source/core/assets/images/projectiles/attack_projectile.atlas b/source/core/assets/images/projectiles/attack_projectile.atlas index 19ed43f53..95f152253 100644 --- a/source/core/assets/images/projectiles/attack_projectile.atlas +++ b/source/core/assets/images/projectiles/attack_projectile.atlas @@ -1,33 +1,33 @@ -attack_projectile.png -size: 420, 93 -format: RGBA8888 -filter: Linear,Linear -repeat: none -P - rotate: false - xy: 0, 0 - size: 140, 93 - orig: 140, 93 - offset: 0, 0 - index: -1 -P - rotate: false - xy: 140, 0 - size: 140, 93 - orig: 140, 93 - offset: 0, 0 - index: -1 -p - rotate: false - xy: 280, 0 - size: 140, 93 - orig: 140, 93 - offset: 0, 0 - index: -1 -default - rotate: false - xy: 280, 0 - size: 140, 93 - orig: 140, 93 - offset: 0, 0 - index: -1 +attack_projectile.png +size: 420, 93 +format: RGBA8888 +filter: Linear,Linear +repeat: none +P + rotate: false + xy: 0, 0 + size: 140, 93 + orig: 140, 93 + offset: 0, 0 + index: -1 +P + rotate: false + xy: 140, 0 + size: 140, 93 + orig: 140, 93 + offset: 0, 0 + index: -1 +p + rotate: false + xy: 280, 0 + size: 140, 93 + orig: 140, 93 + offset: 0, 0 + index: -1 +default + rotate: false + xy: 280, 0 + size: 140, 93 + orig: 140, 93 + offset: 0, 0 + index: -1 diff --git a/source/core/assets/images/projectiles/basic_projectile.atlas b/source/core/assets/images/projectiles/basic_projectile.atlas index 9d295b888..80a571deb 100644 --- a/source/core/assets/images/projectiles/basic_projectile.atlas +++ b/source/core/assets/images/projectiles/basic_projectile.atlas @@ -1,41 +1,55 @@ basic_projectile.png -size: 256, 32 +size: 260, 32 format: RGBA8888 filter: Nearest, Nearest repeat: none +projectile + rotate: false + xy: 78, 2 + size: 36, 19 + orig: 36, 19 + offset: 0, 0 + index: -1 projectileFinal rotate: false xy: 2, 2 size: 36, 19 orig: 36, 19 offset: 0, 0 - index: 2 + index: -1 projectile rotate: false - xy: 40, 2 + xy: 116, 2 size: 36, 19 orig: 36, 19 offset: 0, 0 - index: 4 + index: -1 projectile rotate: false - xy: 78, 2 + xy: 40, 2 size: 36, 19 orig: 36, 19 offset: 0, 0 - index: 1 -projectile + index: -1 +projectileCollide rotate: false - xy: 116, 2 + xy: 152, 2 size: 36, 19 orig: 36, 19 offset: 0, 0 - index: 3 -default + index: -1 +projectileCollide rotate: false - xy: 116, 2 + xy: 188, 2 + size: 36, 19 + orig: 36, 19 + offset: 0, 0 + index: -1 +projectileCollide + rotate: false + xy: 224, 2 size: 36, 19 orig: 36, 19 offset: 0, 0 - index: 3 + index: -1 diff --git a/source/core/assets/images/projectiles/basic_projectile.png b/source/core/assets/images/projectiles/basic_projectile.png index 5fa3bb42cc8801c6673c71564653bb8b9889285a..e551f311bfcee6fcac99cbec36bb63d77122fb73 100644 GIT binary patch literal 1952 zcmV;R2VeM!P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!Topf(KrZXe(3{ zDx^}VN~vf;s@l@1Hz2f$laQMod-=Zcj#)eFW}U=qm!6+=G_#4F{W3G>o3mq!q9}@@ zD2k#eilQirq9{ruI9{tLN&{Sbew*uc4O_mu+BUfaZLgupA;zKWocUo$?mI*HYG}9g z_0LJBuPEzw7o~eoS~9!4#o3q$TP#pzU>NTZ`@*LDuT_WB11;gX$_EE2gk?CBJj*g;C zPIQ>-o=njgLNB5gC*_KpFAq&SB|tL?JBNN+H8$1=1|R*yT;IC5A+jX2_cn&G%U2{^ z`tSDE9HP=>fws4xD+67sH{xa(6nw-lduV}0GOOgS#hfHP!fY3}pevUlHIb`A4$2}!3HjFA9$awhJ= z4D9PGk=jtIm;sH!{-3J}O)V%|MZo{JXj~9gtoD3{1^0Am1dQan2TZWfpL;K9I*ZJJ z@Y;)^;Y}u@)Z{^joJQP1%piV796+#Q*ojCZ?n!6|vy;z-kjmsGmMqHjUF^yr-7_l* z?7&l_NX!86duMhsZQfg4h=<-;Y?9a#zptktMXb%6f2K`hyFCf%+}I)cWJWp%lG2ea zNn(CMVq-IsxG^T_-Z>d7bjjHh0~K8_9T_pLd$7;6wcP%M&m1B!1}FbV*)L;RS4z{) zig(2PI~miC-pR`OGY^@*W#{8L85+z<>Lbo$a|oHhOD^K&&gV+8Wls{T5t|UdBMy2k>S;L%O{36s4E;driuErZPCN~uFq<;h zGyo=BEK!m>*VdYmvE^G3Ea{fBi2S>zE%Dc{pEmdI+**|J*{q!XVohac_H3T_dewSr zlRx$54zCwX{$^8%sHrb@YIL#&E=bB z3PFb8#845HDurTYEW^$xS?;)mg-OV^Vg_}RvDpdOh#6R-G6iUR0oo>@?KxbsLKr}B zVwprY5xWq_pyxL9e1m=~5v&ycLTvT=!_bp}o-ff4B#a?c{`*CXWeFqjV@&~sPOf?t!n~B^!o~hYv(nBL zf`?mg%s4*4j7>xpLe=>B$1BJLs*>Q6V-C(}@Wn!02EV@H{h~QA5!r?@g$LCT2=pC+ zzA5N?3YV-3SS9d4aR@PoI0Zd(&~qC7K*Ag<@}F@y`IDnv4wKqTY_o`M+zV?4{2Shn z8iHpCguBt-<0+Z}FO4o6Fbrp6CRWipJJD(SD9xP{@Arxg?#9%^qz?*CAkBbh2z)=y zfM*D+0V)Kic>I=Q$IRZ7eO3tG%c8>Ek4e^$84z6C_r&oi*=(3l46Y$oC;k(CrHVX^ zdIsae-K+;;Cx>Q0*Pca`cegs!9a;Zw66Oqn_!pLili2gLc>nhb zy0ZnzcIS=0+-y=VoZ|s&nRTcxy1EPI6AE7YD+-JMFmbg$er%UB1md4p&LbY-jE11O zt1^ccRtSE$OH=EjO2IP;>Y{m=izd)$l@MixK%kFj37epgrZ9nc67ds)pTUno&tB;H z6#YO#3$+W030?as1FQ5OgoJ(uW z#D9iBYR#dxYKZa-A&4qds38hNU>nvHqBaBqjfbF*&&ga&e0(^HapA(Bf|g&=)@9j3 ztw9iL5;Oz0@nlJgg_soP65N4gAs>&_2+ z5xB}xNjNli%Ss>rRs(AcB+A6I_pKO%4^}CbR+zy`P(x4*0mk4rg~~dqtteV)2JL{~ zkSzC`3HVV%P%6}^78dcKo524WH3X%Kdzpe7fubmiq9}@@D2k#eilQirq9}@@D2k#e milQirq9}@@D2lRTME(V4w7W6vATc5U0000^gCGIm!!}8nRs%8dyE8GGxEiDRM+sVZnIdN*oezM5`C0N> z){6tJG}zwaJ(d8lV`Pn;POR#fHv)DJ$`RPaNE1w)jML=VJ-+6!;@7Q4(ebP$fy$wYn@Vc|f4Gw-UD>ojWGMAdYF;^=H^q92P3tKBYCk0id zo?wHZ3qRc*qi^RLykq?M$A$W^#&P)hN}5KDAxrk*&IAp0HoM2z$ZyZ@rB4G%dVjs0 z#_ptO>V5}(zk7&&-rPsOFK?$@K+tr5y=Qn9hlT`4kYvm{2*$heL9kMIJgmu!JACFJ z?TNY1RTDX%CFHB0Ri*U=8wlML_A1W}zy_P?tMeL0j1{Cxn?@T%mhAG`bGNtA^o_-< zIZHRG{(Nh4wNeO_4uYw^{CLY9a}aFo`FjnnBm{IY@vV$|{8n96LqN_$Yb?DObYb&n z#m`GUS28ak!q`T!S9#qK)<9O3HjN5^B7@84dWM!;fa2SLa4khP9|9@}${uqNuDNr{ zK25r^`y<(T!5h z9zaktvG_P|$`!(6S$hCMSmWz}-~jk|JikfF;W)xKCD6@ht@7M1h4|w zd`Qy-eG4GXBv)M#KNjO>dgF4hY5#Q9(B_ZA{{hIntk<^yg49vYQSSk;N(R9Q_5c9+ zR|paSv;AA$M&_S?uGG=jo?UBh{4m69>;0dA*8HNiM9$NE3s5o$^mEI-odWPx#1ZP1_K>z@;j|==^1poj532;bRa{vGizyJUazyWI3i3tDz0+&fdK~#8N?U=!8 z6fqdblkKc6h+svuf{J+2yW+)zCksA-4xa z?)d$`O~!Pbncd7zw(I);K}a%W|4F{@KiTXWLI@#*5JCtcON4dx(((DpZP)t4<;QPb zYk84<=cr|`Cz9K#C#^~lSi~e@tu`|zAG!yE@6WQ{MUMf@w7z*k+q*BnX`RAYE)FZA zeWVWp8Yc?_XfrDbQS%qr)t<=@M$rMSOH3Ux`q1v3UNfU#`=)=!n!#S4OKqiYWvWy$ zC?oUCe6m2}{MG~4Gv@pD3$16-tm4blJCE|i(KBhnRHO0JF+ErRg-?tJfy~zX+C=GJ zT-87#pkdG_QP!OV#>VIanCaB@4K>r*8<{tinkhyvRSe3=XZ2)3LEAl!0-p=b1pH~$ zH89h;hq~W4`XHdzP{1cf&;Sm12gSw*I|oHTV=3#_6^y~yHXMHVS_Iges*PT%7yy{S zn`!0REiGubHC36e^(wgQ>Vif?0iPIO!i^)KZdf#B-Kv5yZg@0nH?LS6`PseuT4vEp z5d(jsc)fp$EW7mMxqiiOYd@g&yHz%gCL$Xe&}w?PwAPgZAwMF?aWto48V9}2)!sON1Y&xuSr52}*C zh~_7R5JCtcgb+dqA%qY@2qA%!e|5l00030!t2dRtB}ElS#zi|uf^^5JoR-ByY`whC}KOn)7HWlcjKf0Y@fdJ zknwN#lW<)=ggLL9YtkWz=TS0)>cv57z0b}=pdr-9i=+U$`tB#wJ? z-}yF&z|$`tuT>(0L9jt;tzM>~;s890-_^IPnlVZJ<^J#GbvOWe2)zAttetCa27_RO zw50)f7vI-6uAKg#&sVMY@b>GQYib6Apo=Pf`gis1D(@#&=yV5M6#emJpa1- z?kmqTTj+iK1}Gq2c*$SDwohMq$aww*9DrT8R*mA#-fUj}eC^t6&fw_TO=6<}00000 g00000002ki2U!--uDg4S4*&oF07*qoM6N<$f?lh)dH?_b diff --git a/source/core/assets/images/projectiles/firework_anim.atlas b/source/core/assets/images/projectiles/firework_anim.atlas index 45f2d54c9..912c8027a 100644 --- a/source/core/assets/images/projectiles/firework_anim.atlas +++ b/source/core/assets/images/projectiles/firework_anim.atlas @@ -1,41 +1,41 @@ - -firework_anim.png -size: 128, 32 -format: RGBA8888 -filter: Nearest, Nearest -repeat: none -projectile - rotate: false - xy: 23, 2 - size: 19, 16 - orig: 19, 16 - offset: 0, 0 - index: -1 -projectile - rotate: false - xy: 65, 2 - size: 19, 16 - orig: 19, 16 - offset: 0, 0 - index: -1 -projectile - rotate: false - xy: 44, 2 - size: 19, 16 - orig: 19, 16 - offset: 0, 0 - index: -1 -projectile - rotate: false - xy: 2, 2 - size: 19, 16 - orig: 19, 16 - offset: 0, 0 - index: -1 -default - rotate: false - xy: 23, 2 - size: 19, 16 - orig: 19, 16 - offset: 0, 0 - index: -1 + +firework_anim.png +size: 128, 32 +format: RGBA8888 +filter: Nearest, Nearest +repeat: none +projectile + rotate: false + xy: 23, 2 + size: 19, 16 + orig: 19, 16 + offset: 0, 0 + index: -1 +projectile + rotate: false + xy: 65, 2 + size: 19, 16 + orig: 19, 16 + offset: 0, 0 + index: -1 +projectile + rotate: false + xy: 44, 2 + size: 19, 16 + orig: 19, 16 + offset: 0, 0 + index: -1 +projectile + rotate: false + xy: 2, 2 + size: 19, 16 + orig: 19, 16 + offset: 0, 0 + index: -1 +default + rotate: false + xy: 23, 2 + size: 19, 16 + orig: 19, 16 + offset: 0, 0 + index: -1 diff --git a/source/core/assets/images/projectiles/mobBoss_projectile.atlas b/source/core/assets/images/projectiles/mobBoss_projectile.atlas index e0ddcbdd0..94ebaf787 100644 --- a/source/core/assets/images/projectiles/mobBoss_projectile.atlas +++ b/source/core/assets/images/projectiles/mobBoss_projectile.atlas @@ -1,62 +1,62 @@ - -mobBoss_projectile.png -size: 256, 32 -format: RGBA8888 -filter: Nearest, Nearest -repeat: none -mob_boss - rotate: false - xy: 142, 2 - size: 26, 19 - orig: 26, 19 - offset: 0, 0 - index: -1 -mob_boss - rotate: false - xy: 198, 3 - size: 24, 18 - orig: 24, 18 - offset: 0, 0 - index: -1 -mob_boss - rotate: false - xy: 170, 2 - size: 26, 19 - orig: 26, 19 - offset: 0, 0 - index: -1 -mob_boss - rotate: false - xy: 37, 2 - size: 33, 19 - orig: 33, 19 - offset: 0, 0 - index: -1 -mob_boss - rotate: false - xy: 107, 2 - size: 33, 19 - orig: 33, 19 - offset: 0, 0 - index: -1 -mob_boss - rotate: false - xy: 72, 2 - size: 33, 19 - orig: 33, 19 - offset: 0, 0 - index: -1 -mob_bossFinal - rotate: false - xy: 2, 2 - size: 33, 19 - orig: 33, 19 - offset: 0, 0 - index: -1 -default - rotate: false - xy: 142, 2 - size: 26, 19 - orig: 26, 19 - offset: 0, 0 - index: -1 + +mobBoss_projectile.png +size: 256, 32 +format: RGBA8888 +filter: Nearest, Nearest +repeat: none +mob_boss + rotate: false + xy: 142, 2 + size: 26, 19 + orig: 26, 19 + offset: 0, 0 + index: -1 +mob_boss + rotate: false + xy: 198, 3 + size: 24, 18 + orig: 24, 18 + offset: 0, 0 + index: -1 +mob_boss + rotate: false + xy: 170, 2 + size: 26, 19 + orig: 26, 19 + offset: 0, 0 + index: -1 +mob_boss + rotate: false + xy: 37, 2 + size: 33, 19 + orig: 33, 19 + offset: 0, 0 + index: -1 +mob_boss + rotate: false + xy: 107, 2 + size: 33, 19 + orig: 33, 19 + offset: 0, 0 + index: -1 +mob_boss + rotate: false + xy: 72, 2 + size: 33, 19 + orig: 33, 19 + offset: 0, 0 + index: -1 +mob_bossFinal + rotate: false + xy: 2, 2 + size: 33, 19 + orig: 33, 19 + offset: 0, 0 + index: -1 +default + rotate: false + xy: 142, 2 + size: 26, 19 + orig: 26, 19 + offset: 0, 0 + index: -1 diff --git a/source/core/assets/images/projectiles/mobProjectile.atlas b/source/core/assets/images/projectiles/mobProjectile.atlas index 5dabfa025..7975b1d41 100644 --- a/source/core/assets/images/projectiles/mobProjectile.atlas +++ b/source/core/assets/images/projectiles/mobProjectile.atlas @@ -1,41 +1,41 @@ - -mobProjectile.png -size: 128, 32 -format: RGBA8888 -filter: Nearest, Nearest -repeat: none -rotate - rotate: false - xy: 80, 2 - size: 24, 23 - orig: 24, 23 - offset: 0, 0 - index: -1 -rotate - rotate: false - xy: 28, 2 - size: 24, 23 - orig: 24, 23 - offset: 0, 0 - index: -1 -default - rotate: false - xy: 28, 2 - size: 24, 23 - orig: 24, 23 - offset: 0, 0 - index: -1 -rotate - rotate: false - xy: 2, 2 - size: 24, 23 - orig: 24, 23 - offset: 0, 0 - index: -1 -rotate - rotate: false - xy: 54, 2 - size: 24, 23 - orig: 24, 23 - offset: 0, 0 - index: -1 + +mobProjectile.png +size: 128, 32 +format: RGBA8888 +filter: Nearest, Nearest +repeat: none +rotate + rotate: false + xy: 80, 2 + size: 24, 23 + orig: 24, 23 + offset: 0, 0 + index: -1 +rotate + rotate: false + xy: 28, 2 + size: 24, 23 + orig: 24, 23 + offset: 0, 0 + index: -1 +default + rotate: false + xy: 28, 2 + size: 24, 23 + orig: 24, 23 + offset: 0, 0 + index: -1 +rotate + rotate: false + xy: 2, 2 + size: 24, 23 + orig: 24, 23 + offset: 0, 0 + index: -1 +rotate + rotate: false + xy: 54, 2 + size: 24, 23 + orig: 24, 23 + offset: 0, 0 + index: -1 diff --git a/source/core/assets/images/projectiles/oldstun_effect.atlas b/source/core/assets/images/projectiles/oldstun_effect.atlas index a50132d0b..d14093ee3 100644 --- a/source/core/assets/images/projectiles/oldstun_effect.atlas +++ b/source/core/assets/images/projectiles/oldstun_effect.atlas @@ -1,41 +1,41 @@ - -stun_effect.png -size: 256, 32 -format: RGBA8888 -filter: Nearest, Nearest -repeat: none -projectile - rotate: false - xy: 86, 3 - size: 41, 27 - orig: 41, 27 - offset: 0, 0 - index: -1 -projectile - rotate: false - xy: 2, 2 - size: 40, 28 - orig: 40, 28 - offset: 0, 0 - index: -1 -projectile - rotate: false - xy: 129, 2 - size: 40, 28 - orig: 40, 28 - offset: 0, 0 - index: -1 -projectile - rotate: false - xy: 44, 2 - size: 40, 28 - orig: 40, 28 - offset: 0, 0 - index: -1 -default - rotate: false - xy: 86, 3 - size: 41, 27 - orig: 41, 27 - offset: 0, 0 + +stun_effect.png +size: 256, 32 +format: RGBA8888 +filter: Nearest, Nearest +repeat: none +projectile + rotate: false + xy: 86, 3 + size: 41, 27 + orig: 41, 27 + offset: 0, 0 + index: -1 +projectile + rotate: false + xy: 2, 2 + size: 40, 28 + orig: 40, 28 + offset: 0, 0 + index: -1 +projectile + rotate: false + xy: 129, 2 + size: 40, 28 + orig: 40, 28 + offset: 0, 0 + index: -1 +projectile + rotate: false + xy: 44, 2 + size: 40, 28 + orig: 40, 28 + offset: 0, 0 + index: -1 +default + rotate: false + xy: 86, 3 + size: 41, 27 + orig: 41, 27 + offset: 0, 0 index: -1 \ No newline at end of file diff --git a/source/core/assets/images/projectiles/pierce_anim.atlas b/source/core/assets/images/projectiles/pierce_anim.atlas index 0dea23b97..d6e37446a 100644 --- a/source/core/assets/images/projectiles/pierce_anim.atlas +++ b/source/core/assets/images/projectiles/pierce_anim.atlas @@ -1,42 +1,42 @@ - -pierce_anim.png -size: 256, 32 -format: RGBA8888 -filter: Nearest, Nearest -repeat: none -projectile - rotate: false - xy: 2, 2 - size: 35, 26 - orig: 35, 26 - offset: 0, 0 - index: -1 -projectile - rotate: false - xy: 76, 2 - size: 35, 26 - orig: 35, 26 - offset: 0, 0 - index: -1 -projectile - rotate: false - xy: 39, 2 - size: 35, 26 - orig: 35, 26 - offset: 0, 0 - index: -1 -projectile - rotate: false - xy: 113, 2 - size: 35, 26 - orig: 35, 26 - offset: 0, 0 - index: -1 -default -projectile - rotate: false - xy: 2, 2 - size: 35, 26 - orig: 35, 26 - offset: 0, 0 + +pierce_anim.png +size: 256, 32 +format: RGBA8888 +filter: Nearest, Nearest +repeat: none +projectile + rotate: false + xy: 2, 2 + size: 35, 26 + orig: 35, 26 + offset: 0, 0 + index: -1 +projectile + rotate: false + xy: 76, 2 + size: 35, 26 + orig: 35, 26 + offset: 0, 0 + index: -1 +projectile + rotate: false + xy: 39, 2 + size: 35, 26 + orig: 35, 26 + offset: 0, 0 + index: -1 +projectile + rotate: false + xy: 113, 2 + size: 35, 26 + orig: 35, 26 + offset: 0, 0 + index: -1 +default +projectile + rotate: false + xy: 2, 2 + size: 35, 26 + orig: 35, 26 + offset: 0, 0 index: -1 \ No newline at end of file diff --git a/source/core/assets/images/projectiles/projectile_explosion.atlas b/source/core/assets/images/projectiles/projectile_explosion.atlas index d285fa835..3b16a2fc6 100644 --- a/source/core/assets/images/projectiles/projectile_explosion.atlas +++ b/source/core/assets/images/projectiles/projectile_explosion.atlas @@ -1,97 +1,97 @@ - -projectile_explosion.png -size: 2048, 256 -format: RGBA8888 -filter: Nearest, Nearest -repeat: none -explosion - rotate: false - xy: 1042, 2 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -explosion - rotate: false - xy: 782, 2 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -explosion - rotate: false - xy: 262, 2 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -explosionFinal - rotate: false - xy: 1302, 2 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -explosion - rotate: false - xy: 392, 2 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -explosion - rotate: false - xy: 1432, 2 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -explosion - rotate: false - xy: 652, 2 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -explosion - rotate: false - xy: 132, 2 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -explosion - rotate: false - xy: 1172, 2 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -explosion - rotate: false - xy: 522, 2 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -explosion - rotate: false - xy: 2, 2 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -explosion - rotate: false - xy: 912, 2 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -default - rotate: false - xy: 1042, 2 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 + +projectile_explosion.png +size: 2048, 256 +format: RGBA8888 +filter: Nearest, Nearest +repeat: none +explosion + rotate: false + xy: 1042, 2 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +explosion + rotate: false + xy: 782, 2 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +explosion + rotate: false + xy: 262, 2 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +explosionFinal + rotate: false + xy: 1302, 2 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +explosion + rotate: false + xy: 392, 2 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +explosion + rotate: false + xy: 1432, 2 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +explosion + rotate: false + xy: 652, 2 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +explosion + rotate: false + xy: 132, 2 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +explosion + rotate: false + xy: 1172, 2 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +explosion + rotate: false + xy: 522, 2 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +explosion + rotate: false + xy: 2, 2 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +explosion + rotate: false + xy: 912, 2 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +default + rotate: false + xy: 1042, 2 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 diff --git a/source/core/assets/images/projectiles/snow_ball.atlas b/source/core/assets/images/projectiles/snow_ball.atlas index 20e4eb554..21712ba2b 100644 --- a/source/core/assets/images/projectiles/snow_ball.atlas +++ b/source/core/assets/images/projectiles/snow_ball.atlas @@ -1,48 +1,48 @@ - -snow_ball.png -size: 128, 32 -format: RGBA8888 -filter: Nearest, Nearest -repeat: none -projectile - rotate: false - xy: 20, 2 - size: 16, 19 - orig: 16, 19 - offset: 0, 0 - index: -1 -projectile - rotate: false - xy: 56, 2 - size: 16, 19 - orig: 16, 19 - offset: 0, 0 - index: -1 -projectile - rotate: false - xy: 38, 2 - size: 16, 19 - orig: 16, 19 - offset: 0, 0 - index: -1 -projectileFinal - rotate: false - xy: 2, 2 - size: 16, 19 - orig: 16, 19 - offset: 0, 0 - index: -1 -collision - rotate: false - xy: 92, 3 - size: 16, 18 - orig: 16, 18 - offset: 0, 0 - index: -1 -collision - rotate: false - xy: 74, 3 - size: 16, 18 - orig: 16, 18 - offset: 0, 0 - index: -1 + +snow_ball.png +size: 128, 32 +format: RGBA8888 +filter: Nearest, Nearest +repeat: none +projectile + rotate: false + xy: 20, 2 + size: 16, 19 + orig: 16, 19 + offset: 0, 0 + index: -1 +projectile + rotate: false + xy: 56, 2 + size: 16, 19 + orig: 16, 19 + offset: 0, 0 + index: -1 +projectile + rotate: false + xy: 38, 2 + size: 16, 19 + orig: 16, 19 + offset: 0, 0 + index: -1 +projectileFinal + rotate: false + xy: 2, 2 + size: 16, 19 + orig: 16, 19 + offset: 0, 0 + index: -1 +collision + rotate: false + xy: 92, 3 + size: 16, 18 + orig: 16, 18 + offset: 0, 0 + index: -1 +collision + rotate: false + xy: 74, 3 + size: 16, 18 + orig: 16, 18 + offset: 0, 0 + index: -1 diff --git a/source/core/assets/images/projectiles/stun_effect.atlas b/source/core/assets/images/projectiles/stun_effect.atlas index 6aa98a315..8406d5748 100644 --- a/source/core/assets/images/projectiles/stun_effect.atlas +++ b/source/core/assets/images/projectiles/stun_effect.atlas @@ -1,6 +1,6 @@ stun_effect.png -size: 128, 32 +size: 152, 32 format: RGBA8888 filter: Nearest, Nearest repeat: none @@ -32,6 +32,27 @@ projectile orig: 17, 19 offset: 0, 0 index: -1 +stun + rotate: false + xy: 87, 2 + size: 21, 19 + orig: 21, 19 + offset: 0, 0 + index: -1 +stun + rotate: false + xy: 109, 2 + size: 21, 19 + orig: 21, 19 + offset: 0, 0 + index: -1 +stun + rotate: false + xy: 131, 2 + size: 21, 19 + orig: 21, 19 + offset: 0, 0 + index: -1 default rotate: false xy: 2, 2 diff --git a/source/core/assets/images/projectiles/stun_effect.png b/source/core/assets/images/projectiles/stun_effect.png index cd862a426dacca1e19493657acfc4568deb9a355..f2b3deddbe20a72ecb6db4608267eeab68b1afd5 100644 GIT binary patch literal 2141 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 diff --git a/source/core/src/main/com/csse3200/game/ai/tasks/AITaskComponent.java b/source/core/src/main/com/csse3200/game/ai/tasks/AITaskComponent.java index 93798e8d4..175345a38 100644 --- a/source/core/src/main/com/csse3200/game/ai/tasks/AITaskComponent.java +++ b/source/core/src/main/com/csse3200/game/ai/tasks/AITaskComponent.java @@ -21,6 +21,8 @@ public class AITaskComponent extends Component implements TaskRunner { private final List priorityTasks = new ArrayList<>(2); private final List priorityTasksToBeRestored = new ArrayList<>(2); private PriorityTask currentTask; + + public boolean freezed = false; /** * Add a priority task to the list of tasks. This task will be run only when it has the highest * priority, and can be stopped to run a higher priority task. @@ -65,10 +67,11 @@ public void update() { return; } - if (desiredtask != currentTask) { + if (desiredtask != currentTask && !freezed) { changeTask(desiredtask); } - currentTask.update(); + if(currentTask!=null) + currentTask.update(); } @Override diff --git a/source/core/src/main/com/csse3200/game/components/Component.java b/source/core/src/main/com/csse3200/game/components/Component.java index babc6f291..e589d2ece 100644 --- a/source/core/src/main/com/csse3200/game/components/Component.java +++ b/source/core/src/main/com/csse3200/game/components/Component.java @@ -1,102 +1,102 @@ -package com.csse3200.game.components; - -import com.csse3200.game.entities.Entity; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * Core component class from which all components inherit. Contains logic for creating, updating, - * and disposing. Components can be attached to an entity to give it specific behaviour. It is - * unlikely that changes will need to be made here. - */ -public class Component { - private static final Logger logger = LoggerFactory.getLogger(Component.class); - protected Entity entity; - protected boolean enabled = true; - - /** - * Called when the entity is created and registered. Initial logic such as calls to GetComponent - * should be made here, not in the constructor which is called before an entity is finished. - */ - public void create() { - // No action by default. - } - - /** - * Early update called once per frame of the game, before update(). Use this only for logic that - * must run before other updates, such as physics. Not called if component is disabled. - */ - public void earlyUpdate() { - // No action by default. - } - - /** - * Called once per frame of the game, and should be used for most component logic. Not called if - * component is disabled. - */ - public void update() { - // No action by default. - } - - /** Called when the component is disposed. Dispose of any internal resources here. */ - public void dispose() { - // No action by default. - } - - /** - * Set the entity to which this component belongs. This is called by the Entity, and should not be - * set manually. - * - * @param entity The entity to which the component is attached. - */ - public void setEntity(Entity entity) { - logger.debug("Attaching {} to {}", this, entity); - this.entity = entity; - } - - /** - * Get the entity to which this component belongs. - * @return entity - */ - public Entity getEntity() { - return entity; - } - - /** - * Enable or disable the component. While disabled, a component does not run update() or - * earlyUpdate(). Other events inside the component may still fire. The component can still be - * disposed while disabled. - * - * @param enabled Should component be enabled - */ - public void setEnabled(boolean enabled) { - logger.debug("Setting enabled={} on {}", enabled, this); - this.enabled = enabled; - } - - /** Used to trigger the component to update itself. This should not need to be called manually. */ - public final void triggerUpdate() { - if (enabled) { - update(); - } - } - - /** - * Used to trigger the component to early-update itself. This should not need to be called - * manually. - */ - public final void triggerEarlyUpdate() { - if (enabled) { - earlyUpdate(); - } - } - - @Override - public String toString() { - String className = this.getClass().getSimpleName(); - if (entity == null) { - return className; - } - return entity + "." + className; - } -} +package com.csse3200.game.components; + +import com.csse3200.game.entities.Entity; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Core component class from which all components inherit. Contains logic for creating, updating, + * and disposing. Components can be attached to an entity to give it specific behaviour. It is + * unlikely that changes will need to be made here. + */ +public class Component { + private static final Logger logger = LoggerFactory.getLogger(Component.class); + protected Entity entity; + public boolean enabled = true; + + /** + * Called when the entity is created and registered. Initial logic such as calls to GetComponent + * should be made here, not in the constructor which is called before an entity is finished. + */ + public void create() { + // No action by default. + } + + /** + * Early update called once per frame of the game, before update(). Use this only for logic that + * must run before other updates, such as physics. Not called if component is disabled. + */ + public void earlyUpdate() { + // No action by default. + } + + /** + * Called once per frame of the game, and should be used for most component logic. Not called if + * component is disabled. + */ + public void update() { + // No action by default. + } + + /** Called when the component is disposed. Dispose of any internal resources here. */ + public void dispose() { + // No action by default. + } + + /** + * Set the entity to which this component belongs. This is called by the Entity, and should not be + * set manually. + * + * @param entity The entity to which the component is attached. + */ + public void setEntity(Entity entity) { + logger.debug("Attaching {} to {}", this, entity); + this.entity = entity; + } + + /** + * Get the entity to which this component belongs. + * @return entity + */ + public Entity getEntity() { + return entity; + } + + /** + * Enable or disable the component. While disabled, a component does not run update() or + * earlyUpdate(). Other events inside the component may still fire. The component can still be + * disposed while disabled. + * + * @param enabled Should component be enabled + */ + public void setEnabled(boolean enabled) { + logger.debug("Setting enabled={} on {}", enabled, this); + this.enabled = enabled; + } + + /** Used to trigger the component to update itself. This should not need to be called manually. */ + public final void triggerUpdate() { + if (enabled) { + update(); + } + } + + /** + * Used to trigger the component to early-update itself. This should not need to be called + * manually. + */ + public final void triggerEarlyUpdate() { + if (enabled) { + earlyUpdate(); + } + } + + @Override + public String toString() { + String className = this.getClass().getSimpleName(); + if (entity == null) { + return className; + } + return entity + "." + className; + } +} diff --git a/source/core/src/main/com/csse3200/game/components/TouchAttackComponent.java b/source/core/src/main/com/csse3200/game/components/TouchAttackComponent.java index 2ff88df7e..b55a6e80a 100644 --- a/source/core/src/main/com/csse3200/game/components/TouchAttackComponent.java +++ b/source/core/src/main/com/csse3200/game/components/TouchAttackComponent.java @@ -1,183 +1,299 @@ -package com.csse3200.game.components; - -import com.badlogic.gdx.math.Vector2; -import com.badlogic.gdx.physics.box2d.Body; -import com.badlogic.gdx.physics.box2d.Fixture; -import com.csse3200.game.components.npc.DeflectingComponent; -import com.csse3200.game.entities.Entity; -import com.csse3200.game.entities.Weapon; -import com.csse3200.game.physics.BodyUserData; -import com.csse3200.game.physics.PhysicsLayer; -import com.csse3200.game.physics.components.HitboxComponent; -import com.csse3200.game.physics.components.PhysicsComponent; - -/** - * When this entity touches a valid enemy's hitbox, deal damage to them and - * apply a knockback. - * Has an optional disposeOnHit property that disposes projectile upon - * collision. - * - *

- * Requires CombatStatsComponent, HitboxComponent on this entity. - * - *

- * Damage is only applied if target entity has a CombatStatsComponent. Knockback - * is only applied - * if target entity has a PhysicsComponent. - */ -public class TouchAttackComponent extends Component { - private short targetLayer; - private float knockbackForce = 0f; - private boolean disposeOnHit = false; - private CombatStatsComponent combatStats; - private HitboxComponent hitboxComponent; - - /** - * Create a component which attacks entities on collision, without knockback. - * - * @param targetLayer The physics layer of the target's collider. - */ - public TouchAttackComponent(short targetLayer) { - this.targetLayer = targetLayer; - } - - /** - * Create a component which attacks entities on collision, with knockback. - * - * @param targetLayer The physics layer of the target's collider. - * @param knockback The magnitude of the knockback applied to the entity. - */ - public TouchAttackComponent(short targetLayer, float knockback) { - this.targetLayer = targetLayer; - this.knockbackForce = knockback; - } - - /** - * Create a component which attacks entities on collision, with knockback and - * self-dispose. - * - * @param targetLayer The physics layer of the target's collider. - * @param knockback The magnitude of the knockback applied to the entity. - * @param disposeOnHit Whether this entity should be disposed on hit. - */ - public TouchAttackComponent(short targetLayer, float knockback, boolean disposeOnHit) { - this.targetLayer = targetLayer; - this.knockbackForce = knockback; - this.disposeOnHit = disposeOnHit; - } - - @Override - public void create() { - entity.getEvents().addListener("collisionStart", this::onCollisionStart); - entity.getEvents().addListener("collisionEnd", this::onCollisionEnd); - combatStats = entity.getComponent(CombatStatsComponent.class); - hitboxComponent = entity.getComponent(HitboxComponent.class); - } - - public void onCollisionStart(Fixture me, Fixture other) { - if (hitboxComponent.getFixture() != me) { - // Not triggered by hitbox, ignore - return; - } - - if (!PhysicsLayer.contains(targetLayer, other.getFilterData().categoryBits)) { - // Doesn't match our target layer, ignore - return; - } - - // Try to attack target. - Entity target = ((BodyUserData) other.getBody().getUserData()).entity; - - // If enemy has deflecting component, don't delete it. - Component deflectComponent = target.getComponent(DeflectingComponent.class); - if (deflectComponent != null && deflectComponent.enabled) - return; - - CombatStatsComponent targetStats = target.getComponent(CombatStatsComponent.class); - if (targetStats != null) { - // If entity has abilities, pick one at random and apply it else use baseAttack - // damage - if (combatStats.getWeapon(target) != null) { - targetStats.hit(combatStats.getWeapon(target).getDamage()); - } else { - targetStats.hit(combatStats.getBaseAttack()); - } - } - // Apply knockback - PhysicsComponent physicsComponent = target.getComponent(PhysicsComponent.class); - if (physicsComponent != null && knockbackForce > 0f) { - Body targetBody = physicsComponent.getBody(); - Vector2 direction = target.getCenterPosition().sub(entity.getCenterPosition()); - Vector2 impulse = direction.setLength(knockbackForce); - targetBody.applyLinearImpulse(impulse, targetBody.getWorldCenter(), true); - } - - if (disposeOnHit) { - Entity projectile = ((BodyUserData) me.getBody().getUserData()).entity; - projectile.setFlagForDelete(true); - } - } - - public void setDisposeOnHit(boolean disposeOnHit) { - this.disposeOnHit = disposeOnHit; - } - - public void setKnockBack(float knockback) { - this.knockbackForce = knockback; - } - - private void onCollisionEnd(Fixture me, Fixture other) { - // Nothing to do on collision end - if (hitboxComponent.getFixture() != me) { - // Not triggered by hitbox, ignore - return; - } - - if (!PhysicsLayer.contains(targetLayer, other.getFilterData().categoryBits)) { - // Doesn't match our target layer, ignore - return; - } - - Entity otherEntity = ((BodyUserData) other.getBody().getUserData()).entity; - - // If enemy has enabled deflection component, don't dispose it. - if (otherEntity.getComponent(DeflectingComponent.class) != null) - return; - - if (disposeOnHit) { - Entity projectile = ((BodyUserData) me.getBody().getUserData()).entity; - projectile.setFlagForDelete(true); - } - } - - /** - * Choose the weapon to use against the given fixture. - * - * If the fixture has been removed (died) return null, else return the weapon to use. - * */ - public Weapon chooseWeapon(Fixture other) { - if (other == null) { - return null; - } - BodyUserData data = ((BodyUserData) other.getBody().getUserData()); - if (data == null) { - return null; - } - Entity target = data.entity; - Weapon weapon = null; - if (target.getComponent(CombatStatsComponent.class) != null) { - weapon = combatStats.getWeapon(target); - } - return weapon; - } - - /** - * Sets the target layer of this component, changing which entity to "attack" - * and/or apply knockback to. - * - * @param targetLayer - */ - public void setTargetLayer(short targetLayer) { - this.targetLayer = targetLayer; - } -} +package com.csse3200.game.components; + +import com.badlogic.gdx.math.Vector2; +import com.badlogic.gdx.physics.box2d.Body; +import com.badlogic.gdx.physics.box2d.Fixture; +import com.csse3200.game.components.npc.DeflectingComponent; +import com.csse3200.game.entities.Entity; +import com.csse3200.game.entities.Weapon; +import com.csse3200.game.physics.BodyUserData; +import com.csse3200.game.physics.PhysicsLayer; +import com.csse3200.game.physics.components.HitboxComponent; +import com.csse3200.game.physics.components.PhysicsComponent; +import com.csse3200.game.components.projectile.EngineerBulletsAnimationController; +import com.csse3200.game.components.projectile.ProjectileAnimationController; +import com.csse3200.game.components.projectile.SnowBallProjectileAnimationController; +import com.csse3200.game.components.projectile.StunEffectProjectileAnimationController; +import com.csse3200.game.components.projectile.BurnEffectProjectileAnimationController; +import com.csse3200.game.physics.components.PhysicsMovementComponent; +import java.util.Timer; +import java.util.TimerTask; +import com.csse3200.game.components.npc.XenoAnimationController; +import com.csse3200.game.components.npc.DragonKnightAnimationController; +import com.csse3200.game.components.npc.FireWormAnimationController; +import com.csse3200.game.components.npc.SkeletonAnimationController; +import com.csse3200.game.components.npc.WizardAnimationController; +import com.csse3200.game.components.npc.WaterQueenAnimationController; +import com.csse3200.game.components.npc.WaterSlimeAnimationController; +import com.csse3200.game.ai.tasks.AITaskComponent; + +/** + * When this entity touches a valid enemy's hitbox, deal damage to them and + * apply a knockback. + * Has an optional disposeOnHit property that disposes projectile upon + * collision. + * + *

+ * Requires CombatStatsComponent, HitboxComponent on this entity. + * + *

+ * Damage is only applied if target entity has a CombatStatsComponent. Knockback + * is only applied + * if target entity has a PhysicsComponent. + */ +public class TouchAttackComponent extends Component { + private short targetLayer; + private float knockbackForce = 0f; + private boolean disposeOnHit = false; + private int aoeSize = 0; + private CombatStatsComponent combatStats; + private HitboxComponent hitboxComponent; + + /** + * Create a component which attacks entities on collision, without knockback. + * + * @param targetLayer The physics layer of the target's collider. + */ + public TouchAttackComponent(short targetLayer) { + this.targetLayer = targetLayer; + } + + /** + * Create a component which attacks entities on collision, with knockback. + * + * @param targetLayer The physics layer of the target's collider. + * @param knockback The magnitude of the knockback applied to the entity. + */ + public TouchAttackComponent(short targetLayer, float knockback) { + this.targetLayer = targetLayer; + this.knockbackForce = knockback; + } + + /** + * Create a component which attacks entities on collision, with knockback and + * self-dispose. + * + * @param targetLayer The physics layer of the target's collider. + * @param knockback The magnitude of the knockback applied to the entity. + * @param disposeOnHit Whether this entity should be disposed on hit. + */ + public TouchAttackComponent(short targetLayer, float knockback, boolean disposeOnHit) { + this.targetLayer = targetLayer; + this.knockbackForce = knockback; + this.disposeOnHit = disposeOnHit; + } + + @Override + public void create() { + entity.getEvents().addListener("collisionStart", this::onCollisionStart); + entity.getEvents().addListener("collisionEnd", this::onCollisionEnd); + combatStats = entity.getComponent(CombatStatsComponent.class); + hitboxComponent = entity.getComponent(HitboxComponent.class); + } + + public void onCollisionStart(Fixture me, Fixture other) { + if (me==null || hitboxComponent==null || hitboxComponent.getFixture() != me) { + // Not triggered by hitbox, ignore + return; + } + if(other!=null) + { + if (!PhysicsLayer.contains(targetLayer, other.getFilterData().categoryBits)) { + // Doesn't match our target layer, ignore + return; + } + Component deflectComponent = ((BodyUserData) other.getBody().getUserData()).entity.getComponent(DeflectingComponent.class); + if (deflectComponent != null && deflectComponent.enabled) + return; + }else + return; + // Try to attack target. + Entity target = ((BodyUserData) other.getBody().getUserData()).entity; + + EngineerBulletsAnimationController engineerBulletsAnimationController; + ProjectileAnimationController projectileAnimationController; + SnowBallProjectileAnimationController snowBallProjectileAnimationController; + StunEffectProjectileAnimationController stunEffectProjectileAnimationController; + BurnEffectProjectileAnimationController burnEffectProjectileAnimationController; + if((engineerBulletsAnimationController=entity.getComponent(EngineerBulletsAnimationController.class)) != null) + { + setDisposeOnHit(false); + entity.getComponent(PhysicsMovementComponent.class).setSpeed(new Vector2(0, 0)); + new Timer().schedule(new TimerTask() { + public void run() { + Entity projectile = ((BodyUserData) me.getBody().getUserData()).entity; + projectile.setFlagForDelete(true); + } + }, 300/*START_SPEED*frames*1000ms*/); + }else + if((projectileAnimationController=entity.getComponent(ProjectileAnimationController.class)) != null) + { + setDisposeOnHit(false); + entity.getComponent(PhysicsMovementComponent.class).setSpeed(new Vector2(0, 0)); + new Timer().schedule(new TimerTask() { + public void run() { + Entity projectile = ((BodyUserData) me.getBody().getUserData()).entity; + projectile.setFlagForDelete(true); + } + }, 300/*START_SPEED*frames*1000ms*/); + }else + if((burnEffectProjectileAnimationController=entity.getComponent(BurnEffectProjectileAnimationController.class)) != null) + { + setDisposeOnHit(false); + entity.getComponent(PhysicsMovementComponent.class).setSpeed(new Vector2(0, 0)); + new Timer().schedule(new TimerTask() { + public void run() { + Entity projectile = ((BodyUserData) me.getBody().getUserData()).entity; + projectile.setFlagForDelete(true); + } + }, 800/*START_SPEED*frames*1000ms*/); + }else + if((snowBallProjectileAnimationController=entity.getComponent(SnowBallProjectileAnimationController.class)) != null) + { + setDisposeOnHit(false); + entity.getComponent(PhysicsMovementComponent.class).setSpeed(new Vector2(0, 0)); + new Timer().schedule(new TimerTask() { + public void run() { + Entity projectile = ((BodyUserData) me.getBody().getUserData()).entity; + projectile.setFlagForDelete(true); + } + }, 200/*START_SPEED*frames*1000ms*/); + + AITaskComponent aiTaskComponent; + if((aiTaskComponent=target.getComponent(AITaskComponent.class))!=null) + { + aiTaskComponent.freezed = true; + PhysicsMovementComponent physicsMovementComponent; + if((physicsMovementComponent=target.getComponent(PhysicsMovementComponent.class))!=null) + physicsMovementComponent.setMoving(false); + new Timer().schedule(new TimerTask() { + public void run() { + aiTaskComponent.freezed = false; + PhysicsMovementComponent physicsMovementComponent; + if((physicsMovementComponent=target.getComponent(PhysicsMovementComponent.class))!=null) + physicsMovementComponent.setMoving(true); + target.getEvents().trigger("wanderStart"); + } + }, 5000); + } + target.getEvents().trigger("freeze"); + /*else + if(aiTaskComponent!=null) + aiTaskComponent.freezed = false;*/ + }else + if((stunEffectProjectileAnimationController=entity.getComponent(StunEffectProjectileAnimationController.class)) != null) + { + setDisposeOnHit(false); + entity.getComponent(PhysicsMovementComponent.class).setSpeed(new Vector2(0, 0)); + new Timer().schedule(new TimerTask() { + public void run() { + Entity projectile = ((BodyUserData) me.getBody().getUserData()).entity; + projectile.setFlagForDelete(true); + } + }, 900/*START_SPEED*frames*1000ms*/); + + AITaskComponent aiTaskComponent; + if((aiTaskComponent=target.getComponent(AITaskComponent.class))!=null) + { + aiTaskComponent.freezed = true; + PhysicsMovementComponent physicsMovementComponent; + if((physicsMovementComponent=target.getComponent(PhysicsMovementComponent.class))!=null) + physicsMovementComponent.setMoving(false); + new Timer().schedule(new TimerTask() { + public void run() { + aiTaskComponent.freezed = false; + PhysicsMovementComponent physicsMovementComponent; + if((physicsMovementComponent=target.getComponent(PhysicsMovementComponent.class))!=null) + physicsMovementComponent.setMoving(true); + } + }, 1000); + } + } + CombatStatsComponent targetStats = target.getComponent(CombatStatsComponent.class); + if (targetStats != null) { + // If entity has abilities, pick one at random and apply it else use baseAttack + // damage + if (combatStats.getWeapon(target) != null) { + targetStats.hit(combatStats.getWeapon(target).getDamage()); + } else { + targetStats.hit(combatStats.getBaseAttack()); + } + } + // Apply knockback + PhysicsComponent physicsComponent = target.getComponent(PhysicsComponent.class); + if (physicsComponent != null && knockbackForce > 0f) { + Body targetBody = physicsComponent.getBody(); + Vector2 direction = target.getCenterPosition().sub(entity.getCenterPosition()); + Vector2 impulse = direction.setLength(knockbackForce); + targetBody.applyLinearImpulse(impulse, targetBody.getWorldCenter(), true); + } + + if (disposeOnHit) { + Entity projectile = ((BodyUserData) me.getBody().getUserData()).entity; + projectile.setFlagForDelete(true); + } + } + + public void setDisposeOnHit(boolean disposeOnHit) { + this.disposeOnHit = disposeOnHit; + } + + public void setKnockBack(float knockback) { + this.knockbackForce = knockback; + } + + private void onCollisionEnd(Fixture me, Fixture other) { + // Nothing to do on collision end + if (hitboxComponent.getFixture() != me) { + // Not triggered by hitbox, ignore + return; + } + + if (!PhysicsLayer.contains(targetLayer, other.getFilterData().categoryBits)) { + // Doesn't match our target layer, ignore + return; + } + + Entity otherEntity = ((BodyUserData) other.getBody().getUserData()).entity; + + // If enemy has enabled deflection component, don't dispose it. + if (otherEntity.getComponent(DeflectingComponent.class) != null) + return; + + if (disposeOnHit) { + Entity projectile = ((BodyUserData) me.getBody().getUserData()).entity; + projectile.setFlagForDelete(true); + } + } + + /** + * Choose the weapon to use against the given fixture. + * + * If the fixture has been removed (died) return null, else return the weapon to use. + * */ + public Weapon chooseWeapon(Fixture other) { + if (other == null) { + return null; + } + BodyUserData data = ((BodyUserData) other.getBody().getUserData()); + if (data == null) { + return null; + } + Entity target = data.entity; + Weapon weapon = null; + if (target.getComponent(CombatStatsComponent.class) != null) { + weapon = combatStats.getWeapon(target); + } + return weapon; + } + + /** + * Sets the target layer of this component, changing which entity to "attack" + * and/or apply knockback to. + * + * @param targetLayer + */ + public void setTargetLayer(short targetLayer) { + this.targetLayer = targetLayer; + } +} diff --git a/source/core/src/main/com/csse3200/game/components/npc/DragonKnightAnimationController.java b/source/core/src/main/com/csse3200/game/components/npc/DragonKnightAnimationController.java index 6d9d54215..dab866862 100644 --- a/source/core/src/main/com/csse3200/game/components/npc/DragonKnightAnimationController.java +++ b/source/core/src/main/com/csse3200/game/components/npc/DragonKnightAnimationController.java @@ -1,7 +1,9 @@ package com.csse3200.game.components.npc; +import com.badlogic.gdx.audio.Sound; import com.csse3200.game.components.Component; import com.csse3200.game.rendering.AnimationRenderComponent; +import com.csse3200.game.services.ServiceLocator; import java.security.SecureRandom; /** @@ -23,6 +25,11 @@ public void create() { entity.getEvents().addListener("mob_walk", this::animateWalk); entity.getEvents().addListener("mob_attack", this::animateAttack); entity.getEvents().addListener("mob_death", this::animateDeath); + + entity.getEvents().addListener("wanderStart", this::animateWalk); + entity.getEvents().addListener("shootStart", this::animateAttack); + entity.getEvents().addListener("dieStart", this::animateDeath); + entity.getEvents().addListener("freeze", this::animateFreeze); } void animateWalk() { @@ -37,6 +44,9 @@ void animateDeath() { animator.startAnimation("dragon_knight_death"); } - + void animateFreeze() + { + animator.startAnimation("dragon_knight_freeze"); + } } diff --git a/source/core/src/main/com/csse3200/game/components/npc/FireWormAnimationController.java b/source/core/src/main/com/csse3200/game/components/npc/FireWormAnimationController.java index 141d43d69..02998db7f 100644 --- a/source/core/src/main/com/csse3200/game/components/npc/FireWormAnimationController.java +++ b/source/core/src/main/com/csse3200/game/components/npc/FireWormAnimationController.java @@ -29,7 +29,11 @@ public void create() { entity.getEvents().addListener("mob_walk", this::animateWalk); entity.getEvents().addListener("mob_attack", this::animateAttack); entity.getEvents().addListener("mob_death", this::animateDeath); - entity.getEvents().addListener("default", this::stopAnimation); + + entity.getEvents().addListener("wanderStart", this::animateWalk); + entity.getEvents().addListener("shootStart", this::animateAttack); + entity.getEvents().addListener("dieStart", this::animateDeath); + entity.getEvents().addListener("freeze", this::animateFreeze); } void animateWalk() { @@ -50,6 +54,9 @@ void stopAnimation() { animator.startAnimation("default"); } - + void animateFreeze() + { + animator.startAnimation("fire_worm_freeze"); + } } diff --git a/source/core/src/main/com/csse3200/game/components/npc/SkeletonAnimationController.java b/source/core/src/main/com/csse3200/game/components/npc/SkeletonAnimationController.java index d5ea57bfa..bafa8d36a 100644 --- a/source/core/src/main/com/csse3200/game/components/npc/SkeletonAnimationController.java +++ b/source/core/src/main/com/csse3200/game/components/npc/SkeletonAnimationController.java @@ -23,17 +23,14 @@ public class SkeletonAnimationController extends Component { Sound deathSound = ServiceLocator.getResourceService().getAsset( ATTACK_SOUND, Sound.class); - private static final String DEATH_SOUND = "sounds/mobs/skeletonHit.mp3"; - Sound attackSound = ServiceLocator.getResourceService().getAsset( - DEATH_SOUND, Sound.class); - @Override public void create() { super.create(); animator = this.entity.getComponent(AnimationRenderComponent.class); - entity.getEvents().addListener("mob_walk", this::animateWalk); - entity.getEvents().addListener("mob_attack", this::animateAttack); - entity.getEvents().addListener("mob_death", this::animateDeath); + entity.getEvents().addListener("wanderStart", this::animateWalk); + entity.getEvents().addListener("shootStart", this::animateAttack); + entity.getEvents().addListener("dieStart", this::animateDeath); + entity.getEvents().addListener("freeze", this::animateFreeze); } void animateWalk() { @@ -42,8 +39,6 @@ void animateWalk() { void animateAttack() { animator.startAnimation("skeleton_attack"); - attackSound.setVolume(1000, 0); - attackSound.play(); } void animateDeath() { @@ -51,5 +46,10 @@ void animateDeath() { deathSound.setVolume(1000, 5.5f); deathSound.play(); } + + void animateFreeze() + { + animator.startAnimation("skeleton_freeze"); + } } diff --git a/source/core/src/main/com/csse3200/game/components/npc/WaterQueenAnimationController.java b/source/core/src/main/com/csse3200/game/components/npc/WaterQueenAnimationController.java index 0b8a00b75..82209c68b 100644 --- a/source/core/src/main/com/csse3200/game/components/npc/WaterQueenAnimationController.java +++ b/source/core/src/main/com/csse3200/game/components/npc/WaterQueenAnimationController.java @@ -26,9 +26,10 @@ public class WaterQueenAnimationController extends Component { public void create() { super.create(); animator = this.entity.getComponent(AnimationRenderComponent.class); - entity.getEvents().addListener("mob_walk", this::animateWalk); - entity.getEvents().addListener("mob_attack", this::animateAttack); - entity.getEvents().addListener("mob_death", this::animateDeath); + entity.getEvents().addListener("wanderStart", this::animateWalk); + entity.getEvents().addListener("shootStart", this::animateAttack); + entity.getEvents().addListener("dieStart", this::animateDeath); + entity.getEvents().addListener("freeze", this::animateFreeze); } void animateWalk() { @@ -44,5 +45,9 @@ void animateAttack() { void animateDeath() { animator.startAnimation("water_queen_death"); } + + void animateFreeze() { + animator.startAnimation("water_queen_freeze"); + } } diff --git a/source/core/src/main/com/csse3200/game/components/npc/WaterSlimeAnimationController.java b/source/core/src/main/com/csse3200/game/components/npc/WaterSlimeAnimationController.java index 6909dad10..b0e14ba49 100644 --- a/source/core/src/main/com/csse3200/game/components/npc/WaterSlimeAnimationController.java +++ b/source/core/src/main/com/csse3200/game/components/npc/WaterSlimeAnimationController.java @@ -1,7 +1,9 @@ package com.csse3200.game.components.npc; +import com.badlogic.gdx.audio.Sound; import com.csse3200.game.components.Component; import com.csse3200.game.rendering.AnimationRenderComponent; +import com.csse3200.game.services.ServiceLocator; import java.security.SecureRandom; /** @@ -20,9 +22,10 @@ public class WaterSlimeAnimationController extends Component { public void create() { super.create(); animator = this.entity.getComponent(AnimationRenderComponent.class); - entity.getEvents().addListener("mob_walk", this::animateWalk); - entity.getEvents().addListener("mob_attack", this::animateAttack); - entity.getEvents().addListener("mob_death", this::animateDeath); + entity.getEvents().addListener("wanderStart", this::animateWalk); + entity.getEvents().addListener("shootStart", this::animateAttack); + entity.getEvents().addListener("dieStart", this::animateDeath); + entity.getEvents().addListener("freeze", this::animateFreeze); } void animateWalk() { @@ -36,6 +39,10 @@ void animateAttack() { void animateDeath() { animator.startAnimation("water_slime_death"); } + + void animateFreeze() { + animator.startAnimation("water_slime_freeze"); + } } diff --git a/source/core/src/main/com/csse3200/game/components/npc/WizardAnimationController.java b/source/core/src/main/com/csse3200/game/components/npc/WizardAnimationController.java index c8c8e7073..68ac160fe 100644 --- a/source/core/src/main/com/csse3200/game/components/npc/WizardAnimationController.java +++ b/source/core/src/main/com/csse3200/game/components/npc/WizardAnimationController.java @@ -32,6 +32,10 @@ public void create() { entity.getEvents().addListener("mob_attack", this::animateAttack); entity.getEvents().addListener("mob_death", this::animateDeath); + entity.getEvents().addListener("wanderStart", this::animateWalk); + entity.getEvents().addListener("shootStart", this::animateAttack); + entity.getEvents().addListener("dieStart", this::animateDeath); + entity.getEvents().addListener("freeze", this::animateFreeze); } @@ -48,5 +52,10 @@ void animateAttack() { void animateDeath() { animator.startAnimation("wizard_death"); } + + void animateFreeze() + { + animator.startAnimation("wizard_freeze"); + } } diff --git a/source/core/src/main/com/csse3200/game/components/npc/XenoAnimationController.java b/source/core/src/main/com/csse3200/game/components/npc/XenoAnimationController.java index d07dc4683..f8a4abf3c 100644 --- a/source/core/src/main/com/csse3200/game/components/npc/XenoAnimationController.java +++ b/source/core/src/main/com/csse3200/game/components/npc/XenoAnimationController.java @@ -1,7 +1,9 @@ package com.csse3200.game.components.npc; +import com.badlogic.gdx.audio.Sound; import com.csse3200.game.components.Component; import com.csse3200.game.rendering.AnimationRenderComponent; +import com.csse3200.game.services.ServiceLocator; import java.security.SecureRandom; /** @@ -26,6 +28,7 @@ public void create() { entity.getEvents().addListener("shootStart", this::animateShoot); entity.getEvents().addListener("dieStart", this::animateDie); entity.getEvents().addListener("stop", this::stopAnimation); + entity.getEvents().addListener("freeze", this::animateFreeze); } void animateRun() { @@ -56,4 +59,9 @@ void animateDie() { void stopAnimation() { animator.startAnimation("default"); } + + void animateFreeze() + { + animator.startAnimation("xeno_freeze"); + } } diff --git a/source/core/src/main/com/csse3200/game/components/projectile/BurnEffectProjectileAnimationController.java b/source/core/src/main/com/csse3200/game/components/projectile/BurnEffectProjectileAnimationController.java index 847f77027..01e052cc6 100644 --- a/source/core/src/main/com/csse3200/game/components/projectile/BurnEffectProjectileAnimationController.java +++ b/source/core/src/main/com/csse3200/game/components/projectile/BurnEffectProjectileAnimationController.java @@ -2,6 +2,9 @@ import com.csse3200.game.components.Component; import com.csse3200.game.rendering.AnimationRenderComponent; +import com.badlogic.gdx.physics.box2d.Fixture; +import com.csse3200.game.physics.PhysicsLayer; +import com.csse3200.game.physics.components.HitboxComponent; public class BurnEffectProjectileAnimationController extends Component { /** Event name constants */ @@ -12,7 +15,14 @@ public class BurnEffectProjectileAnimationController extends Component { private static final String START_ANIM = "projectile"; private static final String FINAL_ANIM = "projectileFinal"; AnimationRenderComponent animator; - + + private HitboxComponent hitboxComponent; + short targetLayer; + + public BurnEffectProjectileAnimationController(short targetLayer) + { + this.targetLayer = targetLayer; + } @Override public void create() { @@ -21,6 +31,7 @@ public void create() { entity.getEvents().addListener(START, this::animateStart); entity.getEvents().addListener(FINAL, this::animateFinal); + hitboxComponent = entity.getComponent(HitboxComponent.class); } void animateStart() { @@ -28,6 +39,18 @@ void animateStart() { } void animateFinal() { - animator.startAnimation(FINAL_ANIM); + } + + public void animateCollide(Fixture me, Fixture other) { + if (hitboxComponent.getFixture() != me) { + // Not triggered by hitbox, ignore + return; + } + if (!PhysicsLayer.contains(targetLayer, other.getFilterData().categoryBits)) { + // Doesn't match our target layer, ignore + return; + } + + animator.startAnimation("explosion"); } } diff --git a/source/core/src/main/com/csse3200/game/components/projectile/EngineerBulletsAnimationController.java b/source/core/src/main/com/csse3200/game/components/projectile/EngineerBulletsAnimationController.java index a9dc1a63f..d68d4d79f 100644 --- a/source/core/src/main/com/csse3200/game/components/projectile/EngineerBulletsAnimationController.java +++ b/source/core/src/main/com/csse3200/game/components/projectile/EngineerBulletsAnimationController.java @@ -3,11 +3,24 @@ import com.csse3200.game.components.Component; import com.csse3200.game.rendering.AnimationRenderComponent; import com.csse3200.game.services.ServiceLocator; //used for sound +import com.badlogic.gdx.physics.box2d.Fixture; +import com.csse3200.game.physics.PhysicsLayer; +import com.csse3200.game.physics.components.HitboxComponent; +import com.csse3200.game.physics.BodyUserData; +import com.csse3200.game.components.npc.DeflectingComponent; public class EngineerBulletsAnimationController extends Component{ /** Event name constants */ AnimationRenderComponent animator; + + private HitboxComponent hitboxComponent; + short targetLayer; + + public EngineerBulletsAnimationController(short targetLayer) + { + this.targetLayer = targetLayer; + } @Override public void create() { @@ -15,7 +28,8 @@ public void create() { animator = this.entity.getComponent(AnimationRenderComponent.class); entity.getEvents().addListener("startProjectile", this::animateStart); entity.getEvents().addListener("startProjectileFinal", this::animateFinal); - + entity.getEvents().addListener("collisionStart", this::animateCollide); + hitboxComponent = entity.getComponent(HitboxComponent.class); } void animateStart() { @@ -25,5 +39,27 @@ void animateStart() { void animateFinal() { animator.startAnimation("bulletFinal"); } + + void animateCollide(Fixture me, Fixture other){ + if(me!=null) + { + if (hitboxComponent==null || hitboxComponent.getFixture() != me) { + // Not triggered by hitbox, ignore + return; + } + }else + { + animator.startAnimation("bulletCollide"); + return; + } + if (!PhysicsLayer.contains(targetLayer, other.getFilterData().categoryBits)) { + // Doesn't match our target layer, ignore + return; + } + Component deflectComponent = ((BodyUserData) other.getBody().getUserData()).entity.getComponent(DeflectingComponent.class); + if (deflectComponent != null && deflectComponent.enabled) + return; + animator.startAnimation("bulletCollide"); + } } diff --git a/source/core/src/main/com/csse3200/game/components/projectile/PierceArrowAnimationController.java b/source/core/src/main/com/csse3200/game/components/projectile/PierceArrowAnimationController.java new file mode 100644 index 000000000..89bd71d32 --- /dev/null +++ b/source/core/src/main/com/csse3200/game/components/projectile/PierceArrowAnimationController.java @@ -0,0 +1,25 @@ +package com.csse3200.game.components.projectile; + +import com.csse3200.game.components.Component; +import com.csse3200.game.rendering.AnimationRenderComponent; + +public class PierceArrowAnimationController extends Component { + /** Event name constants */ + private static final String START = "startProjectile"; + /** Animation name constants */ + private static final String START_ANIM = "arrow"; + AnimationRenderComponent animator; + + + @Override + public void create() { + super.create(); + animator = this.entity.getComponent(AnimationRenderComponent.class); + entity.getEvents().addListener(START, this::animateStart); + + } + + void animateStart() { + animator.startAnimation(START_ANIM); + } +} diff --git a/source/core/src/main/com/csse3200/game/components/projectile/ProjectileAnimationController.java b/source/core/src/main/com/csse3200/game/components/projectile/ProjectileAnimationController.java index 9610554c9..2b0a18608 100644 --- a/source/core/src/main/com/csse3200/game/components/projectile/ProjectileAnimationController.java +++ b/source/core/src/main/com/csse3200/game/components/projectile/ProjectileAnimationController.java @@ -2,6 +2,9 @@ import com.csse3200.game.components.Component; import com.csse3200.game.rendering.AnimationRenderComponent; +import com.badlogic.gdx.physics.box2d.Fixture; +import com.csse3200.game.physics.PhysicsLayer; +import com.csse3200.game.physics.components.HitboxComponent; public class ProjectileAnimationController extends Component{ /** Event name constants */ @@ -12,7 +15,14 @@ public class ProjectileAnimationController extends Component{ private static final String START_ANIM = "projectile"; private static final String FINAL_ANIM = "projectileFinal"; AnimationRenderComponent animator; - + + private HitboxComponent hitboxComponent; + short targetLayer; + + public ProjectileAnimationController(short targetLayer) + { + this.targetLayer = targetLayer; + } @Override public void create() { @@ -20,7 +30,8 @@ public void create() { animator = this.entity.getComponent(AnimationRenderComponent.class); entity.getEvents().addListener(START, this::animateStart); entity.getEvents().addListener(FINAL, this::animateFinal); - + entity.getEvents().addListener("collisionStart", this::animateCollide); + hitboxComponent = entity.getComponent(HitboxComponent.class); } void animateStart() { @@ -30,4 +41,17 @@ void animateStart() { void animateFinal() { animator.startAnimation(FINAL_ANIM); } + + void animateCollide(Fixture me, Fixture other) { + if (hitboxComponent.getFixture() != me) { + // Not triggered by hitbox, ignore + return; + } + if (!PhysicsLayer.contains(targetLayer, other.getFilterData().categoryBits)) { + // Doesn't match our target layer, ignore + return; + } + + animator.startAnimation("projectileCollide"); + } } diff --git a/source/core/src/main/com/csse3200/game/components/projectile/SnowBallProjectileAnimationController.java b/source/core/src/main/com/csse3200/game/components/projectile/SnowBallProjectileAnimationController.java index adb1f2869..d80b5b209 100644 --- a/source/core/src/main/com/csse3200/game/components/projectile/SnowBallProjectileAnimationController.java +++ b/source/core/src/main/com/csse3200/game/components/projectile/SnowBallProjectileAnimationController.java @@ -2,6 +2,9 @@ import com.csse3200.game.components.Component; import com.csse3200.game.rendering.AnimationRenderComponent; +import com.badlogic.gdx.physics.box2d.Fixture; +import com.csse3200.game.physics.PhysicsLayer; +import com.csse3200.game.physics.components.HitboxComponent; public class SnowBallProjectileAnimationController extends Component{ private static final String START = "startProjectile"; @@ -11,6 +14,14 @@ public class SnowBallProjectileAnimationController extends Component{ private static final String START_ANIM = "projectile"; private static final String FINAL_ANIM = "projectileFinal"; AnimationRenderComponent animator; + + private HitboxComponent hitboxComponent; + short targetLayer; + + public SnowBallProjectileAnimationController(short targetLayer) + { + this.targetLayer = targetLayer; + } @Override public void create() { @@ -18,7 +29,9 @@ public void create() { animator = this.entity.getComponent(AnimationRenderComponent.class); entity.getEvents().addListener(START, this::animateStart); entity.getEvents().addListener(FINAL, this::animateFinal); + entity.getEvents().addListener("collisionStart", this::animateCollide); + hitboxComponent = entity.getComponent(HitboxComponent.class); } void animateStart() { @@ -28,4 +41,17 @@ void animateStart() { void animateFinal() { animator.startAnimation(FINAL_ANIM); } + + void animateCollide(Fixture me, Fixture other) { + if (hitboxComponent.getFixture() != me) { + // Not triggered by hitbox, ignore + return; + } + if (!PhysicsLayer.contains(targetLayer, other.getFilterData().categoryBits)) { + // Doesn't match our target layer, ignore + return; + } + + animator.startAnimation("collision"); + } } diff --git a/source/core/src/main/com/csse3200/game/components/projectile/StunEffectProjectileAnimationController.java b/source/core/src/main/com/csse3200/game/components/projectile/StunEffectProjectileAnimationController.java index 94899ff17..507a689d4 100644 --- a/source/core/src/main/com/csse3200/game/components/projectile/StunEffectProjectileAnimationController.java +++ b/source/core/src/main/com/csse3200/game/components/projectile/StunEffectProjectileAnimationController.java @@ -2,6 +2,9 @@ import com.csse3200.game.components.Component; import com.csse3200.game.rendering.AnimationRenderComponent; +import com.badlogic.gdx.physics.box2d.Fixture; +import com.csse3200.game.physics.PhysicsLayer; +import com.csse3200.game.physics.components.HitboxComponent; public class StunEffectProjectileAnimationController extends Component { /** Event name constants */ @@ -11,17 +14,39 @@ public class StunEffectProjectileAnimationController extends Component { private static final String START_ANIM = "projectile"; AnimationRenderComponent animator; + private HitboxComponent hitboxComponent; + short targetLayer; + + public StunEffectProjectileAnimationController(short targetLayer) + { + this.targetLayer = targetLayer; + } @Override public void create() { super.create(); animator = this.entity.getComponent(AnimationRenderComponent.class); entity.getEvents().addListener(START, this::animateStart); + entity.getEvents().addListener("collisionStart", this::animateCollide); + hitboxComponent = entity.getComponent(HitboxComponent.class); } void animateStart() { animator.startAnimation(START_ANIM); } - + + void animateCollide(Fixture me, Fixture other) + { + if (hitboxComponent.getFixture() != me) { + // Not triggered by hitbox, ignore + return; + } + if (!PhysicsLayer.contains(targetLayer, other.getFilterData().categoryBits)) { + // Doesn't match our target layer, ignore + return; + } + + animator.startAnimation("stun"); + } } diff --git a/source/core/src/main/com/csse3200/game/components/tasks/MobAttackTask.java b/source/core/src/main/com/csse3200/game/components/tasks/MobAttackTask.java index 39215cb9e..152d27693 100644 --- a/source/core/src/main/com/csse3200/game/components/tasks/MobAttackTask.java +++ b/source/core/src/main/com/csse3200/game/components/tasks/MobAttackTask.java @@ -16,13 +16,15 @@ import com.csse3200.game.physics.raycast.RaycastHit; import com.csse3200.game.services.GameTime; import com.csse3200.game.services.ServiceLocator; +import com.csse3200.game.ai.tasks.AITaskComponent; +import com.csse3200.game.components.npc.XenoAnimationController; /** * Task that allows mobs to shoot projectiles or melee attack towers */ public class MobAttackTask extends DefaultTask implements PriorityTask { private static final int INTERVAL = 1; // time interval to scan for towers in - private static final short TARGET_LAYER = PhysicsLayer.HUMANS; // mobs detecting for towers + private static final short TARGET = PhysicsLayer.HUMANS; // mobs detecting for towers // ^ fix this private static final String STOW = "wanderStart"; @@ -33,13 +35,15 @@ public class MobAttackTask extends DefaultTask implements PriorityTask { private Fixture target; private final int priority; + private final float maxRange; + private Vector2 mobPosition = new Vector2(10f,10f); private final Vector2 maxRangePosition = new Vector2(); private final PhysicsEngine physics; private GameTime timeSource; - + private long endTime; private final RaycastHit hit = new RaycastHit(); - private static final long DELAY = 1000; // delay between shots + private final long delay = 1000; // delay between shots private long startTime; private enum STATE { @@ -50,9 +54,11 @@ private enum STATE { /** * @param priority Task priority when targets are detected (0 when nothing detected). Must be a positive integer. + * @param maxRange Maximum effective range of the weapon mob. This determines the detection distance of targets */ - public MobAttackTask(int priority) { + public MobAttackTask(int priority, float maxRange) { this.priority = priority; + this.maxRange = maxRange; startTime = 0; physics = ServiceLocator.getPhysicsService().getPhysics(); @@ -66,9 +72,11 @@ public MobAttackTask(int priority) { public void start() { super.start(); startTime = timeSource.getTime(); - Vector2 mobPosition = owner.getEntity().getCenterPosition(); + this.mobPosition = owner.getEntity().getCenterPosition(); this.maxRangePosition.set(0, mobPosition.y); - long endTime = timeSource.getTime() + (INTERVAL * 500); + //owner.getEntity().getEvents().trigger(IDLE); + endTime = timeSource.getTime() + (INTERVAL * 500); +// owner.getEntity().getEvents().trigger("shootStart"); } /** @@ -77,11 +85,14 @@ public void start() { */ @Override public void update() { - updateMobState(); - - if (mobState == STATE.STOW) { - status = Status.FINISHED; - } + if(!owner.getEntity().getComponent(AITaskComponent.class).freezed) + { + updateMobState(); + + if (mobState == STATE.STOW) { + status = Status.FINISHED; + } + } } /** @@ -116,21 +127,25 @@ public void updateMobState() { if (!isTargetVisible() || this.meleeOrProjectile() == null) { this.owner.getEntity().getEvents().trigger(STOW); mobState = STATE.STOW; - } else if (this.meleeOrProjectile() instanceof Melee) { + } else { + if (this.meleeOrProjectile() instanceof Melee) { TouchAttackComponent attackComp = owner.getEntity().getComponent(TouchAttackComponent.class); HitboxComponent hitboxComp = owner.getEntity().getComponent(HitboxComponent.class); attackComp.onCollisionStart(hitboxComp.getFixture(), target); this.owner.getEntity().getEvents().trigger("meleeStart"); - } else { + } else { Entity newProjectile = ProjectileFactory.createMobBall(PhysicsLayer.HUMANS, new Vector2(0, owner.getEntity().getPosition().y), new Vector2(2f,2f)); - newProjectile.setPosition(owner.getEntity().getPosition().x, owner.getEntity().getPosition().y); + newProjectile.setPosition((float) (owner.getEntity().getPosition().x), (float) (owner.getEntity().getPosition().y)); newProjectile.setScale(-1f, 1f); ServiceLocator.getEntityService().register(newProjectile); +// System.out.printf("ANIMATION: " + owner.getEntity().getComponent(AnimationRenderComponent.class).getCurrentAnimation() + "\n"); this.owner.getEntity().getEvents().trigger(FIRING); mobState = STATE.STOW; + } } owner.getEntity().getComponent(PhysicsMovementComponent.class).setEnabled(true); + } case STOW -> { @@ -165,20 +180,41 @@ public void stop() { */ @Override public int getPriority() { - if ((startTime + DELAY) < timeSource.getTime() && isTargetVisible() && this.meleeOrProjectile() != null) { + if (status == Status.ACTIVE) { + return getActivePriority(); + } + return getInactivePriority(); + } + + /** + * Fetches the active priority of the Task if a target is visible. + * @return (int) active priority if a target is visible, -1 otherwise + */ + private int getActivePriority() { + if ((startTime + delay) < timeSource.getTime() && isTargetVisible() && this.meleeOrProjectile() != null) { + return priority; + } + return -1; + } + + /** + * Fetches the inactive priority of the Task if a target is not visible. + * @return (int) -1 if a target is not visible, active priority otherwise + */ + private int getInactivePriority() { + if ((startTime + delay) < timeSource.getTime() && isTargetVisible() && this.meleeOrProjectile() != null) { return priority; } return -1; } /** - * Uses a raycast to determine whether there are any targets in detection range. - * + * Uses a raycast to determine whether there are any targets in detection range * @return true if a target is visible, false otherwise */ private boolean isTargetVisible() { Vector2 newVector = new Vector2(owner.getEntity().getPosition().x - 10f, owner.getEntity().getPosition().y - 2f); - return physics.raycast(owner.getEntity().getPosition(), newVector, TARGET_LAYER, hit); + return physics.raycast(owner.getEntity().getPosition(), newVector, TARGET, hit); } /** @@ -189,10 +225,11 @@ private boolean isTargetVisible() { * the function will return null. If it returns null when the mob is in state FIRING or DEPLOY, it will not fire * and will STOW. * - * @return the Weapon (Melee or Projectile) the mob will use to attack the target. null if immune target or no target + * returns the Weapon (Melee or Projectile) the mob will use to attack the target. null if immune target or no target * */ private Weapon meleeOrProjectile() { - +// Vector2 newVector = new Vector2(owner.getEntity().getPosition().x - 10f, owner.getEntity().getPosition().y - 2f); +// Fixture hitraycast = physics.raycastGetHit(owner.getEntity().getPosition(), newVector, TARGET); setTarget(); TouchAttackComponent comp = owner.getEntity().getComponent(TouchAttackComponent.class); Weapon chosenWeapon = null; @@ -205,6 +242,6 @@ private Weapon meleeOrProjectile() { private void setTarget() { Vector2 newVector = new Vector2(owner.getEntity().getPosition().x - 10f, owner.getEntity().getPosition().y - 2f); - target = physics.raycastGetHit(owner.getEntity().getPosition(), newVector, TARGET_LAYER); + target = physics.raycastGetHit(owner.getEntity().getPosition(), newVector, TARGET); } } diff --git a/source/core/src/main/com/csse3200/game/components/tasks/MobDodgeTask.java b/source/core/src/main/com/csse3200/game/components/tasks/MobDodgeTask.java index a437fbdbf..5cc8a44d1 100644 --- a/source/core/src/main/com/csse3200/game/components/tasks/MobDodgeTask.java +++ b/source/core/src/main/com/csse3200/game/components/tasks/MobDodgeTask.java @@ -1,9 +1,11 @@ package com.csse3200.game.components.tasks; -import com.csse3200.game.components.tasks.MobTask.MobTask; -import com.csse3200.game.components.tasks.MobTask.MobType; +import com.badlogic.gdx.math.Vector2; import com.csse3200.game.services.GameTime; import com.csse3200.game.services.ServiceLocator; +import com.csse3200.game.ai.tasks.AITaskComponent; +import com.csse3200.game.components.npc.XenoAnimationController; +import com.csse3200.game.components.tasks.MobTask.*; /** * This task runs the AI that adds a dodge mechanic/functionality for the mobs @@ -23,15 +25,17 @@ public class MobDodgeTask extends MobTask { private long endTime; // Helps task wait between each interval. - private static final int DELAY_INTERVAL = 500; + private final int DELAY_INTERVAL = 500; /** * Initialises a mob dodge task with a specified wander range, wait time, and * priority level. * - * @param mobType Distance in X and Y the entity can move from its position - * when start() is called. - * @param priority Priority level compared to other added tasks. + * @param wanderRange Distance in X and Y the entity can move from its position + * when start() is + * called. + * @param waitTime How long in seconds to wait between wandering. + * @param priority Priority level compared to other added tasks. */ public MobDodgeTask(MobType mobType, int priority) { super(mobType); @@ -59,13 +63,15 @@ public void start() { @Override public void update() { super.update(); - if (timeSource.getTime() >= endTime) { - owner.getEntity().getEvents().trigger("dodgeIncomingEntity", - owner.getEntity().getCenterPosition()); - + if(!owner.getEntity().getComponent(AITaskComponent.class).freezed) + { + if (timeSource.getTime() >= endTime) { + owner.getEntity().getEvents().trigger("dodgeIncomingEntity", + owner.getEntity().getCenterPosition()); - endTime = timeSource.getTime() + DELAY_INTERVAL; // update time - } + endTime = timeSource.getTime() + DELAY_INTERVAL; // update time + } + } } /** diff --git a/source/core/src/main/com/csse3200/game/components/tasks/MobMeleeAttackTask.java b/source/core/src/main/com/csse3200/game/components/tasks/MobMeleeAttackTask.java index b76de16a4..336b75f4b 100644 --- a/source/core/src/main/com/csse3200/game/components/tasks/MobMeleeAttackTask.java +++ b/source/core/src/main/com/csse3200/game/components/tasks/MobMeleeAttackTask.java @@ -16,13 +16,15 @@ import com.csse3200.game.physics.raycast.RaycastHit; import com.csse3200.game.services.GameTime; import com.csse3200.game.services.ServiceLocator; +import com.csse3200.game.ai.tasks.AITaskComponent; +import com.csse3200.game.components.npc.XenoAnimationController; /** * Task that allows mobs to shoot projectiles or melee attack towers */ public class MobMeleeAttackTask extends DefaultTask implements PriorityTask { private static final int INTERVAL = 1; // time interval to scan for towers in - private static final short TARGET_LAYER = PhysicsLayer.HUMANS; // mobs detecting for towers + private static final short TARGET = PhysicsLayer.HUMANS; // mobs detecting for towers // ^ fix this private static final String STOW = "wanderStart"; @@ -33,13 +35,15 @@ public class MobMeleeAttackTask extends DefaultTask implements PriorityTask { private Fixture target; private final int priority; + private final float maxRange; + private Vector2 mobPosition = new Vector2(10f,10f); private final Vector2 maxRangePosition = new Vector2(); private final PhysicsEngine physics; private GameTime timeSource; private long endTime; private final RaycastHit hit = new RaycastHit(); - private static final long DELAY = 1000; // delay between shots + private final long delay = 1000; // delay between shots private long startTime; private enum STATE { @@ -52,8 +56,9 @@ private enum STATE { * @param priority Task priority when targets are detected (0 when nothing detected). Must be a positive integer. * @param maxRange Maximum effective range of the weapon mob. This determines the detection distance of targets */ - public MobMeleeAttackTask(int priority) { + public MobMeleeAttackTask(int priority, float maxRange) { this.priority = priority; + this.maxRange = maxRange; startTime = 0; physics = ServiceLocator.getPhysicsService().getPhysics(); @@ -67,11 +72,11 @@ public MobMeleeAttackTask(int priority) { public void start() { super.start(); startTime = timeSource.getTime(); - Vector2 mobPosition = owner.getEntity().getCenterPosition(); + this.mobPosition = owner.getEntity().getCenterPosition(); this.maxRangePosition.set(0, mobPosition.y); //owner.getEntity().getEvents().trigger(IDLE); endTime = timeSource.getTime() + (INTERVAL * 500); -// owner.getEntity().getEvents().trigger(FIRING); +// owner.getEntity().getEvents().trigger("shootStart"); } /** @@ -80,11 +85,14 @@ public void start() { */ @Override public void update() { - updateMobState(); - - if (mobState == STATE.STOW) { - status = Status.FINISHED; - } + + if(!owner.getEntity().getComponent(AITaskComponent.class).freezed) + { + updateMobState(); + if (mobState == STATE.STOW) { + status = Status.FINISHED; + } + } } /** @@ -92,62 +100,64 @@ public void update() { * triggers the appropriate events corresponding to the STATE enum. */ public void updateMobState() { - switch (mobState) { - - case IDLE -> { - if (isTargetVisible()) { - // targets detected in idle mode - start deployment - owner.getEntity().getEvents().trigger(DEPLOY); - mobState = STATE.DEPLOY; - } - } - - case DEPLOY -> { - // currently deploying, - if (isTargetVisible() || this.meleeOrProjectile() != null) { - owner.getEntity().getComponent(PhysicsMovementComponent.class).setEnabled(false); - this.owner.getEntity().getEvents().trigger(FIRING); - mobState = STATE.FIRING; - } else { - this.owner.getEntity().getEvents().trigger(STOW); - mobState = STATE.STOW; - } - } - - case FIRING -> { - // targets gone or cannot be attacked - stop firing - if (!isTargetVisible() || this.meleeOrProjectile() == null) { - this.owner.getEntity().getEvents().trigger(STOW); - mobState = STATE.STOW; - } else if (this.meleeOrProjectile() instanceof Melee) { - TouchAttackComponent attackComp = owner.getEntity().getComponent(TouchAttackComponent.class); - HitboxComponent hitboxComp = owner.getEntity().getComponent(HitboxComponent.class); - attackComp.onCollisionStart(hitboxComp.getFixture(), target); - this.owner.getEntity().getEvents().trigger(FIRING); - } else { - Entity newProjectile = ProjectileFactory.createMobBall(PhysicsLayer.HUMANS, new Vector2(0, owner.getEntity().getPosition().y), new Vector2(2f,2f)); - newProjectile.setPosition(owner.getEntity().getPosition().x, owner.getEntity().getPosition().y); - newProjectile.setScale(-0.0f, 0.0f); - ServiceLocator.getEntityService().register(newProjectile); - -// System.out.printf("ANIMATION: " + owner.getEntity().getComponent(AnimationRenderComponent.class).getCurrentAnimation() + "\n"); - this.owner.getEntity().getEvents().trigger(FIRING); - mobState = STATE.STOW; - } - owner.getEntity().getComponent(PhysicsMovementComponent.class).setEnabled(true); - } - - case STOW -> { - // currently stowing - if (isTargetVisible()) { - owner.getEntity().getEvents().trigger(DEPLOY); - mobState = STATE.DEPLOY; - } else { - owner.getEntity().getEvents().trigger(IDLE); - mobState = STATE.IDLE; - } - } - } + switch (mobState) { + case IDLE -> { + if (isTargetVisible()) { + // targets detected in idle mode - start deployment + owner.getEntity().getEvents().trigger(DEPLOY); + mobState = STATE.DEPLOY; + } + } + + case DEPLOY -> { + // currently deploying, + if (isTargetVisible() || this.meleeOrProjectile() != null) { + owner.getEntity().getComponent(PhysicsMovementComponent.class).setEnabled(false); + this.owner.getEntity().getEvents().trigger(FIRING); + mobState = STATE.FIRING; + } else { + this.owner.getEntity().getEvents().trigger(STOW); + mobState = STATE.STOW; + } + } + + case FIRING -> { + // targets gone or cannot be attacked - stop firing + if (!isTargetVisible() || this.meleeOrProjectile() == null) { + this.owner.getEntity().getEvents().trigger(STOW); + mobState = STATE.STOW; + } else { + if (this.meleeOrProjectile() instanceof Melee) { + TouchAttackComponent attackComp = owner.getEntity().getComponent(TouchAttackComponent.class); + HitboxComponent hitboxComp = owner.getEntity().getComponent(HitboxComponent.class); + attackComp.onCollisionStart(hitboxComp.getFixture(), target); + this.owner.getEntity().getEvents().trigger("shootStart"); + } else { + Entity newProjectile = ProjectileFactory.createMobBall(PhysicsLayer.HUMANS, new Vector2(0, owner.getEntity().getPosition().y), new Vector2(2f,2f)); + newProjectile.setPosition((float) (owner.getEntity().getPosition().x), (float) (owner.getEntity().getPosition().y)); + newProjectile.setScale(-0.0f, 0.0f); + ServiceLocator.getEntityService().register(newProjectile); + + // System.out.printf("ANIMATION: " + owner.getEntity().getComponent(AnimationRenderComponent.class).getCurrentAnimation() + "\n"); + this.owner.getEntity().getEvents().trigger(FIRING); + mobState = STATE.STOW; + } + } + owner.getEntity().getComponent(PhysicsMovementComponent.class).setEnabled(true); + + } + + case STOW -> { + // currently stowing + if (isTargetVisible()) { + owner.getEntity().getEvents().trigger(DEPLOY); + mobState = STATE.DEPLOY; + } else { + owner.getEntity().getEvents().trigger(IDLE); + mobState = STATE.IDLE; + } + } + } } /** @@ -169,7 +179,29 @@ public void stop() { */ @Override public int getPriority() { - if ((startTime + DELAY) < timeSource.getTime() && isTargetVisible() && this.meleeOrProjectile() != null) { + if (status == Status.ACTIVE) { + return getActivePriority(); + } + return getInactivePriority(); + } + + /** + * Fetches the active priority of the Task if a target is visible. + * @return (int) active priority if a target is visible, -1 otherwise + */ + private int getActivePriority() { + if ((startTime + delay) < timeSource.getTime() && isTargetVisible() && this.meleeOrProjectile() != null) { + return priority; + } + return -1; + } + + /** + * Fetches the inactive priority of the Task if a target is not visible. + * @return (int) -1 if a target is not visible, active priority otherwise + */ + private int getInactivePriority() { + if ((startTime + delay) < timeSource.getTime() && isTargetVisible() && this.meleeOrProjectile() != null) { return priority; } return -1; @@ -181,7 +213,7 @@ public int getPriority() { */ private boolean isTargetVisible() { Vector2 newVector = new Vector2(owner.getEntity().getPosition().x - 100f, owner.getEntity().getPosition().y - 2f); - return physics.raycast(owner.getEntity().getPosition(), newVector, TARGET_LAYER, hit); + return physics.raycast(owner.getEntity().getPosition(), newVector, TARGET, hit); } /** @@ -209,6 +241,6 @@ private Weapon meleeOrProjectile() { private void setTarget() { Vector2 newVector = new Vector2(owner.getEntity().getPosition().x - 100f, owner.getEntity().getPosition().y - 2f); - target = physics.raycastGetHit(owner.getEntity().getPosition(), newVector, TARGET_LAYER); + target = physics.raycastGetHit(owner.getEntity().getPosition(), newVector, TARGET); } } diff --git a/source/core/src/main/com/csse3200/game/components/tasks/MobRangedAttackTask.java b/source/core/src/main/com/csse3200/game/components/tasks/MobRangedAttackTask.java index 021419a05..35eb230fc 100644 --- a/source/core/src/main/com/csse3200/game/components/tasks/MobRangedAttackTask.java +++ b/source/core/src/main/com/csse3200/game/components/tasks/MobRangedAttackTask.java @@ -16,13 +16,17 @@ import com.csse3200.game.physics.raycast.RaycastHit; import com.csse3200.game.services.GameTime; import com.csse3200.game.services.ServiceLocator; - +import com.csse3200.game.ai.tasks.AITaskComponent; +import com.csse3200.game.components.npc.FireWormAnimationController; +import com.csse3200.game.components.npc.WizardAnimationController; +import com.csse3200.game.components.npc.WaterQueenAnimationController; +import com.csse3200.game.components.ProjectileEffects; /** * Task that allows mobs to shoot projectiles or melee attack towers */ public class MobRangedAttackTask extends DefaultTask implements PriorityTask { private static final int INTERVAL = 1; // time interval to scan for towers in - private static final short TARGET_LAYER = PhysicsLayer.HUMANS; // mobs detecting for towers + private static final short TARGET = PhysicsLayer.HUMANS; // mobs detecting for towers // ^ fix this private static final String STOW = "wanderStart"; @@ -33,13 +37,15 @@ public class MobRangedAttackTask extends DefaultTask implements PriorityTask { private Fixture target; private final int priority; + private final float maxRange; + private Vector2 mobPosition = new Vector2(10f,10f); private final Vector2 maxRangePosition = new Vector2(); private final PhysicsEngine physics; private GameTime timeSource; private long endTime; private final RaycastHit hit = new RaycastHit(); - private static final long DELAY = 1000; // delay between shots + private final long delay = 1000; // delay between shots private long startTime; private enum STATE { @@ -50,9 +56,11 @@ private enum STATE { /** * @param priority Task priority when targets are detected (0 when nothing detected). Must be a positive integer. + * @param maxRange Maximum effective range of the weapon mob. This determines the detection distance of targets */ - public MobRangedAttackTask(int priority) { + public MobRangedAttackTask(int priority, float maxRange) { this.priority = priority; + this.maxRange = maxRange; startTime = 0; physics = ServiceLocator.getPhysicsService().getPhysics(); @@ -66,7 +74,7 @@ public MobRangedAttackTask(int priority) { public void start() { super.start(); startTime = timeSource.getTime(); - Vector2 mobPosition = owner.getEntity().getCenterPosition(); + this.mobPosition = owner.getEntity().getCenterPosition(); this.maxRangePosition.set(0, mobPosition.y); //owner.getEntity().getEvents().trigger(IDLE); endTime = timeSource.getTime() + (INTERVAL * 500); @@ -79,11 +87,14 @@ public void start() { */ @Override public void update() { - updateMobState(); + if(!owner.getEntity().getComponent(AITaskComponent.class).freezed) + { + updateMobState(); - if (mobState == STATE.STOW) { - status = Status.FINISHED; - } + if (mobState == STATE.STOW) { + status = Status.FINISHED; + } + } } /** @@ -118,28 +129,43 @@ public void updateMobState() { if (!isTargetVisible() || this.meleeOrProjectile() == null) { this.owner.getEntity().getEvents().trigger(STOW); mobState = STATE.STOW; - } else if (this.meleeOrProjectile() instanceof Melee) { - TouchAttackComponent attackComp = owner.getEntity().getComponent(TouchAttackComponent.class); - HitboxComponent hitboxComp = owner.getEntity().getComponent(HitboxComponent.class); - attackComp.onCollisionStart(hitboxComp.getFixture(), target); - Entity newProjectile = ProjectileFactory.createMobBall(PhysicsLayer.HUMANS, new Vector2(0, owner.getEntity().getPosition().y), new Vector2(2f,2f)); - newProjectile.setPosition(owner.getEntity().getPosition().x, owner.getEntity().getPosition().y); - newProjectile.setScale(-1f, 1f); - ServiceLocator.getEntityService().register(newProjectile); - - // System.out.printf("ANIMATION: " + owner.getEntity().getComponent(AnimationRenderComponent.class).getCurrentAnimation() + "\n"); - this.owner.getEntity().getEvents().trigger(FIRING); } else { - Entity newProjectile = ProjectileFactory.createMobBall(PhysicsLayer.HUMANS, new Vector2(0, owner.getEntity().getPosition().y), new Vector2(2f,2f)); - newProjectile.setPosition(owner.getEntity().getPosition().x, owner.getEntity().getPosition().y); - newProjectile.setScale(-1f, 1f); - ServiceLocator.getEntityService().register(newProjectile); + Entity newProjectile = (owner.getEntity().getComponent(FireWormAnimationController.class)!=null)? + ProjectileFactory.createEffectProjectile(PhysicsLayer.HUMANS, new Vector2(0, owner.getEntity().getPosition().y), new Vector2(2f,2f), ProjectileEffects.BURN, false) + : ((owner.getEntity().getComponent(WaterQueenAnimationController.class)!=null)? + ProjectileFactory.createComboSnowBall(PhysicsLayer.HUMANS, new Vector2(0, owner.getEntity().getPosition().y), new Vector2(2f,2f), false) + : ((owner.getEntity().getComponent(WizardAnimationController.class)!=null)? + ProjectileFactory.createEffectProjectile(PhysicsLayer.HUMANS, new Vector2(0, owner.getEntity().getPosition().y), new Vector2(2f,2f), ProjectileEffects.STUN, false) + : ProjectileFactory.createMobBall(PhysicsLayer.HUMANS, new Vector2(0, owner.getEntity().getPosition().y), new Vector2(2f,2f)))); + newProjectile.setPosition((float) (owner.getEntity().getPosition().x), (float) (owner.getEntity().getPosition().y)); + newProjectile.setScale(-1f, 1f); + Entity newProjectile1 = (owner.getEntity().getComponent(FireWormAnimationController.class)!=null)? + ProjectileFactory.createPierceFireBall(PhysicsLayer.HUMANS, new Vector2(0, owner.getEntity().getPosition().y), new Vector2(2f,2f)) + : ((owner.getEntity().getComponent(WaterQueenAnimationController.class)!=null)? + ProjectileFactory.createFireworks(PhysicsLayer.HUMANS, new Vector2(0, owner.getEntity().getPosition().y), new Vector2(2f,2f)) + : ((owner.getEntity().getComponent(WizardAnimationController.class)!=null)? + ProjectileFactory.createRicochetFireball(PhysicsLayer.HUMANS, new Vector2(0, owner.getEntity().getPosition().y), new Vector2(2f,2f), 3) + : ProjectileFactory.createMobBall(PhysicsLayer.HUMANS, new Vector2(0, owner.getEntity().getPosition().y), new Vector2(2f,2f)))); + newProjectile1.setPosition((float) (owner.getEntity().getPosition().x), (float) (owner.getEntity().getPosition().y)); + newProjectile1.setScale(-1f, 1f); + ServiceLocator.getEntityService().register(newProjectile1); + ServiceLocator.getEntityService().register(newProjectile); + + if (this.meleeOrProjectile() instanceof Melee) { + TouchAttackComponent attackComp = owner.getEntity().getComponent(TouchAttackComponent.class); + HitboxComponent hitboxComp = owner.getEntity().getComponent(HitboxComponent.class); + attackComp.onCollisionStart(hitboxComp.getFixture(), target); // System.out.printf("ANIMATION: " + owner.getEntity().getComponent(AnimationRenderComponent.class).getCurrentAnimation() + "\n"); - this.owner.getEntity().getEvents().trigger(FIRING); - mobState = STATE.STOW; + this.owner.getEntity().getEvents().trigger(FIRING); + } else { + // System.out.printf("ANIMATION: " + owner.getEntity().getComponent(AnimationRenderComponent.class).getCurrentAnimation() + "\n"); + this.owner.getEntity().getEvents().trigger(FIRING); + mobState = STATE.STOW; + } } owner.getEntity().getComponent(PhysicsMovementComponent.class).setEnabled(true); + } case STOW -> { @@ -174,7 +200,29 @@ public void stop() { */ @Override public int getPriority() { - if ((startTime + DELAY) < timeSource.getTime() && isTargetVisible() && this.meleeOrProjectile() != null) { + if (status == Status.ACTIVE) { + return getActivePriority(); + } + return getInactivePriority(); + } + + /** + * Fetches the active priority of the Task if a target is visible. + * @return (int) active priority if a target is visible, -1 otherwise + */ + private int getActivePriority() { + if ((startTime + delay) < timeSource.getTime() && isTargetVisible() && this.meleeOrProjectile() != null) { + return priority; + } + return -1; + } + + /** + * Fetches the inactive priority of the Task if a target is not visible. + * @return (int) -1 if a target is not visible, active priority otherwise + */ + private int getInactivePriority() { + if ((startTime + delay) < timeSource.getTime() && isTargetVisible() && this.meleeOrProjectile() != null) { return priority; } return -1; @@ -186,7 +234,7 @@ public int getPriority() { */ private boolean isTargetVisible() { Vector2 newVector = new Vector2(owner.getEntity().getPosition().x - 100f, owner.getEntity().getPosition().y - 2f); - return physics.raycast(owner.getEntity().getPosition(), newVector, TARGET_LAYER, hit); + return physics.raycast(owner.getEntity().getPosition(), newVector, TARGET, hit); } /** @@ -214,6 +262,6 @@ private Weapon meleeOrProjectile() { private void setTarget() { Vector2 newVector = new Vector2(owner.getEntity().getPosition().x - 100f, owner.getEntity().getPosition().y - 2f); - target = physics.raycastGetHit(owner.getEntity().getPosition(), newVector, TARGET_LAYER); + target = physics.raycastGetHit(owner.getEntity().getPosition(), newVector, TARGET); } } diff --git a/source/core/src/main/com/csse3200/game/components/tasks/MobShootTask.java b/source/core/src/main/com/csse3200/game/components/tasks/MobShootTask.java index 2453c4941..e44abeea2 100644 --- a/source/core/src/main/com/csse3200/game/components/tasks/MobShootTask.java +++ b/source/core/src/main/com/csse3200/game/components/tasks/MobShootTask.java @@ -12,13 +12,15 @@ import com.csse3200.game.physics.raycast.RaycastHit; import com.csse3200.game.services.GameTime; import com.csse3200.game.services.ServiceLocator; +import com.csse3200.game.ai.tasks.AITaskComponent; +import com.csse3200.game.components.npc.XenoAnimationController; /** * Task that allows mobs to shoot projectiles or melee attack towers */ public class MobShootTask extends DefaultTask implements PriorityTask { private static final int INTERVAL = 1; // time interval to scan for towers in - private static final short TARGET_LAYER = PhysicsLayer.HUMANS; // mobs detecting for towers + private static final short TARGET = PhysicsLayer.HUMANS; // mobs detecting for towers // ^ fix this private static final String WALKING = "wanderStart"; @@ -29,13 +31,15 @@ public class MobShootTask extends DefaultTask implements PriorityTask { private Fixture target; private final int priority; + private final float maxRange; + private Vector2 mobPosition = new Vector2(10f,10f); private final Vector2 maxRangePosition = new Vector2(); private final PhysicsEngine physics; private GameTime timeSource; private long endTime; private final RaycastHit hit = new RaycastHit(); - private static final long DELAY = 1000; // delay between shots + private final long delay = 1000; // delay between shots private long startTime; private enum STATE { @@ -46,9 +50,11 @@ private enum STATE { /** * @param priority Task priority when targets are detected (0 when nothing detected). Must be a positive integer. + * @param maxRange Maximum effective range of the weapon mob. This determines the detection distance of targets */ - public MobShootTask(int priority) { + public MobShootTask(int priority, float maxRange) { this.priority = priority; + this.maxRange = maxRange; startTime = 0; physics = ServiceLocator.getPhysicsService().getPhysics(); @@ -62,7 +68,7 @@ public MobShootTask(int priority) { public void start() { super.start(); startTime = timeSource.getTime(); - Vector2 mobPosition = owner.getEntity().getCenterPosition(); + this.mobPosition = owner.getEntity().getCenterPosition(); this.maxRangePosition.set(0, mobPosition.y); //owner.getEntity().getEvents().trigger(IDLE); endTime = timeSource.getTime() + (INTERVAL * 500); @@ -75,11 +81,14 @@ public void start() { */ @Override public void update() { - updateMobState(); - - if (mobState == STATE.WALKING) { - status = Status.FINISHED; - } + if(!owner.getEntity().getComponent(AITaskComponent.class).freezed) + { + updateMobState(); + + if (mobState == STATE.WALKING) { + status = Status.FINISHED; + } + } } /** @@ -99,7 +108,7 @@ public void updateMobState() { case DEPLOY -> { // currently deploying, - if (isTargetVisible()) { + if (isTargetVisible() != false) { owner.getEntity().getComponent(PhysicsMovementComponent.class).setEnabled(false); this.owner.getEntity().getEvents().trigger(FIRING); mobState = STATE.FIRING; @@ -111,13 +120,13 @@ public void updateMobState() { case FIRING -> { // targets gone or cannot be attacked - stop firing - if (isTargetVisible()) { + if (!isTargetVisible() == false) { this.owner.getEntity().getEvents().trigger(WALKING); mobState = STATE.WALKING; } else { Entity newProjectile = ProjectileFactory.createMobBall(PhysicsLayer.HUMANS, new Vector2(0, owner.getEntity().getPosition().y), new Vector2(2f,2f)); - newProjectile.setPosition(owner.getEntity().getPosition().x, owner.getEntity().getPosition().y); + newProjectile.setPosition((float) (owner.getEntity().getPosition().x), (float) (owner.getEntity().getPosition().y)); newProjectile.setScale(-1f, 1f); ServiceLocator.getEntityService().register(newProjectile); @@ -163,7 +172,29 @@ public void stop() { */ @Override public int getPriority() { - if ((startTime + DELAY) < timeSource.getTime() && isTargetVisible()) { + if (status == Status.ACTIVE) { + return getActivePriority(); + } + return getInactivePriority(); + } + + /** + * Fetches the active priority of the Task if a target is visible. + * @return (int) active priority if a target is visible, -1 otherwise + */ + private int getActivePriority() { + if ((startTime + delay) < timeSource.getTime() && isTargetVisible() != false) { + return priority; + } + return -1; + } + + /** + * Fetches the inactive priority of the Task if a target is not visible. + * @return (int) -1 if a target is not visible, active priority otherwise + */ + private int getInactivePriority() { + if ((startTime + delay) < timeSource.getTime() && isTargetVisible() != false) { return priority; } return -1; @@ -175,7 +206,7 @@ public int getPriority() { */ private boolean isTargetVisible() { Vector2 newVector = new Vector2(owner.getEntity().getPosition().x - 10f, owner.getEntity().getPosition().y - 2f); - return physics.raycast(owner.getEntity().getPosition(), newVector, TARGET_LAYER, hit); + return physics.raycast(owner.getEntity().getPosition(), newVector, TARGET, hit); } /** @@ -203,6 +234,6 @@ private boolean isTargetVisible() { private void setTarget() { Vector2 newVector = new Vector2(owner.getEntity().getPosition().x - 10f, owner.getEntity().getPosition().y - 2f); - target = physics.raycastGetHit(owner.getEntity().getPosition(), newVector, TARGET_LAYER); + target = physics.raycastGetHit(owner.getEntity().getPosition(), newVector, TARGET); } } diff --git a/source/core/src/main/com/csse3200/game/components/tasks/MobTask/MobTask.java b/source/core/src/main/com/csse3200/game/components/tasks/MobTask/MobTask.java index 08aa0b627..0a208914d 100644 --- a/source/core/src/main/com/csse3200/game/components/tasks/MobTask/MobTask.java +++ b/source/core/src/main/com/csse3200/game/components/tasks/MobTask/MobTask.java @@ -1,271 +1,325 @@ -package com.csse3200.game.components.tasks.MobTask; - -import com.badlogic.gdx.math.Vector2; -import com.badlogic.gdx.utils.Timer; -import com.csse3200.game.ai.tasks.DefaultTask; -import com.csse3200.game.ai.tasks.PriorityTask; -import com.csse3200.game.components.CombatStatsComponent; -import com.csse3200.game.components.ProjectileEffects; -import com.csse3200.game.components.tasks.MovementTask; -import com.csse3200.game.entities.Entity; -import com.csse3200.game.entities.factories.ProjectileFactory; -import com.csse3200.game.physics.PhysicsLayer; -import com.csse3200.game.physics.components.HitboxComponent; -import com.csse3200.game.physics.components.PhysicsMovementComponent; -import com.csse3200.game.rendering.AnimationRenderComponent; -import com.csse3200.game.services.GameTime; -import com.csse3200.game.services.ServiceLocator; -import com.csse3200.game.components.tasks.MobTask.MobType; - -/** - * The AI Task for all general mobs. This task handles the sequencing for melee - * and ranged mobs as well as animations for all mobs. Its sequence is based on - * whether the mob is a melee or ranged mob which dictates its attack method. - */ -public class MobTask extends DefaultTask implements PriorityTask { - - // Constants - private static final int PRIORITY = 3; - private static final Vector2 MELEE_MOB_SPEED = new Vector2(0.7f,0.7f); - private static final Vector2 MELEE_RANGE_SPEED = new Vector2(0.5f,0.5f); - private static final int MELEE_DAMAGE = 10; - private static final long MELEE_ATTACK_SPEED = 2000; - private static final long RANGE_ATTACK_SPEED = 5000; - private static final float MELEE_ATTACK_RANGE = 0.2f; - - // Private variables - private final MobType mobType; - private State state = State.DEFAULT; - private Entity mob; - private AnimationRenderComponent animation; - private MovementTask movementTask; - private Entity target; - private GameTime gameTime; - private long lastTimeAttacked; - private long dodgeEndTime; - - // Flags - boolean melee; - boolean runFlag = false; - boolean meleeFlag = false; - boolean targetInRange = false; - boolean rangeAttackFlag = false; - boolean meleeAttackFlag = false; - boolean deathFlag = false; - boolean canDodge = false; - - // Enums - private enum State { - RUN, ATTACK, DEATH, DEFAULT - } - - /** - * constructor for the mob - * @param mobType type of mob it is - */ - public MobTask(MobType mobType) { - this.mobType = mobType; - gameTime = ServiceLocator.getTimeSource(); - } - - /** - * constructor for the mob - * @param mobType type of mob it is - * @param canDodge ability to dodge projectiles - */ - public MobTask(MobType mobType, boolean canDodge) { - this.mobType = mobType; - gameTime = ServiceLocator.getTimeSource(); - this.canDodge = true; - } - - /** - * starts general mob sequence, starts its movement task and initialises - * some of its variables - */ - @Override - public void start() { - super.start(); - mob = owner.getEntity(); - animation = mob.getComponent(AnimationRenderComponent.class); - mob.getComponent(PhysicsMovementComponent.class).setSpeed(MELEE_MOB_SPEED); - melee = mobType.isMelee(); - - movementTask = new MovementTask(new Vector2(0f, mob.getPosition().y)); - movementTask.create(owner); - movementTask.start(); - runFlag = true; - changeState(State.RUN); - lastTimeAttacked = gameTime.getTime(); - dodgeEndTime = gameTime.getTime(); - - if (melee) { - mob.getComponent(PhysicsMovementComponent.class).setSpeed(MELEE_MOB_SPEED); - } else { - mob.getComponent(PhysicsMovementComponent.class).setSpeed(MELEE_RANGE_SPEED); - } - } - - /** - * handles the sequencing of melee and range mobs and detects death state - */ - @Override - public void update() { - - // death check - if (mob.getComponent(CombatStatsComponent.class).getHealth() <= 0 && !deathFlag) { - changeState(State.DEATH); - animate(); - movementTask.stop(); - deathFlag = true; - } else if (deathFlag && animation.isFinished()) { - ServiceLocator.getWaveService().updateEnemyCount(); - mob.setFlagForDelete(true); - } - - if(gameTime.getTime() >= dodgeEndTime) { - if (canDodge) { - mob.getEvents().trigger("dodgeIncomingEntity", - mob.getCenterPosition()); - } - dodgeEndTime = gameTime.getTime() + 500; // 500ms - } - - switch (state) { - case RUN -> { - if (runFlag) { - movementTask.start(); - animate(); - runFlag = false; - } - if (melee && enemyDetected() && gameTime.getTime() - lastTimeAttacked >= MELEE_ATTACK_SPEED) { - changeState(State.ATTACK); - meleeAttackFlag = true; - } else if (gameTime.getTime() - lastTimeAttacked >= RANGE_ATTACK_SPEED) { - changeState(State.ATTACK); - rangeAttackFlag = true; - } - } - case ATTACK -> { - if (melee && meleeAttackFlag) { - movementTask.stop(); - animate(); - meleeAttack(); - meleeAttackFlag = false; - } else if (!melee && rangeAttackFlag) { - movementTask.stop(); - animate(); - rangeAttack(); - rangeAttackFlag = false; - } - if (animation.isFinished()) { - movementTask.start(); - changeState(State.RUN); - runFlag = true; - } - } - } - } - - /** - * handles animation for all states and all possible mobs - */ - private void animate() { - switch (state) { - case RUN -> owner.getEntity().getEvents().trigger("mob_walk"); - case ATTACK -> owner.getEntity().getEvents().trigger("mob_attack"); - case DEATH -> { - owner.getEntity().getEvents().trigger("mob_death"); - owner.getEntity().getEvents().trigger("splitDeath"); - } - case DEFAULT -> owner.getEntity().getEvents().trigger("mob_default"); - } - } - - /** - * Changes the state of the mob. - * - * @param state state to change current state to - */ - private void changeState(State state) { - this.state = state; - } - - /** - * detects if there's an enemy within range of 1 to the left of it - * @return if there's an enemy in front of the mob or not - */ - private boolean enemyDetected() { - // if there's an entity within x of - 1 of mob - Entity targetInFront = ServiceLocator.getEntityService().getEntityAtPosition( - mob.getPosition().x - MELEE_ATTACK_RANGE, mob.getPosition().y); - if (targetInFront == null) { - return false; - } - - // layer checking - HitboxComponent targetHitbox = targetInFront.getComponent(HitboxComponent.class); - if (targetHitbox == null) { - return false; - } - if (PhysicsLayer.contains(PhysicsLayer.HUMANS, targetHitbox.getLayer())) { - this.target = targetInFront; - return true; - } - return false; - } - - /** - * hits the target directly in front of it - */ - private void meleeAttack() { - // toggle melee flag off - meleeFlag = false; - - // check if target is null or not in range - if (target == null) { - return; - } - CombatStatsComponent targetCombatStats = target.getComponent(CombatStatsComponent.class); - targetCombatStats.hit(MELEE_DAMAGE); - Timer.schedule(new Timer.Task() { - @Override - public void run() { - if (!targetInRange) { - return; // stop if target in range - } - meleeFlag = true; // toggle melee flag off - } - }, MELEE_ATTACK_SPEED); - } - - /** - * Shoots a fireball projectile and updates lastTimeAttacked - */ - private void rangeAttack() { - Vector2 destination = new Vector2(0, mob.getPosition().y); - Entity projectile = ProjectileFactory.createEffectProjectile(PhysicsLayer.HUMANS, destination, - new Vector2(2, 2), ProjectileEffects.FIREBALL, false); - projectile.setPosition(mob.getPosition()); - projectile.setScale(-1f, 1f); - ServiceLocator.getEntityService().register(projectile); - lastTimeAttacked = gameTime.getTime(); - } - - /** - * @return priority of task - */ - @Override - public int getPriority() { - return PRIORITY; - } - - /** - * Sets dodge flag of the mob - * - * @param dodgeFlag If true, mob dodges projectile. - */ - public void setDodge(boolean dodgeFlag) { - this.canDodge = dodgeFlag; - } -} +package com.csse3200.game.components.tasks.MobTask; + +import com.badlogic.gdx.math.Vector2; +import com.badlogic.gdx.utils.Timer; +import com.csse3200.game.ai.tasks.DefaultTask; +import com.csse3200.game.ai.tasks.PriorityTask; +import com.csse3200.game.components.CombatStatsComponent; +import com.csse3200.game.components.ProjectileEffects; +import com.csse3200.game.components.tasks.MovementTask; +import com.csse3200.game.entities.Entity; +import com.csse3200.game.entities.factories.ProjectileFactory; +import com.csse3200.game.physics.PhysicsLayer; +import com.csse3200.game.physics.components.HitboxComponent; +import com.csse3200.game.physics.components.PhysicsMovementComponent; +import com.csse3200.game.rendering.AnimationRenderComponent; +import com.csse3200.game.services.GameTime; +import com.csse3200.game.services.ServiceLocator; +import com.csse3200.game.components.npc.ArcaneArcherAnimationController; + +/** + * The AI Task for all general mobs. This task handles the sequencing for melee + * and ranged mobs as well as animations for all mobs. Its sequence is based on + * whether the mob is a melee or ranged mob which dictates its attack method. + */ +public class MobTask extends DefaultTask implements PriorityTask { + + // Constants + private static final int PRIORITY = 3; + private static final Vector2 MELEE_MOB_SPEED = new Vector2(0.7f,0.7f); + private static final Vector2 MELEE_RANGE_SPEED = new Vector2(0.5f,0.5f); + private static final int MELEE_DAMAGE = 10; + private static final long MELEE_ATTACK_SPEED = 2000; + private static final long RANGE_ATTACK_SPEED = 5000; + private static final float MELEE_ATTACK_RANGE = 0.2f; + + // Private variables + private final MobType mobType; + private State state = State.DEFAULT; + private State prevState; + private Entity mob; + private AnimationRenderComponent animation; + private MovementTask movementTask; + private Entity target; + private GameTime gameTime; + private long lastTimeAttacked; + + // Flags + boolean melee; + boolean runFlag = false; + boolean meleeFlag = false; + boolean targetInRange = false; + boolean rangeAttackFlag = false; + boolean meleeAttackFlag = false; + boolean deathFlag = false; + + // Enums + private enum State { + RUN, ATTACK, DEATH, DEFAULT + } + + /** + * constructor for the mob + * @param mobType type of mob it is + */ + public MobTask(MobType mobType) { + this.mobType = mobType; + gameTime = ServiceLocator.getTimeSource(); + } + + /** + * starts general mob sequence, starts its movement task and initialises + * some of its variables + */ + @Override + public void start() { + super.start(); + mob = owner.getEntity(); + animation = mob.getComponent(AnimationRenderComponent.class); + mob.getComponent(PhysicsMovementComponent.class).setSpeed(MELEE_MOB_SPEED); + melee = mobType.isMelee(); + + movementTask = new MovementTask(new Vector2(0f, mob.getPosition().y)); + movementTask.create(owner); + movementTask.start(); + runFlag = true; + changeState(State.RUN); + lastTimeAttacked = gameTime.getTime(); + + if (melee) { + mob.getComponent(PhysicsMovementComponent.class).setSpeed(MELEE_MOB_SPEED); + } else { + mob.getComponent(PhysicsMovementComponent.class).setSpeed(MELEE_RANGE_SPEED); + } + } + + /** + * handles the sequencing of melee and range mobs and detects death state + */ + @Override + public void update() { + + // death check + if (mob.getComponent(CombatStatsComponent.class).getHealth() <= 0 && !deathFlag) { + changeState(State.DEATH); + animate(); + movementTask.stop(); + deathFlag = true; + } else if (deathFlag && animation.isFinished()) { + mob.setFlagForDelete(true); + } + + switch (state) { + case RUN -> { + if (runFlag) { + movementTask.start(); + animate(); + runFlag = false; + } + if (melee) { + if (enemyDetected()) { + if (gameTime.getTime() - lastTimeAttacked >= MELEE_ATTACK_SPEED) { + changeState(State.ATTACK); + meleeAttackFlag = true; + } + } + } else { + if (gameTime.getTime() - lastTimeAttacked >= RANGE_ATTACK_SPEED) { + changeState(State.ATTACK); + rangeAttackFlag = true; + } + } + } + case ATTACK -> { + if (melee) { + if (meleeAttackFlag) { + movementTask.stop(); + animate(); + meleeAttack(); + meleeAttackFlag = false; + } + if (animation.isFinished()) { + movementTask.start(); + changeState(State.RUN); + runFlag = true; + } + } + if (!melee) { + if (rangeAttackFlag) { + movementTask.stop(); + animate(); + rangeAttack(); + rangeAttackFlag = false; + } + if (animation.isFinished()) { + movementTask.start(); + changeState(State.RUN); + runFlag = true; + } + } + } + } + } + + /** + * handles animation for all states and all possible mobs + */ + private void animate() { + switch (state) { + case RUN -> owner.getEntity().getEvents().trigger("mob_walk"); + case ATTACK -> owner.getEntity().getEvents().trigger("mob_attack"); + case DEATH -> { + owner.getEntity().getEvents().trigger("mob_death"); + owner.getEntity().getEvents().trigger("splitDeath"); + } + case DEFAULT -> owner.getEntity().getEvents().trigger("mob_default"); + } + // switch (mobType) { + // case SKELETON -> { + // switch (state) { + // case RUN -> owner.getEntity().getEvents().trigger("skeleton_walk"); + // case ATTACK -> owner.getEntity().getEvents().trigger("skeleton_attack"); + // case DEATH -> owner.getEntity().getEvents().trigger("skeleton_death"); + // case DEFAULT -> owner.getEntity().getEvents().trigger("skeleton_default"); + // } + // } + // case WIZARD -> { + // switch (state) { + // case RUN -> owner.getEntity().getEvents().trigger("wizard_run"); + // case ATTACK -> owner.getEntity().getEvents().trigger("wizard_attack"); + // case DEATH -> owner.getEntity().getEvents().trigger("wizard_death"); + // case DEFAULT -> owner.getEntity().getEvents().trigger("default"); + // } + // } + // case WATER_QUEEN -> { + // switch (state) { + // case RUN -> owner.getEntity().getEvents().trigger("water_queen_walk"); + // case ATTACK -> owner.getEntity().getEvents().trigger("water_queen_attack"); + // case DEATH -> owner.getEntity().getEvents().trigger("water_queen_death"); + // case DEFAULT -> owner.getEntity().getEvents().trigger("default"); + // } + // } + // case WATER_SLIME -> { + // switch (state) { + // case RUN -> owner.getEntity().getEvents().trigger("water_slime_walk"); + // case ATTACK -> owner.getEntity().getEvents().trigger("water_slime_attack"); + // case DEATH -> { + // owner.getEntity().getEvents().trigger("water_slime_death"); + // owner.getEntity().getEvents().trigger("splitDeath"); + // } + // case DEFAULT -> owner.getEntity().getEvents().trigger("default"); + // } + // } + // case FIRE_WORM -> { + // switch (state) { + // case RUN -> owner.getEntity().getEvents().trigger("fire_worm_walk"); + // case ATTACK -> owner.getEntity().getEvents().trigger("fire_worm_attack"); + // case DEATH -> owner.getEntity().getEvents().trigger("fire_worm_death"); + // case DEFAULT -> owner.getEntity().getEvents().trigger("default"); + // } + // } + // case DRAGON_KNIGHT -> { + // switch (state) { + // case RUN -> owner.getEntity().getEvents().trigger("dragon_knight_run"); + // case ATTACK -> owner.getEntity().getEvents().trigger("dragon_knight_attack"); + // case DEATH -> owner.getEntity().getEvents().trigger("dragon_knight_death"); + // case DEFAULT -> owner.getEntity().getEvents().trigger("default"); + // } + // } + // case COAT -> { + // switch (state) { + // case RUN -> owner.getEntity().getEvents().trigger("coat_run"); + // case ATTACK -> owner.getEntity().getEvents().trigger("coat_attack"); + // case DEATH -> owner.getEntity().getEvents().trigger("coat_death"); + // case DEFAULT -> owner.getEntity().getEvents().trigger("default"); + // } + // } + // } + } + + /** + * changes state of the mob + * @param state state to change current state to + */ + private void changeState(State state) { + prevState = this.state; + this.state = state; + } + + /** + * detects if there's an enemy within range of 1 to the left of it + * @return if there's an enemy in front of the mob or not + */ + private boolean enemyDetected() { + // if there's an entity within x of - 1 of mob + Entity target = ServiceLocator.getEntityService().getEntityAtPosition( + mob.getPosition().x - MELEE_ATTACK_RANGE, mob.getPosition().y); + if (target == null) { + return false; + } + + // layer checking + HitboxComponent targetHitbox = target.getComponent(HitboxComponent.class); + if (targetHitbox == null) { + return false; + } + if (PhysicsLayer.contains(PhysicsLayer.HUMANS, targetHitbox.getLayer())) { + this.target = target; + return true; + } + return false; + } + + /** + * hits the target directly in front of it + */ + private void meleeAttack() { + // toggle melee flag off + meleeFlag = false; + + // check if target is null or not in range + if (target == null) { + return; + } + CombatStatsComponent targetCombatStats = target.getComponent(CombatStatsComponent.class); + targetCombatStats.hit(MELEE_DAMAGE); + Timer.schedule(new Timer.Task() { + @Override + public void run() { + if (!targetInRange) { + return; // stop if target in range + } + meleeFlag = true; // toggle melee flag off + } + }, MELEE_ATTACK_SPEED); + if(owner.getEntity().getComponent(ArcaneArcherAnimationController.class)!=null) + { + Entity newProjectile = ProjectileFactory.createPierceArrow(PhysicsLayer.HUMANS, new Vector2(-100, owner.getEntity().getPosition().y), new Vector2(2f,2f)); + newProjectile.setPosition((float) (owner.getEntity().getPosition().x), (float) (owner.getEntity().getPosition().y)); + newProjectile.setScale(1.3f, 1.3f); + ServiceLocator.getEntityService().register(newProjectile); + lastTimeAttacked = gameTime.getTime(); + } + } + + /** + * Shoots a fireball projectile and updates lastTimeAttacked + */ + private void rangeAttack() { + Vector2 destination = new Vector2(0, mob.getPosition().y); + Entity projectile = ProjectileFactory.createEffectProjectile(PhysicsLayer.HUMANS, destination, + new Vector2(2, 2), ProjectileEffects.FIREBALL, false); + projectile.setPosition(mob.getPosition()); + projectile.setScale(-1f, 1f); + ServiceLocator.getEntityService().register(projectile); + lastTimeAttacked = gameTime.getTime(); + } + + /** + * @return priority of task + */ + @Override + public int getPriority() { + return PRIORITY; + } +} diff --git a/source/core/src/main/com/csse3200/game/components/tasks/MobTask/MobType.java b/source/core/src/main/com/csse3200/game/components/tasks/MobTask/MobType.java index 335b2a7e7..92ea1027f 100644 --- a/source/core/src/main/com/csse3200/game/components/tasks/MobTask/MobType.java +++ b/source/core/src/main/com/csse3200/game/components/tasks/MobTask/MobType.java @@ -1,25 +1,26 @@ -package com.csse3200.game.components.tasks.MobTask; - -public enum MobType { - SKELETON(true), - WIZARD(false), - WATER_QUEEN(false), - WATER_SLIME(true), - FIRE_WORM(false), - DRAGON_KNIGHT(true), - COAT(true), - NIGHT_BORNE(true), - ARCANE_ARCHER(false), - ROCKY(true), - NECROMANCER(true), - FIREWIZARD(true); - private boolean isMelee; - - MobType(boolean melee) { - this.isMelee = melee; - } - - public boolean isMelee() { - return isMelee; - } -} +package com.csse3200.game.components.tasks.MobTask; + +public enum MobType { + SKELETON(true), + WIZARD(false), + WATER_QUEEN(false), + WATER_SLIME(true), + FIRE_WORM(false), + DRAGON_KNIGHT(true), + COAT(true), + NIGHT_BORNE(true), + ARCANE_ARCHER(true), + ROCKY(true), + NECROMANCER(true), + FIREWIZARD(true), + XENO(true); + private boolean isMelee; + + MobType(boolean melee) { + this.isMelee = melee; + } + + public boolean isMelee() { + return isMelee; + } +} diff --git a/source/core/src/main/com/csse3200/game/components/tasks/MobWanderTask.java b/source/core/src/main/com/csse3200/game/components/tasks/MobWanderTask.java index e652ea84e..cafc083ed 100644 --- a/source/core/src/main/com/csse3200/game/components/tasks/MobWanderTask.java +++ b/source/core/src/main/com/csse3200/game/components/tasks/MobWanderTask.java @@ -11,6 +11,8 @@ import com.csse3200.game.services.ServiceLocator; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import com.csse3200.game.ai.tasks.AITaskComponent; +import com.csse3200.game.components.npc.WizardAnimationController; /** * Wander around by moving a random position within a range of the starting position. Wait a little @@ -19,17 +21,22 @@ public class MobWanderTask extends DefaultTask implements PriorityTask { private static final Logger logger = LoggerFactory.getLogger(MobWanderTask.class); + private final Vector2 wanderRange; private final float waitTime; private Vector2 startPos; private MovementTask movementTask; private WaitTask waitTask; private Task currentTask; private boolean isDead = false; + private Vector2 mobPosition; /** + * @param wanderRange Distance in X and Y the entity can move from its position when start() is + * called. * @param waitTime How long in seconds to wait between wandering. */ - public MobWanderTask(float waitTime) { + public MobWanderTask(Vector2 wanderRange, float waitTime) { + this.wanderRange = wanderRange; this.waitTime = waitTime; } @@ -52,50 +59,50 @@ public void start() { movementTask.start(); currentTask = movementTask; - - // this.owner.getEntity().getEvents().trigger("wanderStart"); } @Override public void update() { - - // Update the position of the mob - Vector2 mobPosition = owner.getEntity().getPosition(); - - // If the mob is at zero health, kill the mob, - // play the death animation and stop the task - // This method is the idea of Ahmad who very kindly helped with section, massive props to him for his help! - if (!isDead && Boolean.TRUE.equals(owner.getEntity().getComponent(CombatStatsComponent.class).isDead())) { - this.owner.getEntity().getEvents().trigger("dieStart"); - currentTask.stop(); - isDead = true; - ServiceLocator.getWaveService().updateEnemyCount(); - } - - // Check if the mob has finished death animation - else if (isDead && owner.getEntity().getComponent(AnimationRenderComponent.class).isFinished()) { - // Drop scrap at the mobs location - Entity scrap = DropFactory.createScrapDrop(); - scrap.setPosition(mobPosition.x, mobPosition.y); - ServiceLocator.getEntityService().register(scrap); - - // Delete the mob and update count for number of mobs remaining in the wave - owner.getEntity().setFlagForDelete(true); - - } - // If not dead, do normal things... - else if (!isDead) { - - if (currentTask.getStatus() != Status.ACTIVE) { - if (currentTask == movementTask) { - startWaiting(); - } else { - startMoving(); - } - } - currentTask.update(); - } + if(!owner.getEntity().getComponent(AITaskComponent.class).freezed) + { + // Update the position of the mob + mobPosition = owner.getEntity().getPosition(); + + // If the mob is at zero health, kill the mob, + // play the death animation and stop the task + // This method is the idea of Ahmad who very kindly helped with section, massive props to him for his help! + if (!isDead && owner.getEntity().getComponent(CombatStatsComponent.class).isDead()) { + this.owner.getEntity().getEvents().trigger("dieStart"); + currentTask.stop(); + isDead = true; + ServiceLocator.getWaveService().updateEnemyCount(); + } + + // Check if the mob has finished death animation + else if (isDead && owner.getEntity().getComponent(AnimationRenderComponent.class).isFinished()) { + // Drop scrap at the mobs location + Entity scrap = DropFactory.createScrapDrop(); + scrap.setPosition(mobPosition.x,mobPosition.y); + ServiceLocator.getEntityService().register(scrap); + + // Delete the mob and update count for number of mobs remaining in the wave + owner.getEntity().setFlagForDelete(true); + + } + // If not dead, do normal things... + else if (!isDead) { + + if (currentTask.getStatus() != Status.ACTIVE) { + if (currentTask == movementTask) { + startWaiting(); + } else { + startMoving(); + } + } + currentTask.update(); + } + } } private void startWaiting() { diff --git a/source/core/src/main/com/csse3200/game/entities/PredefinedWeapons.java b/source/core/src/main/com/csse3200/game/entities/PredefinedWeapons.java index 53e7e1af7..2f0c8d7b5 100644 --- a/source/core/src/main/com/csse3200/game/entities/PredefinedWeapons.java +++ b/source/core/src/main/com/csse3200/game/entities/PredefinedWeapons.java @@ -13,9 +13,15 @@ private PredefinedWeapons() { public static final Melee PUNCH = new Melee(3, 1, "air", 1, 1); public static final Melee AXE = new Melee(9, 3, "fire", 1, 1); public static final Melee KICK = new Melee(2, 1, "earth", 1, 1); + public static final Melee sword = new Melee(10, 4, "fire", 1, 1); + public static final Melee punch = new Melee(3, 1, "air", 1, 1); + public static final Melee axe = new Melee(9, 3, "fire", 1, 1); + public static final Melee kick = new Melee(2, 1, "earth", 1, 1); //TODO import defined projectiles for mobs public static final ProjectileConfig FIREBALL = new ProjectileConfig(); public static final ProjectileConfig FROSTBALL = new ProjectileConfig(); + public static final ProjectileConfig fireBall = new ProjectileConfig(); + public static final ProjectileConfig frostBall = new ProjectileConfig(); } diff --git a/source/core/src/main/com/csse3200/game/entities/factories/NPCFactory.java b/source/core/src/main/com/csse3200/game/entities/factories/NPCFactory.java index e8038c978..a31a49fe0 100644 --- a/source/core/src/main/com/csse3200/game/entities/factories/NPCFactory.java +++ b/source/core/src/main/com/csse3200/game/entities/factories/NPCFactory.java @@ -1,668 +1,702 @@ -package com.csse3200.game.entities.factories; - -import com.badlogic.gdx.graphics.g2d.Animation; -import com.badlogic.gdx.graphics.g2d.TextureAtlas; -import com.badlogic.gdx.math.Vector2; -import com.csse3200.game.ai.tasks.AITaskComponent; -import com.csse3200.game.components.CombatStatsComponent; -import com.csse3200.game.components.EffectComponent; -import com.csse3200.game.components.TouchAttackComponent; -import com.csse3200.game.components.npc.*; -import com.csse3200.game.components.tasks.MobDodgeTask; -import com.csse3200.game.components.tasks.MobMeleeAttackTask; -import com.csse3200.game.components.tasks.MobRangedAttackTask; -import com.csse3200.game.components.tasks.MobWanderTask; -import com.csse3200.game.components.tasks.MobTask.MobTask; -import com.csse3200.game.components.tasks.MobTask.MobType; -import com.csse3200.game.entities.Entity; -import com.csse3200.game.entities.Melee; -import com.csse3200.game.entities.PredefinedWeapons; -import com.csse3200.game.entities.configs.*; -import com.csse3200.game.files.FileLoader; -import com.csse3200.game.physics.PhysicsLayer; -import com.csse3200.game.physics.PhysicsUtils; -import com.csse3200.game.physics.components.ColliderComponent; -import com.csse3200.game.physics.components.HitboxComponent; -import com.csse3200.game.physics.components.PhysicsComponent; -import com.csse3200.game.physics.components.PhysicsMovementComponent; -import com.csse3200.game.rendering.AnimationRenderComponent; -import com.csse3200.game.rendering.TextureRenderComponent; -import com.csse3200.game.services.ServiceLocator; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Currency; - -/** - * Factory to create non-playable character (NPC) entities with predefined components. - * - *

Each NPC entity type should have a creation method that returns a corresponding entity. - * Predefined entity properties can be loaded from configs stored as json files which are defined in - * "NPCConfigs". - * - *

If needed, this factory can be separated into more specific factories for entities with - * similar characteristics. - */ -public class NPCFactory { - private static final NPCConfigs configs = - FileLoader.readClass(NPCConfigs.class, "configs/NPCs.json"); - private static final String DEFAULT = "default"; - - /** - * Creates a ghost entity. - * - * @return entity - */ - public static Entity createGhost() { - Entity ghost = createMeleeBaseNPC(); - BaseEntityConfig config = configs.ghost; - /** - AnimationRenderComponent animator = - new AnimationRenderComponent( - ServiceLocator.getResourceService().getAsset("images/ghost.atlas", TextureAtlas.class)); - animator.addAnimation("angry_float", 0.1f, Animation.PlayMode.LOOP); - animator.addAnimation("float", 0.1f, Animation.PlayMode.LOOP); - **/ - ghost - .addComponent(new CombatStatsComponent(config.health, config.baseAttack)) - .addComponent(new TextureRenderComponent("images/mobs/satyr.png")); - - ghost.getComponent(TextureRenderComponent.class).scaleEntity(); - - return ghost; - } - - /** - * Creates a ghost king entity. - * - * @return entity - */ - public static Entity createGhostKing() { - Entity ghostKing = createMeleeBaseNPC(); - GhostKingConfig config = configs.ghostKing; - - AnimationRenderComponent animator = - new AnimationRenderComponent( - ServiceLocator.getResourceService() - .getAsset("images/ghostKing.atlas", TextureAtlas.class)); - animator.addAnimation("float", 0.2f, Animation.PlayMode.LOOP); - animator.addAnimation("angry_float", 0.2f, Animation.PlayMode.LOOP); - - ghostKing - .addComponent(new CombatStatsComponent(config.health, config.baseAttack)) - .addComponent(animator) - .addComponent(new GhostAnimationController()); - - ghostKing.getComponent(AnimationRenderComponent.class).scaleEntity(); - return ghostKing; - } - - /** - * Creates a fire worm entity. - * - * @return entity - */ - public static Entity createSkeleton(int health) { - Entity skeleton = createBaseNPC(); - ArrayList drops = new ArrayList<>(); - - AnimationRenderComponent animator = - new AnimationRenderComponent( - ServiceLocator.getResourceService().getAsset("images/mobs/skeleton.atlas", TextureAtlas.class)); - animator.addAnimation("skeleton_walk", 0.1f, Animation.PlayMode.LOOP); - animator.addAnimation("skeleton_attack", 0.1f); - animator.addAnimation("skeleton_death", 0.1f); - animator.addAnimation(DEFAULT, 0.1f); - - AITaskComponent aiTaskComponent = new AITaskComponent() - .addTask(new MobTask(MobType.SKELETON)); - - skeleton - .addComponent(new CombatStatsComponent(health, 0, drops)) - .addComponent(animator) - .addComponent(new SkeletonAnimationController()) - .addComponent(aiTaskComponent); - - skeleton.getComponent(HitboxComponent.class).setAsBoxAligned(new Vector2(.3f, .5f), PhysicsComponent.AlignX.RIGHT, PhysicsComponent.AlignY.CENTER); - skeleton.getComponent(AnimationRenderComponent.class).scaleEntity(); - - return skeleton; - } - - /** - * Creates a wizard entity. - * - * @return entity - */ - public static Entity createWizard(int health) { - Entity wizard = createBaseNPC(); - ArrayList drops = new ArrayList<>(); - - AnimationRenderComponent animator = - new AnimationRenderComponent( - ServiceLocator.getResourceService().getAsset("images/mobs/wizard.atlas", TextureAtlas.class)); - animator.addAnimation("wizard_run", 0.1f, Animation.PlayMode.LOOP); - animator.addAnimation("wizard_attack", 0.1f); - animator.addAnimation("wizard_death", 0.1f); - animator.addAnimation(DEFAULT, 0.1f); - AITaskComponent aiTaskComponent = new AITaskComponent() - .addTask(new MobTask(MobType.WIZARD)); - - wizard - .addComponent(new CombatStatsComponent(health, 0, drops)) - .addComponent(animator) - .addComponent(new WizardAnimationController()) - .addComponent(aiTaskComponent); - - wizard.getComponent(HitboxComponent.class).setAsBoxAligned(new Vector2(.3f, .5f), PhysicsComponent.AlignX.RIGHT, PhysicsComponent.AlignY.CENTER); - wizard.getComponent(AnimationRenderComponent.class).scaleEntity(); - - return wizard; - } - /** - * Creates a water queen entity. - * - * @return entity - */ - public static Entity createWaterQueen(int health) { - Entity waterQueen = createBaseNPC(); - ArrayList drops = new ArrayList<>(); - - AnimationRenderComponent animator = - new AnimationRenderComponent( - ServiceLocator.getResourceService().getAsset("images/mobs/water_queen.atlas", TextureAtlas.class)); - animator.addAnimation("water_queen_walk", 0.1f, Animation.PlayMode.LOOP); - animator.addAnimation("water_queen_attack", 0.1f); - animator.addAnimation("water_queen_death", 0.1f); - animator.addAnimation(DEFAULT, 0.1f); - - AITaskComponent aiTaskComponent = new AITaskComponent() - .addTask(new MobTask(MobType.WATER_QUEEN)); - - waterQueen - .addComponent(new CombatStatsComponent(health, 0, drops)) - .addComponent(animator) - .addComponent(new WaterQueenAnimationController()) - .addComponent(aiTaskComponent); - - waterQueen.getComponent(HitboxComponent.class).setAsBoxAligned(new Vector2(.3f, .5f), PhysicsComponent.AlignX.RIGHT, PhysicsComponent.AlignY.CENTER); - waterQueen.getComponent(AnimationRenderComponent.class).scaleEntity(); - - return waterQueen; - } - /** - * Creates a water slime entity. - * - * @return entity - */ - public static Entity createBaseWaterSlime(int health) { - Entity waterSlime = createBaseNPC(); - ArrayList drops = new ArrayList<>(); - - AnimationRenderComponent animator = - new AnimationRenderComponent( - ServiceLocator.getResourceService().getAsset("images/mobs/water_slime.atlas", TextureAtlas.class)); - animator.addAnimation("water_slime_walk", 0.1f, Animation.PlayMode.LOOP); - animator.addAnimation("water_slime_attack", 0.1f); - animator.addAnimation("water_slime_death", 0.2f); - animator.addAnimation(DEFAULT, 0.1f); - - AITaskComponent aiTaskComponent = new AITaskComponent() - .addTask(new MobTask(MobType.WATER_SLIME)); - - waterSlime - .addComponent(new CombatStatsComponent(health, 0, drops)) - .addComponent(animator) - .addComponent(new WaterSlimeAnimationController()) - .addComponent(aiTaskComponent); - - waterSlime.getComponent(HitboxComponent.class).setAsBoxAligned(new Vector2(.3f, .5f), PhysicsComponent.AlignX.RIGHT, PhysicsComponent.AlignY.CENTER); - waterSlime.getComponent(AnimationRenderComponent.class).scaleEntity(); - - return waterSlime; - } - /** - * Creates a fire worm entity. - * - * @return entity - */ - public static Entity createFireWorm(int health) { - Entity fireWorm = createBaseNPC(); - ArrayList drops = new ArrayList<>(); - - AnimationRenderComponent animator = - new AnimationRenderComponent( - ServiceLocator.getResourceService().getAsset("images/mobs/fire_worm.atlas", TextureAtlas.class)); - animator.addAnimation("fire_worm_walk", 0.1f, Animation.PlayMode.LOOP); - animator.addAnimation("fire_worm_attack", 0.1f); - animator.addAnimation("fire_worm_death", 0.1f); - animator.addAnimation(DEFAULT, 0.1f); - - AITaskComponent aiTaskComponent = new AITaskComponent() - .addTask(new MobTask(MobType.FIRE_WORM)); - - fireWorm - .addComponent(new CombatStatsComponent(health, 0, drops)) - .addComponent(animator) - .addComponent(new FireWormAnimationController()) - .addComponent(aiTaskComponent); - - fireWorm.getComponent(HitboxComponent.class).setAsBoxAligned(new Vector2(.3f, .5f), PhysicsComponent.AlignX.RIGHT, PhysicsComponent.AlignY.CENTER); - fireWorm.getComponent(AnimationRenderComponent.class).scaleEntity(); - - return fireWorm; - } - /** - * Creates a dragon Knight entity - * - * @return entity - */ - public static Entity createDragonKnight(int health) { - Entity dragonKnight = createBaseNPC(); - ArrayList drops = new ArrayList<>(); - - AnimationRenderComponent animator = - new AnimationRenderComponent( - ServiceLocator.getResourceService().getAsset("images/mobs/dragon_knight.atlas", TextureAtlas.class)); - animator.addAnimation("dragon_knight_run", 0.1f, Animation.PlayMode.LOOP); - animator.addAnimation("dragon_knight_attack", 0.1f); - animator.addAnimation("dragon_knight_death", 0.1f); - animator.addAnimation(DEFAULT, 0.1f); - - AITaskComponent aiTaskComponent = new AITaskComponent() - .addTask(new MobTask(MobType.DRAGON_KNIGHT)); - - dragonKnight - .addComponent(new CombatStatsComponent(health, 0, drops)) - .addComponent(animator) - .addComponent(new DragonKnightAnimationController()) - .addComponent(aiTaskComponent); - - dragonKnight.getComponent(HitboxComponent.class).setAsBoxAligned(new Vector2(.3f, .5f), PhysicsComponent.AlignX.RIGHT, PhysicsComponent.AlignY.BOTTOM); - dragonKnight.getComponent(AnimationRenderComponent.class).scaleEntity(); - - return dragonKnight; - } - - public static Entity createCoat(int health) { - Entity coat = createBaseNPC(); - ArrayList drops = new ArrayList<>(); - - AnimationRenderComponent animator = - new AnimationRenderComponent( - ServiceLocator.getResourceService().getAsset("images/mobs/coat.atlas", TextureAtlas.class)); - animator.addAnimation("coat_run", 0.1f, Animation.PlayMode.LOOP); - animator.addAnimation("coat_attack", 0.1f); - animator.addAnimation("coat_death", 0.1f); - animator.addAnimation(DEFAULT, 0.1f); - - AITaskComponent aiTaskComponent = new AITaskComponent() - .addTask(new MobTask(MobType.COAT)); - - coat - .addComponent(new CombatStatsComponent(health, 0, drops)) - .addComponent(animator) - .addComponent(new CoatAnimationController()) - .addComponent(aiTaskComponent); - - coat.getComponent(HitboxComponent.class).setAsBoxAligned(new Vector2(.3f, .5f), PhysicsComponent.AlignX.RIGHT, PhysicsComponent.AlignY.BOTTOM); - coat.getComponent(AnimationRenderComponent.class).scaleEntity(); - - return coat; - } - - public static Entity createNightBorne(int health) { - Entity coat = createBaseNPC(); - ArrayList drops = new ArrayList<>(); - - AnimationRenderComponent animator = - new AnimationRenderComponent( - ServiceLocator.getResourceService().getAsset("images/mobs/night_borne.atlas", TextureAtlas.class)); - animator.addAnimation("night_borne_run", 0.1f, Animation.PlayMode.LOOP); - animator.addAnimation("night_borne_attack", 0.1f); - animator.addAnimation("night_borne_death", 0.1f); - animator.addAnimation(DEFAULT, 0.1f); - - AITaskComponent aiTaskComponent = new AITaskComponent() - .addTask(new MobTask(MobType.NIGHT_BORNE)); - - coat - .addComponent(new CombatStatsComponent(health, 0, drops)) - .addComponent(animator) - .addComponent(new NightBorneAnimationController()) - .addComponent(aiTaskComponent); - - coat.getComponent(HitboxComponent.class).setAsBoxAligned(new Vector2(.3f, .5f), PhysicsComponent.AlignX.RIGHT, PhysicsComponent.AlignY.BOTTOM); - coat.getComponent(AnimationRenderComponent.class).scaleEntity(); - - return coat; - } - - public static Entity createRocky(int health) { - Entity coat = createBaseNPC(); - ArrayList drops = new ArrayList<>(); - - AnimationRenderComponent animator = - new AnimationRenderComponent( - ServiceLocator.getResourceService().getAsset("images/mobs/rocky.atlas", TextureAtlas.class)); - animator.addAnimation("rocky_move", 0.1f, Animation.PlayMode.LOOP); - animator.addAnimation("rocky_attack", 0.1f); - animator.addAnimation("night_borne_death", 0.1f); - animator.addAnimation(DEFAULT, 0.1f); - - AITaskComponent aiTaskComponent = new AITaskComponent() - .addTask(new MobTask(MobType.NIGHT_BORNE)); - - coat - .addComponent(new CombatStatsComponent(health, 0, drops)) - .addComponent(animator) - .addComponent(new RockyAnimationController()) - .addComponent(aiTaskComponent); - - coat.getComponent(HitboxComponent.class).setAsBoxAligned(new Vector2(.3f, .5f), PhysicsComponent.AlignX.RIGHT, PhysicsComponent.AlignY.BOTTOM); - coat.getComponent(AnimationRenderComponent.class).scaleEntity(); - - return coat; - } - - public static Entity createNecromancer(int health) { - Entity coat = createBaseNPC(); - ArrayList drops = new ArrayList<>(); - - AnimationRenderComponent animator = - new AnimationRenderComponent( - ServiceLocator.getResourceService().getAsset("images/mobs/necromancer.atlas", TextureAtlas.class)); - animator.addAnimation("necromancer_walk", 0.1f, Animation.PlayMode.LOOP); - animator.addAnimation("necromancer_attack", 0.1f); - animator.addAnimation("necromancer_death", 0.1f); - animator.addAnimation(DEFAULT, 0.1f); - - AITaskComponent aiTaskComponent = new AITaskComponent() - .addTask(new MobTask(MobType.NECROMANCER)); - - coat - .addComponent(new CombatStatsComponent(health, 0, drops)) - .addComponent(animator) - .addComponent(new NecromancerAnimationController()) - .addComponent(aiTaskComponent); - - coat.getComponent(HitboxComponent.class).setAsBoxAligned(new Vector2(.3f, .5f), PhysicsComponent.AlignX.RIGHT, PhysicsComponent.AlignY.BOTTOM); - coat.getComponent(AnimationRenderComponent.class).scaleEntity(); - - return coat; - } - - public static Entity createFirewizard(int health) { - Entity fireWizard = createBaseNPC(); - ArrayList drops = new ArrayList<>(); - - AnimationRenderComponent animator = - new AnimationRenderComponent( - ServiceLocator.getResourceService().getAsset("images/mobs/firewizard.atlas", TextureAtlas.class)); - animator.addAnimation("firewizard_move", 0.1f, Animation.PlayMode.LOOP); - animator.addAnimation("firewizard_attack", 0.1f); - animator.addAnimation("firewizard_death", 0.1f); - animator.addAnimation(DEFAULT, 0.1f); - - AITaskComponent aiTaskComponent = new AITaskComponent() - .addTask(new MobTask(MobType.FIREWIZARD)); - - fireWizard - .addComponent(new CombatStatsComponent(health, 0, drops)) - .addComponent(animator) - .addComponent(new FirewizardAnimationController()) - .addComponent(aiTaskComponent); - - fireWizard.getComponent(HitboxComponent.class).setAsBoxAligned(new Vector2(.3f, .5f), PhysicsComponent.AlignX.RIGHT, PhysicsComponent.AlignY.BOTTOM); - fireWizard.getComponent(AnimationRenderComponent.class).scaleEntity(); - - return fireWizard; - } - - public static Entity createArcaneArcher(int health) { - Entity coat = createBaseNPC(); - ArrayList drops = new ArrayList<>(); - - AnimationRenderComponent animator = - new AnimationRenderComponent( - ServiceLocator.getResourceService().getAsset("images/mobs/arcane_archer.atlas", TextureAtlas.class)); - animator.addAnimation("arcane_archer_run", 0.1f, Animation.PlayMode.LOOP); - animator.addAnimation("arcane_archer_attack", 0.1f); - animator.addAnimation("arcane_archer_death", 0.1f); - animator.addAnimation("arcane_archer_dodge", 0.1f); - animator.addAnimation(DEFAULT, 0.1f); - - AITaskComponent aiTaskComponent = new AITaskComponent() - .addTask(new MobTask(MobType.ARCANE_ARCHER)); - - coat - .addComponent(new CombatStatsComponent(health, 0, drops)) - .addComponent(animator) - .addComponent(new ArcaneArcherAnimationController()) - .addComponent(aiTaskComponent); - - coat.getComponent(HitboxComponent.class).setAsBoxAligned(new Vector2(.3f, .5f), PhysicsComponent.AlignX.RIGHT, PhysicsComponent.AlignY.BOTTOM); - coat.getComponent(AnimationRenderComponent.class).scaleEntity(); - - return coat; - } - - public static Entity createGregRangeMob(int health) { - Entity fireWorm = createBaseNPC(); - ArrayList drops = new ArrayList<>(); - - AnimationRenderComponent animator = - new AnimationRenderComponent( - ServiceLocator.getResourceService().getAsset("images/mobs/fire_worm.atlas", TextureAtlas.class)); - animator.addAnimation("fire_worm_walk", 0.1f, Animation.PlayMode.LOOP); - animator.addAnimation("fire_worm_attack", 0.1f); - animator.addAnimation("fire_worm_death", 0.1f); - animator.addAnimation(DEFAULT, 0.1f); - - AITaskComponent aiTaskComponent = new AITaskComponent() - .addTask(new MobTask(MobType.FIRE_WORM)); - - fireWorm - .addComponent(new CombatStatsComponent(health, 0, drops)) - .addComponent(animator) - .addComponent(new FireWormAnimationController()) - .addComponent(aiTaskComponent); - - fireWorm.getComponent(HitboxComponent.class).setAsBoxAligned(new Vector2(.3f, .5f), PhysicsComponent.AlignX.RIGHT, PhysicsComponent.AlignY.CENTER); - fireWorm.getComponent(AnimationRenderComponent.class).scaleEntity(); - - return fireWorm; - } - - - /** - * Creates a xeno grunt entity. - * - * @return entity - */ - public static Entity createXenoGrunt(int health) { - Entity xenoGrunt = createMeleeBaseNPC(); - BaseEnemyConfig config = configs.xenoGrunt; - ArrayList melee = new ArrayList<>(Arrays.asList(PredefinedWeapons.SWORD, PredefinedWeapons.KICK)); - // tester projectiles - ArrayList projectiles = new ArrayList<>(Arrays.asList(PredefinedWeapons.FIREBALL, PredefinedWeapons.FROSTBALL)); - ArrayList drops = new ArrayList<>(); - - AnimationRenderComponent animator = - new AnimationRenderComponent( - ServiceLocator.getResourceService().getAsset("images/mobs/xenoGrunt.atlas", TextureAtlas.class)); - animator.addAnimation("xeno_run", 0.1f, Animation.PlayMode.LOOP); - animator.addAnimation("xeno_hurt", 0.1f, Animation.PlayMode.LOOP); - animator.addAnimation("xeno_shoot", 0.1f); - animator.addAnimation("xeno_melee_1", 0.1f); - animator.addAnimation("xeno_melee_2", 0.1f); - animator.addAnimation("xeno_die", 0.1f); - animator.addAnimation(DEFAULT, 0.1f); - xenoGrunt - .addComponent(new CombatStatsComponent(health, config.baseAttack, drops, melee, projectiles)) - .addComponent(animator) - .addComponent(new XenoAnimationController()); - - xenoGrunt.getComponent(HitboxComponent.class).setAsBoxAligned(new Vector2(.3f, .5f), PhysicsComponent.AlignX.RIGHT, PhysicsComponent.AlignY.BOTTOM); - xenoGrunt.getComponent(AnimationRenderComponent.class).scaleEntity(); - - return xenoGrunt; - } - - public static Entity createBaseNPC() { - Entity npc = - new Entity() - .addComponent(new PhysicsComponent()) - .addComponent(new PhysicsMovementComponent()) - .addComponent(new ColliderComponent()) - .addComponent(new EffectComponent(true)) - .addComponent(new HitboxComponent().setLayer(PhysicsLayer.NPC)) - .addComponent(new TouchAttackComponent(PhysicsLayer.HUMANS)); - PhysicsUtils.setScaledCollider(npc, 0.3f, 0.5f); - return npc; - } - - /** - * Creates a generic NPC to be used as a base entity by more specific NPC creation methods. - * - * @return entity - */ - public static Entity createMeleeBaseNPC() { - AITaskComponent aiComponent = - new AITaskComponent() - .addTask(new MobWanderTask(2f)) - .addTask(new MobMeleeAttackTask(2)); - - Entity npc = - new Entity() - .addComponent(new PhysicsComponent()) - .addComponent(new PhysicsMovementComponent()) - .addComponent(new ColliderComponent()) - .addComponent(new HitboxComponent().setLayer(PhysicsLayer.XENO)) - .addComponent(new TouchAttackComponent(PhysicsLayer.HUMANS)) - .addComponent(aiComponent); - PhysicsUtils.setScaledCollider(npc, 0.3f, 0.5f); - return npc; - } - /** - * Creates a generic NPC to be used as a base entity by more specific NPC creation methods. - * - * @return entity - */ - public static Entity createRangedBaseNPC() { - AITaskComponent aiComponent = - new AITaskComponent() - .addTask(new MobWanderTask(2f)) - .addTask(new MobRangedAttackTask(2)); - - Entity npc = - new Entity() - .addComponent(new PhysicsComponent()) - .addComponent(new PhysicsMovementComponent()) - .addComponent(new ColliderComponent()) - .addComponent(new HitboxComponent().setLayer(PhysicsLayer.XENO)) - .addComponent(new TouchAttackComponent(PhysicsLayer.HUMANS)) - .addComponent(aiComponent); - PhysicsUtils.setScaledCollider(npc, 0.3f, 0.5f); - return npc; - } - - private NPCFactory() { - throw new IllegalStateException("Instantiating static util class"); - } - - // * COW'S TESTING ARENA DONT TOUCH - public static Entity createSplittingXenoGrunt(int health) { - Entity splitXenoGrunt = createXenoGrunt(health) - // add the scaling yourself. can also scale the X and Y component, - // leading to some very interesting mob designs. - .addComponent(new SplitMoblings(MobType.WATER_SLIME, 7, 0.5f)) - .addComponent(new DodgingComponent(PhysicsLayer.PROJECTILE, 0.25f)); - - // * TEMPORARY TESTING FOR PROJECTILE DODGING - splitXenoGrunt.getComponent(AITaskComponent.class).addTask(new MobDodgeTask(MobType.DRAGON_KNIGHT, 5)); - // splitXenoGrunt.getComponent(AITaskComponent.class).addTask(new MobDodgeTask(new Vector2(2f, 2f), 2f, 5)); - return splitXenoGrunt; - } - - /** - * Create Splitting water slime - * - * @require - Entity to have a "splitDeath" - * @return Splitting water slime - */ - public static Entity createSplittingWaterSlime(int health) { - return createBaseWaterSlime(health).addComponent(new SplitMoblings(MobType.WATER_SLIME, 7, 0.5f)); - } - - /** - * Create Splitting water slime - * - * @require Entity to have a "splitDeath" - * @return Splitting Rocky - */ - public static Entity createSplittingRocky(int health) { - return createRocky(health).addComponent(new SplitMoblings(MobType.ROCKY, 7, 0.5f)); - } - - /** - * Create Splitting night borne - * - * @require Entity to have a "splitDeath" - * @return Splitting Night Borne - */ - public static Entity createSplittingNightBorne(int health) { - return createNightBorne(health).addComponent(new SplitMoblings(MobType.NIGHT_BORNE, 7, 0.5f)); - } - - /** - * Create a dodging Dragon Knight - * - * @return Dodging dragon knight - */ - public static Entity createDodgingDragonKnight(int health) { - Entity dodgeKnight = createDragonKnight(health); - - dodgeKnight.addComponent(new DodgingComponent(PhysicsLayer.PROJECTILE, 0.25f)); - dodgeKnight.getComponent(AITaskComponent.class).getTask(MobTask.class).setDodge(true); - PhysicsUtils.setScaledCollider(dodgeKnight, 0.3f, 0.7f); - dodgeKnight.setScale(0.3f, 0.7f); - - return dodgeKnight; - } - - /** - * Create a dodging Arcane Archer - * - * @return Dodging arcane - */ - public static Entity createDodgingArcaneArcher(int health) { - Entity dodgeKnight = createArcaneArcher(health); - - dodgeKnight.addComponent(new DodgingComponent(PhysicsLayer.PROJECTILE, 0.25f)); - dodgeKnight.getComponent(AITaskComponent.class).getTask(MobTask.class).setDodge(true); - PhysicsUtils.setScaledCollider(dodgeKnight, 0.3f, 0.7f); - dodgeKnight.setScale(0.3f, 0.7f); - - return dodgeKnight; - } - - /** - * Creates a wizard that can deflect bullets - * @return Deflecting wizard - */ - public static Entity createDeflectWizard(int health) { - return createWizard(health).addComponent(new DeflectingComponent( - PhysicsLayer.PROJECTILE, PhysicsLayer.TOWER, 10)); - } - - /** - * Creates a wizard that can deflect bullets - * @return Deflecting firewizard - */ - public static Entity createDeflectFireWizard(int health) { - return createFirewizard(health).addComponent(new DeflectingComponent( - PhysicsLayer.PROJECTILE, PhysicsLayer.TOWER, 10)); - } -} - - +package com.csse3200.game.entities.factories; + +import com.badlogic.gdx.graphics.g2d.Animation; +import com.badlogic.gdx.graphics.g2d.TextureAtlas; +import com.badlogic.gdx.math.Vector2; +import com.csse3200.game.ai.tasks.AITaskComponent; +import com.csse3200.game.components.CombatStatsComponent; +import com.csse3200.game.components.TouchAttackComponent; +import com.csse3200.game.components.npc.*; +import com.csse3200.game.components.tasks.MobDodgeTask; +import com.csse3200.game.components.tasks.MobMeleeAttackTask; +import com.csse3200.game.components.tasks.MobRangedAttackTask; +import com.csse3200.game.components.tasks.MobTask.MobTask; +import com.csse3200.game.components.tasks.MobTask.MobType; +import com.csse3200.game.components.tasks.MobWanderTask; +import com.csse3200.game.entities.Entity; +import com.csse3200.game.entities.Melee; +import com.csse3200.game.entities.PredefinedWeapons; +import com.csse3200.game.entities.configs.*; +import com.csse3200.game.files.FileLoader; +import com.csse3200.game.physics.PhysicsLayer; +import com.csse3200.game.physics.PhysicsUtils; +import com.csse3200.game.physics.components.ColliderComponent; +import com.csse3200.game.physics.components.HitboxComponent; +import com.csse3200.game.physics.components.PhysicsComponent; +import com.csse3200.game.physics.components.PhysicsMovementComponent; +import com.csse3200.game.rendering.AnimationRenderComponent; +import com.csse3200.game.rendering.TextureRenderComponent; +import com.csse3200.game.services.ServiceLocator; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Currency; + +/** + * Factory to create non-playable character (NPC) entities with predefined components. + * + *

Each NPC entity type should have a creation method that returns a corresponding entity. + * Predefined entity properties can be loaded from configs stored as json files which are defined in + * "NPCConfigs". + * + *

If needed, this factory can be separated into more specific factories for entities with + * similar characteristics. + */ +public class NPCFactory { + private static final String DEFAULT = "default"; + private static final NPCConfigs configs = + FileLoader.readClass(NPCConfigs.class, "configs/NPCs.json"); + + /** + * Creates a ghost entity. + * + * @return entity + */ + public static Entity createGhost() { + Entity ghost = createMeleeBaseNPC(); + BaseEntityConfig config = configs.ghost; + /** + AnimationRenderComponent animator = + new AnimationRenderComponent( + ServiceLocator.getResourceService().getAsset("images/ghost.atlas", TextureAtlas.class)); + animator.addAnimation("angry_float", 0.1f, Animation.PlayMode.LOOP); + animator.addAnimation("float", 0.1f, Animation.PlayMode.LOOP); + **/ + ghost + .addComponent(new CombatStatsComponent(config.health, config.baseAttack)) + // .addComponent(animator) + .addComponent(new TextureRenderComponent("images/mobs/satyr.png")); + // .addComponent(new GhostAnimationController()); + + ghost.getComponent(TextureRenderComponent.class).scaleEntity(); + + return ghost; + } + + /** + * Creates a ghost king entity. + * + * @return entity + */ + public static Entity createGhostKing() { + Entity ghostKing = createMeleeBaseNPC(); + GhostKingConfig config = configs.ghostKing; + + AnimationRenderComponent animator = + new AnimationRenderComponent( + ServiceLocator.getResourceService() + .getAsset("images/ghostKing.atlas", TextureAtlas.class)); + animator.addAnimation("float", 0.2f, Animation.PlayMode.LOOP); + animator.addAnimation("angry_float", 0.2f, Animation.PlayMode.LOOP); + + ghostKing + .addComponent(new CombatStatsComponent(config.health, config.baseAttack)) + .addComponent(animator) + .addComponent(new GhostAnimationController()); + + ghostKing.getComponent(AnimationRenderComponent.class).scaleEntity(); + return ghostKing; + } + + /** + * Creates a fire worm entity. + * + * @return entity + */ +// public static Entity createSkeleton(int health) { +// Entity skeleton = createBaseNPC(int health); + public static Entity createSkeleton(int health) { + Entity skeleton = createBaseNPC(); + ArrayList drops = new ArrayList<>(); + + AnimationRenderComponent animator = + new AnimationRenderComponent( + ServiceLocator.getResourceService().getAsset("images/mobs/skeleton.atlas", TextureAtlas.class)); + animator.addAnimation("skeleton_walk", 0.1f, Animation.PlayMode.LOOP); + animator.addAnimation("skeleton_attack", 0.1f); + animator.addAnimation("skeleton_death", 0.1f); + animator.addAnimation("skeleton_freeze", 0.1f); + animator.addAnimation("default", 0.1f); + + AITaskComponent aiTaskComponent = new AITaskComponent() + .addTask(new MobTask(MobType.SKELETON)); + + skeleton + .addComponent(new CombatStatsComponent(health, 0, drops)) + .addComponent(animator) + .addComponent(new SkeletonAnimationController()) + .addComponent(aiTaskComponent); + + skeleton.getComponent(HitboxComponent.class).setAsBoxAligned(new Vector2(.3f, .5f), PhysicsComponent.AlignX.RIGHT, PhysicsComponent.AlignY.CENTER); + skeleton.getComponent(AnimationRenderComponent.class).scaleEntity(); + + return skeleton; + } + + /** + * Creates a wizard entity. + * + * @return entity + */ + public static Entity createWizard(int health) { + Entity wizard = createBaseNPC(); + ArrayList drops = new ArrayList<>(); + + AnimationRenderComponent animator = + new AnimationRenderComponent( + ServiceLocator.getResourceService().getAsset("images/mobs/wizard.atlas", TextureAtlas.class)); + animator.addAnimation("wizard_run", 0.1f, Animation.PlayMode.LOOP); + animator.addAnimation("wizard_attack", 0.1f); + animator.addAnimation("wizard_death", 0.1f); + animator.addAnimation("wizard_freeze", 0.1f); + animator.addAnimation("default", 0.1f); + AITaskComponent aiTaskComponent = new AITaskComponent() + .addTask(new MobTask(MobType.WIZARD)); + + wizard + .addComponent(new CombatStatsComponent(health, 0, drops)) + .addComponent(animator) + .addComponent(new WizardAnimationController()) + .addComponent(aiTaskComponent); + + wizard.getComponent(HitboxComponent.class).setAsBoxAligned(new Vector2(.3f, .5f), PhysicsComponent.AlignX.RIGHT, PhysicsComponent.AlignY.CENTER); + wizard.getComponent(AnimationRenderComponent.class).scaleEntity(); + + return wizard; + } + /** + * Creates a water queen entity. + * + * @return entity + */ + public static Entity createWaterQueen(int health) { + Entity waterQueen = createBaseNPC(); + ArrayList drops = new ArrayList<>(); + + AnimationRenderComponent animator = + new AnimationRenderComponent( + ServiceLocator.getResourceService().getAsset("images/mobs/water_queen.atlas", TextureAtlas.class)); + animator.addAnimation("water_queen_walk", 0.1f, Animation.PlayMode.LOOP); + animator.addAnimation("water_queen_attack", 0.1f); + animator.addAnimation("water_queen_death", 0.1f); + animator.addAnimation("water_queen_freeze", 0.1f); + animator.addAnimation("default", 0.1f); + + AITaskComponent aiTaskComponent = new AITaskComponent() + .addTask(new MobTask(MobType.WATER_QUEEN)); + + waterQueen + .addComponent(new CombatStatsComponent(health, 0, drops)) + .addComponent(animator) + .addComponent(new WaterQueenAnimationController()) + .addComponent(aiTaskComponent); + + waterQueen.getComponent(HitboxComponent.class).setAsBoxAligned(new Vector2(.3f, .5f), PhysicsComponent.AlignX.RIGHT, PhysicsComponent.AlignY.CENTER); + waterQueen.getComponent(AnimationRenderComponent.class).scaleEntity(); + + return waterQueen; + } + /** + * Creates a water slime entity. + * + * @return entity + */ + public static Entity createBaseWaterSlime(int health) { + Entity waterSlime = createBaseNPC(); + ArrayList drops = new ArrayList<>(); + + AnimationRenderComponent animator = + new AnimationRenderComponent( + ServiceLocator.getResourceService().getAsset("images/mobs/water_slime.atlas", TextureAtlas.class)); + animator.addAnimation("water_slime_walk", 0.1f, Animation.PlayMode.LOOP); + animator.addAnimation("water_slime_attack", 0.1f); + animator.addAnimation("water_slime_death", 0.2f); + animator.addAnimation("water_slime_freeze", 0.2f); + animator.addAnimation("default", 0.1f); + + AITaskComponent aiTaskComponent = new AITaskComponent() + .addTask(new MobTask(MobType.WATER_SLIME)); + + waterSlime + .addComponent(new CombatStatsComponent(health, 0, drops)) + .addComponent(animator) + .addComponent(new WaterSlimeAnimationController()) + .addComponent(aiTaskComponent); + + waterSlime.getComponent(HitboxComponent.class).setAsBoxAligned(new Vector2(.3f, .5f), PhysicsComponent.AlignX.RIGHT, PhysicsComponent.AlignY.CENTER); + waterSlime.getComponent(AnimationRenderComponent.class).scaleEntity(); + + return waterSlime; + } + /** + * Creates a fire worm entity. + * + * @return entity + */ + public static Entity createFireWorm(int health) { + Entity fireWorm = createBaseNPC(); + ArrayList drops = new ArrayList<>(); + + AnimationRenderComponent animator = + new AnimationRenderComponent( + ServiceLocator.getResourceService().getAsset("images/mobs/fire_worm.atlas", TextureAtlas.class)); + animator.addAnimation("fire_worm_walk", 0.1f, Animation.PlayMode.LOOP); + animator.addAnimation("fire_worm_attack", 0.1f); + animator.addAnimation("fire_worm_death", 0.1f); + animator.addAnimation("fire_worm_freeze", 0.1f); + animator.addAnimation("default", 0.1f); + + AITaskComponent aiTaskComponent = new AITaskComponent() + .addTask(new MobTask(MobType.FIRE_WORM)); + + fireWorm + .addComponent(new CombatStatsComponent(health, 0, drops)) + .addComponent(animator) + .addComponent(new FireWormAnimationController()) + .addComponent(aiTaskComponent); + + fireWorm.getComponent(HitboxComponent.class).setAsBoxAligned(new Vector2(.3f, .5f), PhysicsComponent.AlignX.RIGHT, PhysicsComponent.AlignY.CENTER); + fireWorm.getComponent(AnimationRenderComponent.class).scaleEntity(); + + return fireWorm; + } + /** + * Creates a dragon Knight entity + * + * @return entity + */ + public static Entity createDragonKnight(int health) { + Entity dragonKnight = createBaseNPC(); + ArrayList drops = new ArrayList<>(); + + AnimationRenderComponent animator = + new AnimationRenderComponent( + ServiceLocator.getResourceService().getAsset("images/mobs/dragon_knight.atlas", TextureAtlas.class)); + animator.addAnimation("dragon_knight_run", 0.1f, Animation.PlayMode.LOOP); + animator.addAnimation("dragon_knight_attack", 0.1f); + animator.addAnimation("dragon_knight_death", 0.1f); + animator.addAnimation("dragon_knight_freeze", 0.1f); + animator.addAnimation("default", 0.1f); + + AITaskComponent aiTaskComponent = new AITaskComponent() + .addTask(new MobTask(MobType.DRAGON_KNIGHT)); + + dragonKnight + .addComponent(new CombatStatsComponent(health, 0, drops)) + .addComponent(animator) + .addComponent(new DragonKnightAnimationController()) + .addComponent(aiTaskComponent); + + dragonKnight.getComponent(HitboxComponent.class).setAsBoxAligned(new Vector2(.3f, .5f), PhysicsComponent.AlignX.RIGHT, PhysicsComponent.AlignY.BOTTOM); + dragonKnight.getComponent(AnimationRenderComponent.class).scaleEntity(); + + return dragonKnight; + } + + public static Entity createCoat(int health) { + Entity coat = createBaseNPC(); + ArrayList drops = new ArrayList<>(); + + AnimationRenderComponent animator = + new AnimationRenderComponent( + ServiceLocator.getResourceService().getAsset("images/mobs/coat.atlas", TextureAtlas.class)); + animator.addAnimation("coat_run", 0.1f, Animation.PlayMode.LOOP); + animator.addAnimation("coat_attack", 0.1f); + animator.addAnimation("coat_death", 0.1f); + animator.addAnimation("default", 0.1f); + + AITaskComponent aiTaskComponent = new AITaskComponent() + .addTask(new MobTask(MobType.COAT)); + + coat + .addComponent(new CombatStatsComponent(health, 0, drops)) + .addComponent(animator) + .addComponent(new CoatAnimationController()) + .addComponent(aiTaskComponent); + + coat.getComponent(HitboxComponent.class).setAsBoxAligned(new Vector2(.3f, .5f), PhysicsComponent.AlignX.RIGHT, PhysicsComponent.AlignY.BOTTOM); + coat.getComponent(AnimationRenderComponent.class).scaleEntity(); + + return coat; + } + + public static Entity createNightBorne(int health) { + Entity coat = createBaseNPC(); + ArrayList drops = new ArrayList<>(); + + AnimationRenderComponent animator = + new AnimationRenderComponent( + ServiceLocator.getResourceService().getAsset("images/mobs/night_borne.atlas", TextureAtlas.class)); + animator.addAnimation("night_borne_run", 0.1f, Animation.PlayMode.LOOP); + animator.addAnimation("night_borne_attack", 0.1f); + animator.addAnimation("night_borne_death", 0.1f); + animator.addAnimation("default", 0.1f); + + AITaskComponent aiTaskComponent = new AITaskComponent() + .addTask(new MobTask(MobType.NIGHT_BORNE)); + + coat + .addComponent(new CombatStatsComponent(health, 0, drops)) + .addComponent(animator) + .addComponent(new NightBorneAnimationController()) + .addComponent(aiTaskComponent); + + coat.getComponent(HitboxComponent.class).setAsBoxAligned(new Vector2(.3f, .5f), PhysicsComponent.AlignX.RIGHT, PhysicsComponent.AlignY.BOTTOM); + coat.getComponent(AnimationRenderComponent.class).scaleEntity(); + + return coat; + } + + public static Entity createRocky(int health) { + Entity coat = createBaseNPC(); + ArrayList drops = new ArrayList<>(); + + AnimationRenderComponent animator = + new AnimationRenderComponent( + ServiceLocator.getResourceService().getAsset("images/mobs/rocky.atlas", TextureAtlas.class)); + animator.addAnimation("rocky_move", 0.1f, Animation.PlayMode.LOOP); + animator.addAnimation("rocky_attack", 0.1f); + animator.addAnimation("night_borne_death", 0.1f); + animator.addAnimation(DEFAULT, 0.1f); + + AITaskComponent aiTaskComponent = new AITaskComponent() + .addTask(new MobTask(MobType.NIGHT_BORNE)); + + coat + .addComponent(new CombatStatsComponent(health, 0, drops)) + .addComponent(animator) + .addComponent(new RockyAnimationController()) + .addComponent(aiTaskComponent); + + coat.getComponent(HitboxComponent.class).setAsBoxAligned(new Vector2(.3f, .5f), PhysicsComponent.AlignX.RIGHT, PhysicsComponent.AlignY.BOTTOM); + coat.getComponent(AnimationRenderComponent.class).scaleEntity(); + + return coat; + } + + public static Entity createNecromancer(int health) { + Entity coat = createBaseNPC(); + ArrayList drops = new ArrayList<>(); + + AnimationRenderComponent animator = + new AnimationRenderComponent( + ServiceLocator.getResourceService().getAsset("images/mobs/necromancer.atlas", TextureAtlas.class)); + animator.addAnimation("necromancer_walk", 0.1f, Animation.PlayMode.LOOP); + animator.addAnimation("necromancer_attack", 0.1f); + animator.addAnimation("necromancer_death", 0.1f); + animator.addAnimation(DEFAULT, 0.1f); + + AITaskComponent aiTaskComponent = new AITaskComponent() + .addTask(new MobTask(MobType.NECROMANCER)); + + coat + .addComponent(new CombatStatsComponent(health, 0, drops)) + .addComponent(animator) + .addComponent(new NecromancerAnimationController()) + .addComponent(aiTaskComponent); + + coat.getComponent(HitboxComponent.class).setAsBoxAligned(new Vector2(.3f, .5f), PhysicsComponent.AlignX.RIGHT, PhysicsComponent.AlignY.BOTTOM); + coat.getComponent(AnimationRenderComponent.class).scaleEntity(); + + return coat; + } + + public static Entity createFirewizard(int health) { + Entity fireWizard = createBaseNPC(); + ArrayList drops = new ArrayList<>(); + + AnimationRenderComponent animator = + new AnimationRenderComponent( + ServiceLocator.getResourceService().getAsset("images/mobs/firewizard.atlas", TextureAtlas.class)); + animator.addAnimation("firewizard_move", 0.1f, Animation.PlayMode.LOOP); + animator.addAnimation("firewizard_attack", 0.1f); + animator.addAnimation("firewizard_death", 0.1f); + animator.addAnimation(DEFAULT, 0.1f); + + AITaskComponent aiTaskComponent = new AITaskComponent() + .addTask(new MobTask(MobType.FIREWIZARD)); + + fireWizard + .addComponent(new CombatStatsComponent(health, 0, drops)) + .addComponent(animator) + .addComponent(new FirewizardAnimationController()) + .addComponent(aiTaskComponent); + + fireWizard.getComponent(HitboxComponent.class).setAsBoxAligned(new Vector2(.3f, .5f), PhysicsComponent.AlignX.RIGHT, PhysicsComponent.AlignY.BOTTOM); + fireWizard.getComponent(AnimationRenderComponent.class).scaleEntity(); + + return fireWizard; + } + + public static Entity createArcaneArcher(int health) { + Entity coat = createBaseNPC(); + ArrayList drops = new ArrayList<>(); + + AnimationRenderComponent animator = + new AnimationRenderComponent( + ServiceLocator.getResourceService().getAsset("images/mobs/arcane_archer.atlas", TextureAtlas.class)); + animator.addAnimation("arcane_archer_run", 0.1f, Animation.PlayMode.LOOP); + animator.addAnimation("arcane_archer_attack", 0.1f); + animator.addAnimation("arcane_archer_death", 0.1f); + animator.addAnimation("arcane_archer_dodge", 0.1f); + animator.addAnimation("default", 0.1f); + + AITaskComponent aiTaskComponent = new AITaskComponent() + .addTask(new MobTask(MobType.ARCANE_ARCHER)); + + coat + .addComponent(new CombatStatsComponent(health, 0, drops)) + .addComponent(animator) + .addComponent(new ArcaneArcherAnimationController()) + .addComponent(aiTaskComponent); + + coat.getComponent(HitboxComponent.class).setAsBoxAligned(new Vector2(.3f, .5f), PhysicsComponent.AlignX.RIGHT, PhysicsComponent.AlignY.BOTTOM); + coat.getComponent(AnimationRenderComponent.class).scaleEntity(); + + return coat; + } + + public static Entity createGregRangeMob(int health) { + Entity fireWorm = createBaseNPC(); + ArrayList drops = new ArrayList<>(); + + AnimationRenderComponent animator = + new AnimationRenderComponent( + ServiceLocator.getResourceService().getAsset("images/mobs/fire_worm.atlas", TextureAtlas.class)); + animator.addAnimation("fire_worm_walk", 0.1f, Animation.PlayMode.LOOP); + animator.addAnimation("fire_worm_attack", 0.1f); + animator.addAnimation("fire_worm_death", 0.1f); + animator.addAnimation("default", 0.1f); + + AITaskComponent aiTaskComponent = new AITaskComponent() + .addTask(new MobTask(MobType.FIRE_WORM)); + + fireWorm + .addComponent(new CombatStatsComponent(health, 0, drops)) + .addComponent(animator) + .addComponent(new FireWormAnimationController()) + .addComponent(aiTaskComponent); + + fireWorm.getComponent(HitboxComponent.class).setAsBoxAligned(new Vector2(.3f, .5f), PhysicsComponent.AlignX.RIGHT, PhysicsComponent.AlignY.CENTER); + fireWorm.getComponent(AnimationRenderComponent.class).scaleEntity(); + + return fireWorm; + } + + + /** + * Creates a xeno grunt entity. + * + * @return entity + */ + public static Entity createXenoGrunt(int health) { + Entity xenoGrunt = createMeleeBaseNPC(); + BaseEnemyConfig config = configs.xenoGrunt; + ArrayList melee = new ArrayList<>(Arrays.asList(PredefinedWeapons.sword, PredefinedWeapons.kick)); + // tester projectiles + ArrayList projectiles = new ArrayList<>(Arrays.asList(PredefinedWeapons.fireBall, PredefinedWeapons.frostBall)); + ArrayList drops = new ArrayList<>(); + + AnimationRenderComponent animator = + new AnimationRenderComponent( + ServiceLocator.getResourceService().getAsset("images/mobs/xenoGrunt.atlas", TextureAtlas.class)); + animator.addAnimation("xeno_run", 0.1f, Animation.PlayMode.LOOP); + animator.addAnimation("xeno_hurt", 0.1f, Animation.PlayMode.LOOP); + animator.addAnimation("xeno_shoot", 0.1f); + animator.addAnimation("xeno_melee_1", 0.1f); + animator.addAnimation("xeno_melee_2", 0.1f); + animator.addAnimation("xeno_die", 0.1f); + animator.addAnimation("xeno_freeze", 0.1f); + animator.addAnimation("default", 0.1f); + xenoGrunt + .addComponent(new CombatStatsComponent(health, config.baseAttack, drops, melee, projectiles)) +// .addComponent(new CombatStatsComponent(config.fullHeath, config.baseAttack, drops, melee, projectiles)) + .addComponent(animator) + .addComponent(new XenoAnimationController()); + + xenoGrunt.getComponent(HitboxComponent.class).setAsBoxAligned(new Vector2(.3f, .5f), PhysicsComponent.AlignX.RIGHT, PhysicsComponent.AlignY.BOTTOM); + xenoGrunt.getComponent(AnimationRenderComponent.class).scaleEntity(); + + return xenoGrunt; + } + + public static Entity createBaseNPC() { + Entity npc = + new Entity() + .addComponent(new PhysicsComponent()) + .addComponent(new PhysicsMovementComponent()) + .addComponent(new ColliderComponent()) + .addComponent(new HitboxComponent().setLayer(PhysicsLayer.NPC)) + .addComponent(new TouchAttackComponent(PhysicsLayer.HUMANS)); + PhysicsUtils.setScaledCollider(npc, 0.3f, 0.5f); + return npc; + } + + /** + * Creates a generic NPC to be used as a base entity by more specific NPC creation methods. + * + * @return entity + */ + public static Entity createMeleeBaseNPC() { + AITaskComponent aiComponent = + new AITaskComponent() + .addTask(new MobWanderTask(new Vector2(2f, 2f), 2f)) + .addTask(new MobMeleeAttackTask(2, 2f)); + // .addTask(new MobAttackTask(2, 2f)); + // .addTask(new MeleeMobTask(new Vector2(2f, 2f), 2f)); + + // .addTask(new MobAttackTask(2, 40)); + Entity npc = + new Entity() + .addComponent(new PhysicsComponent()) + .addComponent(new PhysicsMovementComponent()) + .addComponent(new ColliderComponent()) + .addComponent(new HitboxComponent().setLayer(PhysicsLayer.XENO)) + .addComponent(new TouchAttackComponent(PhysicsLayer.HUMANS)) + .addComponent(aiComponent); + PhysicsUtils.setScaledCollider(npc, 0.3f, 0.5f); + return npc; + } + /** + * Creates a generic NPC to be used as a base entity by more specific NPC creation methods. + * + * @return entity + */ + public static Entity createRangedBaseNPC() { + AITaskComponent aiComponent = + new AITaskComponent() + .addTask(new MobWanderTask(new Vector2(2f, 2f), 2f)) + // .addTask(new MobAttackTask(2, 2f)); + .addTask(new MobRangedAttackTask(2, 2f)); + // .addTask(new MeleeMobTask(new Vector2(2f, 2f), 2f)); + + // .addTask(new MobAttackTask(2, 40)); + Entity npc = + new Entity() + .addComponent(new PhysicsComponent()) + .addComponent(new PhysicsMovementComponent()) + .addComponent(new ColliderComponent()) + .addComponent(new HitboxComponent().setLayer(PhysicsLayer.XENO)) + .addComponent(new TouchAttackComponent(PhysicsLayer.HUMANS)) + .addComponent(aiComponent); + PhysicsUtils.setScaledCollider(npc, 0.3f, 0.5f); + return npc; + } + + private NPCFactory() { + throw new IllegalStateException("Instantiating static util class"); + } + + // * COW'S TESTING ARENA DONT TOUCH + public static Entity createSplittingXenoGrunt(int health) { + Entity splitXenoGrunt = createXenoGrunt(health) + // add the scaling yourself. can also scale the X and Y component, + // leading to some very interesting mob designs. + .addComponent(new SplitMoblings(MobType.XENO, 7, 0.5f)) + .addComponent(new DodgingComponent(PhysicsLayer.PROJECTILE, 0.25f)); + + // * TEMPORARY TESTING FOR PROJECTILE DODGING + splitXenoGrunt.getComponent(AITaskComponent.class).addTask(new MobDodgeTask(MobType.DRAGON_KNIGHT, 5)); + // splitXenoGrunt.getComponent(AITaskComponent.class).addTask(new MobDodgeTask(new Vector2(2f, 2f), 2f, 5)); + return splitXenoGrunt; + } + + /** + * Create Splitting water slime + * + * @require Entity to have a "splitDeath" + * @return + */ + public static Entity createSplittingWaterSlime(int health) { + Entity splitWaterSlime = createBaseWaterSlime(health) + + .addComponent(new SplitMoblings(MobType.WATER_SLIME, 7, 0.5f)); + + return splitWaterSlime; + } + + /** + * Create Splitting water slime + * + * @require Entity to have a "splitDeath" + * @return Splitting Rocky + */ + public static Entity createSplittingRocky(int health) { + return createRocky(health).addComponent(new SplitMoblings(MobType.ROCKY, 7, 0.5f)); + } + + /** + * Create Splitting night borne + * + * @require Entity to have a "splitDeath" + * @return + */ + public static Entity createSplittingNightBorne(int health) { + Entity splitWaterSlime = createNightBorne(health) + + .addComponent(new SplitMoblings(MobType.NIGHT_BORNE, 7, 0.5f)); + + return splitWaterSlime; + } + + /** + * Create a dodging Dragon Knight + * + * @return + */ + public static Entity createDodgingDragonKnight(int health) { + Entity dodgeKnight = createDragonKnight(health); + + dodgeKnight.addComponent(new DodgingComponent(PhysicsLayer.PROJECTILE, 0.25f)); + // dodgeKnight.getComponent(AITaskComponent.class).addTask(new MobDodgeTask(new Vector2(2f, 2f), 2f, 5)); + dodgeKnight.getComponent(AITaskComponent.class). + addTask(new MobDodgeTask(MobType.DRAGON_KNIGHT, 5)); + PhysicsUtils.setScaledCollider(dodgeKnight, 0.3f, 0.7f); + dodgeKnight.setScale(0.3f, 0.7f); + + return dodgeKnight; + } + + /** + * Create a dodging Arcane Archer + * + * @return + */ + public static Entity createDodgingArcaneArcher(int health) { + Entity dodgeKnight = createArcaneArcher(health); + + dodgeKnight.addComponent(new DodgingComponent(PhysicsLayer.PROJECTILE, 0.25f)); + // dodgeKnight.getComponent(AITaskComponent.class).addTask(new MobDodgeTask(new Vector2(2f, 2f), 2f, 5)); + dodgeKnight.getComponent(AITaskComponent.class). + addTask(new MobDodgeTask(MobType.DRAGON_KNIGHT, 5)); + PhysicsUtils.setScaledCollider(dodgeKnight, 0.3f, 0.7f); + dodgeKnight.setScale(0.3f, 0.7f); + + return dodgeKnight; + } + +// public static Entity createDeflectXenoGrunt(int health) { +// Entity deflectXenoGrunt = createXenoGrunt(health); +// deflectXenoGrunt.addComponent(new DeflectingComponent( + /** + * Creates a wizard that can deflect bullets + * @return + */ + public static Entity createDeflectWizard(int health) { + Entity deflectWizard = createWizard(health); + deflectWizard.addComponent(new DeflectingComponent( + PhysicsLayer.PROJECTILE, PhysicsLayer.TOWER, 10)); + + return deflectWizard; + } + + /** + * Creates a wizard that can deflect bullets + * @return Deflecting firewizard + */ + public static Entity createDeflectFireWizard(int health) { + return createFirewizard(health).addComponent(new DeflectingComponent( + PhysicsLayer.PROJECTILE, PhysicsLayer.TOWER, 10)); + } +} + + diff --git a/source/core/src/main/com/csse3200/game/entities/factories/ProjectileFactory.java b/source/core/src/main/com/csse3200/game/entities/factories/ProjectileFactory.java index ce160b65b..95c1d7ec8 100644 --- a/source/core/src/main/com/csse3200/game/entities/factories/ProjectileFactory.java +++ b/source/core/src/main/com/csse3200/game/entities/factories/ProjectileFactory.java @@ -1,373 +1,419 @@ -package com.csse3200.game.entities.factories; - -import com.badlogic.gdx.graphics.g2d.Animation; -import com.badlogic.gdx.graphics.g2d.TextureAtlas; -import com.csse3200.game.components.*; -import com.csse3200.game.components.MobProjectileAnimationController; -import com.csse3200.game.components.tasks.TrajectTask; -import com.csse3200.game.ai.tasks.AITaskComponent; -import com.csse3200.game.components.projectile.*; -import com.csse3200.game.entities.configs.BaseEntityConfig; -import com.csse3200.game.entities.configs.NPCConfigs; -import com.csse3200.game.files.FileLoader; -import com.csse3200.game.entities.Entity; -import com.csse3200.game.rendering.AnimationRenderComponent; -import com.csse3200.game.services.ServiceLocator; -import com.csse3200.game.physics.PhysicsLayer; -import com.csse3200.game.physics.PhysicsUtils; -import com.csse3200.game.physics.components.ColliderComponent; -import com.csse3200.game.physics.components.HitboxComponent; -import com.csse3200.game.physics.components.PhysicsComponent; -import com.csse3200.game.physics.components.PhysicsMovementComponent; -import com.badlogic.gdx.math.Vector2; - -/** - * Responsible for creating projectiles within the game. - */ -public class ProjectileFactory { - /** - * Animation constants - */ - private static final String BASE_PROJECTILE_ATLAS = "images/projectiles/basic_projectile.atlas"; - private static final String START_ANIM = "projectile"; - private static final String FINAL_ANIM = "projectileFinal"; - private static final float START_SPEED = 0.1f; - private static final float FINAL_SPEED = 0.1f; - - private static final NPCConfigs configs = - FileLoader.readClass(NPCConfigs.class, "configs/NPCs.json"); - - /** - * Creates a single-targeting projectile with specified effect - * - * @param targetLayer The enemy layer that the projectile collides with. - * @param destination The destination the projectile heads towards. - * @param speed The speed of the projectile. - * @param effect Specified effect from the ProjectileEffects enums - * @return Returns a new single-target projectile entity - */ - public static Entity createEffectProjectile(short targetLayer, Vector2 destination, Vector2 speed, ProjectileEffects effect, boolean aoe) { - Entity projectile = createBaseProjectile(targetLayer, destination, speed); - - switch (effect) { - case FIREBALL -> { - projectile.addComponent(new EffectsComponent(targetLayer, 3, ProjectileEffects.FIREBALL, aoe)); - AnimationRenderComponent animator = - new AnimationRenderComponent( - ServiceLocator.getResourceService() - .getAsset(BASE_PROJECTILE_ATLAS, TextureAtlas.class)); - animator.addAnimation(START_ANIM, START_SPEED, Animation.PlayMode.NORMAL); - animator.addAnimation(FINAL_ANIM, FINAL_SPEED, Animation.PlayMode.NORMAL); - - projectile - .addComponent(animator) - .addComponent(new ProjectileAnimationController()); - } - case BURN -> { - projectile.addComponent(new EffectsComponent(targetLayer, 3, ProjectileEffects.BURN, aoe)); - AnimationRenderComponent animator = - new AnimationRenderComponent( - ServiceLocator.getResourceService() - .getAsset("images/projectiles/burn_effect.atlas", TextureAtlas.class)); - animator.addAnimation(START_ANIM, START_SPEED, Animation.PlayMode.NORMAL); - animator.addAnimation(FINAL_ANIM, FINAL_SPEED, Animation.PlayMode.NORMAL); - - projectile - .addComponent(animator) - .addComponent(new BurnEffectProjectileAnimationController()); - } - case SLOW -> { - projectile.addComponent(new EffectsComponent(targetLayer, 3, ProjectileEffects.SLOW, aoe)); - AnimationRenderComponent animator = - new AnimationRenderComponent( - ServiceLocator.getResourceService() - .getAsset("images/projectiles/snow_ball.atlas", TextureAtlas.class)); - animator.addAnimation(START_ANIM, START_SPEED, Animation.PlayMode.NORMAL); - animator.addAnimation(FINAL_ANIM, FINAL_SPEED, Animation.PlayMode.NORMAL); - - projectile - .addComponent(animator) - .addComponent(new SnowBallProjectileAnimationController()); - // * TEMPORARY - // .addComponent(new DeleteOnMapEdgeComponent()); - // .addComponent(new SelfDestructOnHitComponent(PhysicsLayer.OBSTACLE)); - - return projectile; - } - case STUN -> { - projectile.addComponent(new EffectsComponent(targetLayer, 3, ProjectileEffects.STUN, aoe)); - AnimationRenderComponent animator = - new AnimationRenderComponent( - ServiceLocator.getResourceService() - .getAsset("images/projectiles/stun_effect.atlas", TextureAtlas.class)); - animator.addAnimation(START_ANIM, 0.1f, Animation.PlayMode.LOOP); - - projectile - .addComponent(animator) - .addComponent(new StunEffectProjectileAnimationController()); - } - } - return projectile; - } - - /** - * Create a pierce fireball. - * Pierce fireball is basically a fireball that does damage but won't self destruct on hit. - */ - public static Entity createPierceFireBall(short targetLayer, Vector2 destination, Vector2 speed) { - Entity fireBall = createPierceBallAnim(targetLayer, destination, speed); - fireBall.getComponent(TouchAttackComponent.class).setDisposeOnHit(false); - fireBall.getComponent(TouchAttackComponent.class).setKnockBack(0f); - - return fireBall; - } - - /** - * Create a ricochet fireball. - * Ricochet fireball bounces off specified targets while applying intended effects i.e. damage - */ - public static Entity createRicochetFireball(short targetLayer, Vector2 destination, Vector2 speed, int bounceCount) { - Entity fireBall = createFireBall(targetLayer, destination, speed); - fireBall - .addComponent(new RicochetComponent(targetLayer, bounceCount)); - - setColliderSize(fireBall, (float) 0.1, (float) 0.1); - - return fireBall; - } - - public static Entity createSplitFireWorksFireball(short targetLayer, Vector2 destination, Vector2 speed, int amount) { - Entity fireBall = createFireBall(targetLayer, destination, speed); - fireBall - .addComponent(new SplitFireworksComponent(targetLayer, amount)); - - return fireBall; - } - - /** - * Creates a fireball Entity. - * - * @param targetLayer The enemy layer that the projectile collides with. - * @param destination The destination the projectile heads towards. - * @param speed The speed of the projectile. - * @return Returns a new fireball projectile entity. - */ - public static Entity createFireBall(short targetLayer, Vector2 destination, Vector2 speed) { - Entity projectile = createBaseProjectile(targetLayer, destination, speed); - - AnimationRenderComponent animator = - new AnimationRenderComponent( - ServiceLocator.getResourceService() - .getAsset(BASE_PROJECTILE_ATLAS, TextureAtlas.class)); - animator.addAnimation(START_ANIM, START_SPEED, Animation.PlayMode.NORMAL); - animator.addAnimation(FINAL_ANIM, FINAL_SPEED, Animation.PlayMode.NORMAL); - - projectile - .addComponent(animator) - .addComponent(new ProjectileAnimationController()); - // * TEMPORARY - // .addComponent(new DeleteOnMapEdgeComponent()); - // .addComponent(new SelfDestructOnHitComponent(PhysicsLayer.OBSTACLE)); - - return projectile; - } - - /** - * Creates new animation and fireballs for SplitFireworkComponent. - * - * @param targetLayer The enemy layer that the projectile collides with. - * @param destination The destination the projectile heads towards. - * @param speed The speed of the projectile. - * @return Returns a new fireball projectile entity. - */ - public static Entity createFireworks(short targetLayer, Vector2 destination, Vector2 speed) { - Entity projectile = createBaseProjectile(targetLayer, destination, speed); - - AnimationRenderComponent animator = - new AnimationRenderComponent( - ServiceLocator.getResourceService() - .getAsset("images/projectiles/firework_anim.atlas", TextureAtlas.class)); - animator.addAnimation(START_ANIM, 0.2f, Animation.PlayMode.LOOP); - projectile - .addComponent(animator) - .addComponent(new FireworkAnimationController()); - - return projectile; - } - - public static Entity createPierceBallAnim(short targetLayer, Vector2 destination, Vector2 speed) { - Entity projectile = createBaseProjectile(targetLayer, destination, speed); - - AnimationRenderComponent animator = - new AnimationRenderComponent( - ServiceLocator.getResourceService() - .getAsset("images/projectiles/pierce_anim.atlas", TextureAtlas.class)); - animator.addAnimation(START_ANIM, 0.05f, Animation.PlayMode.LOOP); - projectile - .addComponent(animator) - .addComponent(new PierceProjectileAnimationController()); - - return projectile; - } - - - /** - * Creates a engineer bullet - * - * @param targetLayer The enemy layer that the projectile collides with. - * @param destination The destination the projectile heads towards. - * @param speed The speed of the projectile. - * @return Returns a new fireball projectile entity. - */ - public static Entity createEngineerBullet(short targetLayer, Vector2 destination, Vector2 speed) { - Entity projectile = createBaseProjectile(targetLayer, destination, speed); - - AnimationRenderComponent animator = - new AnimationRenderComponent( - ServiceLocator.getResourceService() - .getAsset("images/projectiles/engineer_projectile.atlas", TextureAtlas.class)); - animator.addAnimation("bullet", START_SPEED, Animation.PlayMode.NORMAL); - animator.addAnimation("bulletFinal", FINAL_SPEED, Animation.PlayMode.NORMAL); - - projectile - .addComponent(animator) - .addComponent(new EngineerBulletsAnimationController()); - // .addComponent(new SelfDestructOnHitComponent(PhysicsLayer.OBSTACLE)); - - return projectile; - } - - /** - * Creates a projectile specifically for mobs to shoot - * - * @param targetLayer The enemy layer that the projectile collides with. - * @param destination The destination the projectile heads towards. - * @param speed The speed of the projectile. - * @return Returns a new fireball projectile entity. - */ - public static Entity createMobBall(short targetLayer, Vector2 destination, Vector2 speed) { - Entity projectile = createBaseProjectile(targetLayer, destination, speed); - - AnimationRenderComponent animator = - new AnimationRenderComponent( - ServiceLocator.getResourceService() - .getAsset("images/projectiles/mobProjectile.atlas", TextureAtlas.class)); - - animator.addAnimation("rotate", 0.15f, Animation.PlayMode.LOOP); - - projectile - .addComponent(animator) - .addComponent(new MobProjectileAnimationController()); - // * TEMPORARY - // .addComponent(new DeleteOnMapEdgeComponent()); - - projectile - .getComponent(AnimationRenderComponent.class).scaleEntity(); - - - - return projectile; - } - public static Entity createBossBall(short targetLayer, Vector2 destination, Vector2 speed) { // function added by team 7 for Boss projectile - Entity projectile = createBaseProjectile(targetLayer, destination, speed); - - AnimationRenderComponent animator = - new AnimationRenderComponent( - ServiceLocator.getResourceService() - .getAsset("images/projectiles/bossProjectile.atlas", TextureAtlas.class)); - - animator.addAnimation("rotate", 0.15f, Animation.PlayMode.LOOP); - - projectile - .addComponent(animator) - .addComponent(new BossProjectileAnimationController()); - - projectile - .getComponent(AnimationRenderComponent.class).scaleEntity(); - projectile.setScale(2,2); - - return projectile; - } - - /** - * Creates a projectile to be used by the MobBoss - * - * @param targetLayer The enemy layer that the projectile collides with. - * @param destination The destination the projectile heads towards. - * @param speed The speed of the projectile. - * @return Returns a new fireball projectile entity. - */ - public static Entity createMobBossBall(short targetLayer, Vector2 destination, Vector2 speed) { - Entity projectile = createBaseProjectile(targetLayer, destination, speed); - - AnimationRenderComponent animator = - new AnimationRenderComponent( - ServiceLocator.getResourceService() - .getAsset("images/projectiles/mobBoss_projectile.atlas", TextureAtlas.class)); - animator.addAnimation("mob_boss", 0.17f, Animation.PlayMode.NORMAL); - animator.addAnimation("mob_bossFinal", 0.17f, Animation.PlayMode.NORMAL); - - - projectile - .addComponent(animator) - .addComponent(new MobBossProjectAnimController()); - - projectile - .getComponent(AnimationRenderComponent.class).scaleEntity(); - - return projectile; - } - - /** - * Creates a generic projectile entity that can be used for multiple types of * projectiles. - * - * @param targetLayer The enemy layer that the projectile collides with. - * @param destination The destination the projectile heads towards. - * @param speed The speed of the projectile. - * @return Returns a generic projectile entity. - */ - public static Entity createBaseProjectile(short targetLayer, Vector2 - destination, Vector2 speed) { - BaseEntityConfig config = configs.fireBall; - - AITaskComponent aiComponent = - new AITaskComponent() - .addTask(new TrajectTask(destination)); - - Entity projectile = new Entity() - .addComponent(new PhysicsComponent()) - .addComponent(new PhysicsMovementComponent()) - .addComponent(new HitboxComponent().setLayer(PhysicsLayer.PROJECTILE)) - .addComponent(aiComponent) - .addComponent(new ColliderComponent().setSensor(true)) - // This is the component that allows the projectile to damage a - // specified target. - // Original knockback value: 1.5f - .addComponent(new TouchAttackComponent(targetLayer, 1.5f, true)) - .addComponent(new CombatStatsComponent(config.health, config.baseAttack)) - // *TEMPORARY - .addComponent(new DeleteOnMapEdgeComponent()); - - projectile - .getComponent(PhysicsMovementComponent.class).setSpeed(speed); - - return projectile; - } - - /** - * Sets the projectile collider so that the collider size can be altered for flexibility. - * @param projectile Projectile's size collider to be scaled upon. - * @param x Horizontal scaling of the collider in respect ot the size of the entity - * @param y Veritcal scaling of the collider in respect to the size of the entity - */ - public static void setColliderSize(Entity projectile, float x, float y) { - PhysicsUtils.setScaledCollider(projectile, x, y); - } - - /** - * Prevents the creation of a Projectile Factory entity being created - */ - private ProjectileFactory() { - throw new IllegalStateException("Instantiating static util class"); - } -} +package com.csse3200.game.entities.factories; + +import com.badlogic.gdx.graphics.g2d.Animation; +import com.badlogic.gdx.graphics.g2d.TextureAtlas; +import com.csse3200.game.components.*; +import com.csse3200.game.components.MobProjectileAnimationController; +import com.csse3200.game.components.tasks.TrajectTask; +import com.csse3200.game.ai.tasks.AITaskComponent; +import com.csse3200.game.components.projectile.*; +import com.csse3200.game.entities.configs.BaseEntityConfig; +import com.csse3200.game.entities.configs.NPCConfigs; +import com.csse3200.game.files.FileLoader; +import com.csse3200.game.entities.Entity; +import com.csse3200.game.rendering.AnimationRenderComponent; +import com.csse3200.game.services.ServiceLocator; +import com.csse3200.game.physics.PhysicsLayer; +import com.csse3200.game.physics.PhysicsUtils; +import com.csse3200.game.physics.components.ColliderComponent; +import com.csse3200.game.physics.components.HitboxComponent; +import com.csse3200.game.physics.components.PhysicsComponent; +import com.csse3200.game.physics.components.PhysicsMovementComponent; +import com.badlogic.gdx.math.Vector2; + +/** + * Responsible for creating projectiles within the game. + */ +public class ProjectileFactory { + /** + * Animation constants + */ + private static final String BASE_PROJECTILE_ATLAS = "images/projectiles/basic_projectile.atlas"; + private static final String START_ANIM = "projectile"; + private static final String FINAL_ANIM = "projectileFinal"; + private static final float START_SPEED = 0.1f; + private static final float FINAL_SPEED = 0.1f; + + private static final NPCConfigs configs = + FileLoader.readClass(NPCConfigs.class, "configs/NPCs.json"); + + /** + * Creates a single-targeting projectile with specified effect + * + * @param targetLayer The enemy layer that the projectile collides with. + * @param destination The destination the projectile heads towards. + * @param speed The speed of the projectile. + * @param effect Specified effect from the ProjectileEffects enums + * @return Returns a new single-target projectile entity + */ + public static Entity createEffectProjectile(short targetLayer, Vector2 destination, Vector2 speed, ProjectileEffects effect, boolean aoe) { + Entity projectile = createBaseProjectile(targetLayer, destination, speed); + + switch (effect) { + case FIREBALL -> { + projectile.addComponent(new EffectsComponent(targetLayer, 3, ProjectileEffects.FIREBALL, aoe)); + AnimationRenderComponent animator = + new AnimationRenderComponent( + ServiceLocator.getResourceService() + .getAsset(BASE_PROJECTILE_ATLAS, TextureAtlas.class)); + animator.addAnimation(START_ANIM, START_SPEED, Animation.PlayMode.NORMAL); + animator.addAnimation(FINAL_ANIM, FINAL_SPEED, Animation.PlayMode.NORMAL); + animator.addAnimation("projectileCollide", START_SPEED, Animation.PlayMode.NORMAL); + + projectile + .addComponent(animator) + .addComponent(new ProjectileAnimationController(targetLayer)); + } + case BURN -> { + projectile.addComponent(new EffectsComponent(targetLayer, 3, ProjectileEffects.BURN, aoe)); + AnimationRenderComponent animator = + new AnimationRenderComponent( + ServiceLocator.getResourceService() + .getAsset("images/projectiles/burn_effect.atlas", TextureAtlas.class)); + animator.addAnimation(START_ANIM, START_SPEED, Animation.PlayMode.NORMAL); + animator.addAnimation(FINAL_ANIM, FINAL_SPEED, Animation.PlayMode.NORMAL); + animator.addAnimation("explosion", 0.1f, Animation.PlayMode.NORMAL); + + projectile + .addComponent(animator) + .addComponent(new BurnEffectProjectileAnimationController(targetLayer)); + } + case SLOW -> { + projectile.addComponent(new EffectsComponent(targetLayer, 3, ProjectileEffects.SLOW, aoe)); + AnimationRenderComponent animator = + new AnimationRenderComponent( + ServiceLocator.getResourceService() + .getAsset("images/projectiles/snow_ball.atlas", TextureAtlas.class)); + animator.addAnimation(START_ANIM, START_SPEED, Animation.PlayMode.NORMAL); + animator.addAnimation(FINAL_ANIM, FINAL_SPEED, Animation.PlayMode.NORMAL); + animator.addAnimation("collision", START_SPEED, Animation.PlayMode.NORMAL); + + projectile + .addComponent(animator) + .addComponent(new SnowBallProjectileAnimationController(targetLayer)); + // * TEMPORARY + // .addComponent(new DeleteOnMapEdgeComponent()); + // .addComponent(new SelfDestructOnHitComponent(PhysicsLayer.OBSTACLE)); + + return projectile; + } + case STUN -> { + projectile.addComponent(new EffectsComponent(targetLayer, 3, ProjectileEffects.STUN, aoe)); + AnimationRenderComponent animator = + new AnimationRenderComponent( + ServiceLocator.getResourceService() + .getAsset("images/projectiles/stun_effect.atlas", TextureAtlas.class)); + animator.addAnimation(START_ANIM, 0.1f, Animation.PlayMode.LOOP); + animator.addAnimation("stun", 0.3f, Animation.PlayMode.LOOP); + + projectile + .addComponent(animator) + .addComponent(new StunEffectProjectileAnimationController(targetLayer)); + } + } + return projectile; + } + + public static Entity createComboSnowBall(short targetLayer, Vector2 destination, Vector2 speed, boolean aoe) { + Entity projectile = createBaseProjectile(targetLayer, destination, speed); + projectile.addComponent(new EffectsComponent(targetLayer, 3, ProjectileEffects.SLOW, aoe)); + + AnimationRenderComponent animator = + new AnimationRenderComponent( + ServiceLocator.getResourceService() + .getAsset("images/projectiles/mobBoss_projectile.atlas", TextureAtlas.class), + ServiceLocator.getResourceService() + .getAsset("images/projectiles/snow_ball.atlas", TextureAtlas.class)); + animator.addAnimation(START_ANIM, START_SPEED, Animation.PlayMode.NORMAL); + animator.addAnimation(FINAL_ANIM, FINAL_SPEED, Animation.PlayMode.NORMAL); + animator.addAnimation("collision", START_SPEED, Animation.PlayMode.NORMAL); + + projectile + .addComponent(animator) + .addComponent(new SnowBallProjectileAnimationController(targetLayer)); + // * TEMPORARY + // .addComponent(new DeleteOnMapEdgeComponent()); + // .addComponent(new SelfDestructOnHitComponent(PhysicsLayer.OBSTACLE)); + + return projectile; + } + + /** + * Create a pierce fireball. + * Pierce fireball is basically a fireball that does damage but won't self destruct on hit. + */ + public static Entity createPierceFireBall(short targetLayer, Vector2 destination, Vector2 speed) { + Entity fireBall = createPierceBallAnim(targetLayer, destination, speed); + fireBall.getComponent(TouchAttackComponent.class).setDisposeOnHit(false); + fireBall.getComponent(TouchAttackComponent.class).setKnockBack(0f); + + return fireBall; + } + + public static Entity createPierceArrow(short targetLayer, Vector2 destination, Vector2 speed) { + Entity arrow = createBaseProjectile(targetLayer, destination, speed); + AnimationRenderComponent animator = + new AnimationRenderComponent( + ServiceLocator.getResourceService() + .getAsset("images/projectiles/arrow.atlas", TextureAtlas.class)); + animator.addAnimation("arrow", 0.1f, Animation.PlayMode.LOOP); + arrow + .addComponent(animator) + .addComponent(new PierceArrowAnimationController()); + arrow.getComponent(TouchAttackComponent.class).setDisposeOnHit(false); + arrow.getComponent(TouchAttackComponent.class).setKnockBack(0f); + + return arrow; + } + + /** + * Create a ricochet fireball. + * Ricochet fireball bounces off specified targets while applying intended effects i.e. damage + */ + public static Entity createRicochetFireball(short targetLayer, Vector2 destination, Vector2 speed, int bounceCount) { + Entity fireBall = createFireBall(targetLayer, destination, speed); + fireBall + .addComponent(new RicochetComponent(targetLayer, bounceCount)); + + setColliderSize(fireBall, (float) 0.1, (float) 0.1); + + return fireBall; + } + + public static Entity createSplitFireWorksFireball(short targetLayer, Vector2 destination, Vector2 speed, int amount) { + Entity fireBall = createFireBall(targetLayer, destination, speed); + fireBall + .addComponent(new SplitFireworksComponent(targetLayer, amount)); + + return fireBall; + } + + /** + * Creates a fireball Entity. + * + * @param targetLayer The enemy layer that the projectile collides with. + * @param destination The destination the projectile heads towards. + * @param speed The speed of the projectile. + * @return Returns a new fireball projectile entity. + */ + public static Entity createFireBall(short targetLayer, Vector2 destination, Vector2 speed) { + Entity projectile = createBaseProjectile(targetLayer, destination, speed); + + AnimationRenderComponent animator = + new AnimationRenderComponent( + ServiceLocator.getResourceService() + .getAsset(BASE_PROJECTILE_ATLAS, TextureAtlas.class)); + animator.addAnimation(START_ANIM, START_SPEED, Animation.PlayMode.NORMAL); + animator.addAnimation(FINAL_ANIM, FINAL_SPEED, Animation.PlayMode.NORMAL); + animator.addAnimation("projectileCollide", START_SPEED, Animation.PlayMode.NORMAL); + + projectile + .addComponent(animator) + .addComponent(new ProjectileAnimationController(targetLayer)); + // * TEMPORARY + // .addComponent(new DeleteOnMapEdgeComponent()); + // .addComponent(new SelfDestructOnHitComponent(PhysicsLayer.OBSTACLE)); + + return projectile; + } + + /** + * Creates new animation and fireballs for SplitFireworkComponent. + * + * @param targetLayer The enemy layer that the projectile collides with. + * @param destination The destination the projectile heads towards. + * @param speed The speed of the projectile. + * @return Returns a new fireball projectile entity. + */ + public static Entity createFireworks(short targetLayer, Vector2 destination, Vector2 speed) { + Entity projectile = createBaseProjectile(targetLayer, destination, speed); + + AnimationRenderComponent animator = + new AnimationRenderComponent( + ServiceLocator.getResourceService() + .getAsset("images/projectiles/firework_anim.atlas", TextureAtlas.class)); + animator.addAnimation(START_ANIM, 0.2f, Animation.PlayMode.LOOP); + projectile + .addComponent(animator) + .addComponent(new FireworkAnimationController()); + + return projectile; + } + + public static Entity createPierceBallAnim(short targetLayer, Vector2 destination, Vector2 speed) { + Entity projectile = createBaseProjectile(targetLayer, destination, speed); + + AnimationRenderComponent animator = + new AnimationRenderComponent( + ServiceLocator.getResourceService() + .getAsset("images/projectiles/pierce_anim.atlas", TextureAtlas.class)); + animator.addAnimation(START_ANIM, 0.05f, Animation.PlayMode.LOOP); + projectile + .addComponent(animator) + .addComponent(new PierceProjectileAnimationController()); + + return projectile; + } + + + /** + * Creates a engineer bullet + * + * @param targetLayer The enemy layer that the projectile collides with. + * @param destination The destination the projectile heads towards. + * @param speed The speed of the projectile. + * @return Returns a new fireball projectile entity. + */ + public static Entity createEngineerBullet(short targetLayer, Vector2 destination, Vector2 speed) { + Entity projectile = createBaseProjectile(targetLayer, destination, speed); + + AnimationRenderComponent animator = + new AnimationRenderComponent( + ServiceLocator.getResourceService() + .getAsset("images/projectiles/engineer_projectile.atlas", TextureAtlas.class)); + animator.addAnimation("bullet", START_SPEED, Animation.PlayMode.NORMAL); + animator.addAnimation("bulletFinal", FINAL_SPEED, Animation.PlayMode.NORMAL); + animator.addAnimation("bulletCollide", START_SPEED, Animation.PlayMode.NORMAL); + + projectile + .addComponent(animator) + .addComponent(new EngineerBulletsAnimationController(targetLayer)); + // .addComponent(new SelfDestructOnHitComponent(PhysicsLayer.OBSTACLE)); + + return projectile; + } + + /** + * Creates a projectile specifically for mobs to shoot + * + * @param targetLayer The enemy layer that the projectile collides with. + * @param destination The destination the projectile heads towards. + * @param speed The speed of the projectile. + * @return Returns a new fireball projectile entity. + */ + public static Entity createMobBall(short targetLayer, Vector2 destination, Vector2 speed) { + Entity projectile = createBaseProjectile(targetLayer, destination, speed); + + AnimationRenderComponent animator = + new AnimationRenderComponent( + ServiceLocator.getResourceService() + .getAsset("images/projectiles/mobProjectile.atlas", TextureAtlas.class)); + + animator.addAnimation("rotate", 0.15f, Animation.PlayMode.LOOP); + + projectile + .addComponent(animator) + .addComponent(new MobProjectileAnimationController()); + // * TEMPORARY + // .addComponent(new DeleteOnMapEdgeComponent()); + + projectile + .getComponent(AnimationRenderComponent.class).scaleEntity(); + + + + return projectile; + } + public static Entity createBossBall(short targetLayer, Vector2 destination, Vector2 speed) { // function added by team 7 for Boss projectile + Entity projectile = createBaseProjectile(targetLayer, destination, speed); + + AnimationRenderComponent animator = + new AnimationRenderComponent( + ServiceLocator.getResourceService() + .getAsset("images/projectiles/bossProjectile.atlas", TextureAtlas.class)); + + animator.addAnimation("rotate", 0.15f, Animation.PlayMode.LOOP); + + projectile + .addComponent(animator) + .addComponent(new BossProjectileAnimationController()); + + projectile + .getComponent(AnimationRenderComponent.class).scaleEntity(); + projectile.setScale(2,2); + + return projectile; + } + + /** + * Creates a projectile to be used by the MobBoss + * + * @param targetLayer The enemy layer that the projectile collides with. + * @param destination The destination the projectile heads towards. + * @param speed The speed of the projectile. + * @return Returns a new fireball projectile entity. + */ + public static Entity createMobBossBall(short targetLayer, Vector2 destination, Vector2 speed) { + Entity projectile = createBaseProjectile(targetLayer, destination, speed); + + AnimationRenderComponent animator = + new AnimationRenderComponent( + ServiceLocator.getResourceService() + .getAsset("images/projectiles/mobBoss_projectile.atlas", TextureAtlas.class)); + animator.addAnimation("mob_boss", 0.17f, Animation.PlayMode.NORMAL); + animator.addAnimation("mob_bossFinal", 0.17f, Animation.PlayMode.NORMAL); + + + projectile + .addComponent(animator) + .addComponent(new MobBossProjectAnimController()); + + projectile + .getComponent(AnimationRenderComponent.class).scaleEntity(); + + return projectile; + } + + /** + * Creates a generic projectile entity that can be used for multiple types of * projectiles. + * + * @param targetLayer The enemy layer that the projectile collides with. + * @param destination The destination the projectile heads towards. + * @param speed The speed of the projectile. + * @return Returns a generic projectile entity. + */ + public static Entity createBaseProjectile(short targetLayer, Vector2 + destination, Vector2 speed) { + BaseEntityConfig config = configs.fireBall; + + AITaskComponent aiComponent = + new AITaskComponent() + .addTask(new TrajectTask(destination)); + + Entity projectile = new Entity() + .addComponent(new PhysicsComponent()) + .addComponent(new PhysicsMovementComponent()) + .addComponent(new HitboxComponent().setLayer(PhysicsLayer.PROJECTILE)) + .addComponent(aiComponent) + .addComponent(new ColliderComponent().setSensor(true)) + // This is the component that allows the projectile to damage a + // specified target. + // Original knockback value: 1.5f + .addComponent(new TouchAttackComponent(targetLayer, 1.5f, true)) + .addComponent(new CombatStatsComponent(config.health, config.baseAttack)) + // *TEMPORARY + .addComponent(new DeleteOnMapEdgeComponent()); + + projectile + .getComponent(PhysicsMovementComponent.class).setSpeed(speed); + + return projectile; + } + + /** + * Sets the projectile collider so that the collider size can be altered for flexibility. + * @param projectile Projectile's size collider to be scaled upon. + * @param x Horizontal scaling of the collider in respect ot the size of the entity + * @param y Veritcal scaling of the collider in respect to the size of the entity + */ + public static void setColliderSize(Entity projectile, float x, float y) { + PhysicsUtils.setScaledCollider(projectile, x, y); + } + + /** + * Prevents the creation of a Projectile Factory entity being created + */ + private ProjectileFactory() { + throw new IllegalStateException("Instantiating static util class"); + } +} diff --git a/source/core/src/test/com/csse3200/game/components/archer/ArcherAnimationControllerTest.java b/source/core/src/test/com/csse3200/game/components/archer/ArcherAnimationControllerTest.java new file mode 100644 index 000000000..4bf447bc1 --- /dev/null +++ b/source/core/src/test/com/csse3200/game/components/archer/ArcherAnimationControllerTest.java @@ -0,0 +1,67 @@ +package com.csse3200.game.components.archer; + + +import com.csse3200.game.entities.Entity; +import com.csse3200.game.entities.factories.NPCFactory; +import com.csse3200.game.extensions.GameExtension; +import com.csse3200.game.physics.PhysicsService; +import com.csse3200.game.rendering.AnimationRenderComponent; +import com.csse3200.game.rendering.DebugRenderer; +import com.csse3200.game.rendering.RenderService; +import com.csse3200.game.services.ResourceService; +import com.csse3200.game.services.ServiceLocator; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; + +import java.util.Objects; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.mockito.Mockito.mock; + + +@ExtendWith(GameExtension.class) +public class ArcherAnimationControllerTest { + + private Entity arcaneArcher; + private final String[] atlas = {"images/mobs/arcane_archer.atlas"}; + + @BeforeEach + public void setUp() { + ServiceLocator.registerPhysicsService(new PhysicsService()); + RenderService render = new RenderService(); + render.setDebug(mock(DebugRenderer.class)); + ServiceLocator.registerRenderService(render); + ResourceService resourceService = new ResourceService(); + ServiceLocator.registerResourceService(resourceService); + resourceService.loadTextureAtlases(atlas); + resourceService.loadAll(); + + arcaneArcher = NPCFactory.createDodgingArcaneArcher(60); // Replace with actual Droid Tower creation logic + arcaneArcher.create(); + } + + @Test + public void testAnimateWander() { + arcaneArcher.getEvents().trigger("mob_walk"); + assertEquals("arcane_archer_run", arcaneArcher.getComponent(AnimationRenderComponent.class).getCurrentAnimation()); + } + + @Test + public void testAnimateAttack() { + arcaneArcher.getEvents().trigger("mob_attack"); + assertEquals("arcane_archer_attack", arcaneArcher.getComponent(AnimationRenderComponent.class).getCurrentAnimation()); + } + + @Test + public void testAnimateDeath() { + arcaneArcher.getEvents().trigger("mob_death"); + assertEquals("arcane_archer_death", arcaneArcher.getComponent(AnimationRenderComponent.class).getCurrentAnimation()); + } + + @Test + public void testAnimateDodge() { + arcaneArcher.getEvents().trigger("mob_dodge"); + assertEquals("arcane_archer_dodge", arcaneArcher.getComponent(AnimationRenderComponent.class).getCurrentAnimation()); + } +} diff --git a/source/core/src/test/com/csse3200/game/components/projectile/EngineerBulletsAnimationControllerTest.java b/source/core/src/test/com/csse3200/game/components/projectile/EngineerBulletsAnimationControllerTest.java new file mode 100644 index 000000000..5c2e79976 --- /dev/null +++ b/source/core/src/test/com/csse3200/game/components/projectile/EngineerBulletsAnimationControllerTest.java @@ -0,0 +1,67 @@ +package com.csse3200.game.components.projectile; + +import com.badlogic.gdx.math.Vector2; +import com.csse3200.game.entities.Entity; +import com.csse3200.game.entities.factories.ProjectileFactory; +import com.csse3200.game.extensions.GameExtension; +import com.csse3200.game.physics.PhysicsService; +import com.csse3200.game.physics.PhysicsLayer; +import com.csse3200.game.rendering.AnimationRenderComponent; +import com.csse3200.game.rendering.DebugRenderer; +import com.csse3200.game.rendering.RenderService; +import com.csse3200.game.services.ResourceService; +import com.csse3200.game.services.ServiceLocator; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import com.badlogic.gdx.physics.box2d.Fixture; + +import java.util.Objects; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.mockito.Mockito.mock; + + +@ExtendWith(GameExtension.class) +public class EngineerBulletsAnimationControllerTest { + + private Entity engineerBullet; + private final String[] atlas = {"images/projectiles/engineer_projectile.atlas"}; + + @BeforeEach + public void setUp() { + ServiceLocator.registerPhysicsService(new PhysicsService()); + RenderService render = new RenderService(); + render.setDebug(mock(DebugRenderer.class)); + ServiceLocator.registerRenderService(render); + ResourceService resourceService = new ResourceService(); + ServiceLocator.registerResourceService(resourceService); + resourceService.loadTextureAtlases(atlas); + resourceService.loadAll(); + + engineerBullet = ProjectileFactory.createEngineerBullet(PhysicsLayer.NPC, + new Vector2(100, 0), + new Vector2(4f, 4f)); + engineerBullet.setScale(0.8f, 0.8f); + engineerBullet.setPosition(0, 0); + engineerBullet.create(); + } + + @Test + public void testAnimateStart() { + engineerBullet.getEvents().trigger("startProjectile"); + assertEquals("bullet", engineerBullet.getComponent(AnimationRenderComponent.class).getCurrentAnimation()); + } + + @Test + public void testAnimateFinal() { + engineerBullet.getEvents().trigger("startProjectileFinal"); + assertEquals("bulletFinal", engineerBullet.getComponent(AnimationRenderComponent.class).getCurrentAnimation()); + } + + @Test + public void testAnimateCollide() { + engineerBullet.getEvents().trigger("collisionStart", null, null); + assertEquals("bulletCollide", engineerBullet.getComponent(AnimationRenderComponent.class).getCurrentAnimation()); + } +} diff --git a/source/core/src/test/com/csse3200/game/components/xenos/XenoAnimationControllerTest.java b/source/core/src/test/com/csse3200/game/components/xenos/XenoAnimationControllerTest.java index aa0249b30..0d5361e75 100644 --- a/source/core/src/test/com/csse3200/game/components/xenos/XenoAnimationControllerTest.java +++ b/source/core/src/test/com/csse3200/game/components/xenos/XenoAnimationControllerTest.java @@ -1,70 +1,75 @@ -package com.csse3200.game.components.xenos; - - -import com.csse3200.game.entities.Entity; -import com.csse3200.game.entities.factories.NPCFactory; -import com.csse3200.game.extensions.GameExtension; -import com.csse3200.game.physics.PhysicsService; -import com.csse3200.game.rendering.AnimationRenderComponent; -import com.csse3200.game.rendering.DebugRenderer; -import com.csse3200.game.rendering.RenderService; -import com.csse3200.game.services.ResourceService; -import com.csse3200.game.services.ServiceLocator; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; - -import java.util.Objects; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.mockito.Mockito.mock; - - -@ExtendWith(GameExtension.class) -class XenoAnimationControllerTest { - - private Entity xenoGrunt; - private final String[] atlas = {"images/mobs/xenoGrunt.atlas"}; - - @BeforeEach - public void setUp() { - ServiceLocator.registerPhysicsService(new PhysicsService()); - RenderService render = new RenderService(); - render.setDebug(mock(DebugRenderer.class)); - ServiceLocator.registerRenderService(render); - ResourceService resourceService = new ResourceService(); - ServiceLocator.registerResourceService(resourceService); - resourceService.loadTextureAtlases(atlas); - resourceService.loadAll(); - - xenoGrunt = NPCFactory.createXenoGrunt(60); // Replace with actual Droid Tower creation logic - xenoGrunt.create(); - } - - @Test - void testAnimateWander() { - xenoGrunt.getEvents().trigger("wanderStart"); - assertEquals("xeno_run", xenoGrunt.getComponent(AnimationRenderComponent.class).getCurrentAnimation()); - } - - @Test - void testAnimateHurt() { - xenoGrunt.getEvents().trigger("runHurt"); - assertEquals("xeno_hurt", xenoGrunt.getComponent(AnimationRenderComponent.class).getCurrentAnimation()); - } - - @Test - void testAnimateMelee1() { - //TODO: Add at least one assertion to this test case. - xenoGrunt.getEvents().trigger("meleeStart"); - assert(Objects.equals(xenoGrunt.getComponent(AnimationRenderComponent.class).getCurrentAnimation(), "xeno_melee_1") - || Objects.equals(xenoGrunt.getComponent(AnimationRenderComponent.class).getCurrentAnimation(), "xeno_melee_2")); - } - - @Test - void testAnimateDie() { - xenoGrunt.getEvents().trigger("dieStart"); - assertEquals("xeno_die", xenoGrunt.getComponent(AnimationRenderComponent.class).getCurrentAnimation()); - } - -} +package com.csse3200.game.components.xenos; + + +import com.csse3200.game.entities.Entity; +import com.csse3200.game.entities.factories.NPCFactory; +import com.csse3200.game.extensions.GameExtension; +import com.csse3200.game.physics.PhysicsService; +import com.csse3200.game.rendering.AnimationRenderComponent; +import com.csse3200.game.rendering.DebugRenderer; +import com.csse3200.game.rendering.RenderService; +import com.csse3200.game.services.ResourceService; +import com.csse3200.game.services.ServiceLocator; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; + +import java.util.Objects; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.mockito.Mockito.mock; + + +@ExtendWith(GameExtension.class) +public class XenoAnimationControllerTest { + + private Entity xenoGrunt; + private final String[] atlas = {"images/mobs/xenoGrunt.atlas"}; + + @BeforeEach + public void setUp() { + ServiceLocator.registerPhysicsService(new PhysicsService()); + RenderService render = new RenderService(); + render.setDebug(mock(DebugRenderer.class)); + ServiceLocator.registerRenderService(render); + ResourceService resourceService = new ResourceService(); + ServiceLocator.registerResourceService(resourceService); + resourceService.loadTextureAtlases(atlas); + resourceService.loadAll(); + + xenoGrunt = NPCFactory.createXenoGrunt(60); // Replace with actual Droid Tower creation logic + xenoGrunt.create(); + } + + @Test + public void testAnimateWander() { + xenoGrunt.getEvents().trigger("wanderStart"); + assertEquals("xeno_run", xenoGrunt.getComponent(AnimationRenderComponent.class).getCurrentAnimation()); + } + + @Test + public void testAnimateHurt() { + xenoGrunt.getEvents().trigger("runHurt"); + assertEquals("xeno_hurt", xenoGrunt.getComponent(AnimationRenderComponent.class).getCurrentAnimation()); + } + + @Test + public void testAnimateMelee1() { + xenoGrunt.getEvents().trigger("meleeStart"); + assert(Objects.equals(xenoGrunt.getComponent(AnimationRenderComponent.class).getCurrentAnimation(), "xeno_melee_1") + || Objects.equals(xenoGrunt.getComponent(AnimationRenderComponent.class).getCurrentAnimation(), "xeno_melee_2")); + } + + @Test + public void testAnimateDie() { + xenoGrunt.getEvents().trigger("dieStart"); + assertEquals("xeno_die", xenoGrunt.getComponent(AnimationRenderComponent.class).getCurrentAnimation()); + } + + @Test + public void testAnimateFreeze() { + xenoGrunt.getEvents().trigger("freeze"); + assertEquals("xeno_freeze", xenoGrunt.getComponent(AnimationRenderComponent.class).getCurrentAnimation()); + } + +}

RbQw{_-^sGTN>M!eyV}BvGU4 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 Fa LH00}LEh7FOk-U`N literal 66838 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