From 21cc40be1ef3881c131904b24feacdaf74ec70f5 Mon Sep 17 00:00:00 2001 From: Ziggy Date: Mon, 11 Jul 2022 00:00:38 +0200 Subject: [PATCH] Created a test that verifies that health, action or mind is spent when a command requires it Future addition could be that the command isn't executed if you're "too tired", which we have no support for now. --- .../gameplay/combat/AttackCostTest.kt | 86 +++++++++++++++++++ 1 file changed, 86 insertions(+) create mode 100644 src/test/java/com/projectswg/holocore/services/gameplay/combat/AttackCostTest.kt diff --git a/src/test/java/com/projectswg/holocore/services/gameplay/combat/AttackCostTest.kt b/src/test/java/com/projectswg/holocore/services/gameplay/combat/AttackCostTest.kt new file mode 100644 index 000000000..e8f364d75 --- /dev/null +++ b/src/test/java/com/projectswg/holocore/services/gameplay/combat/AttackCostTest.kt @@ -0,0 +1,86 @@ +package com.projectswg.holocore.services.gameplay.combat + +import com.projectswg.common.data.CRC +import com.projectswg.common.network.packets.swg.zone.object_controller.CommandQueueEnqueue +import com.projectswg.holocore.intents.support.global.network.InboundPacketIntent +import com.projectswg.holocore.intents.support.objects.swg.ObjectCreatedIntent +import com.projectswg.holocore.resources.support.objects.ObjectCreator +import com.projectswg.holocore.resources.support.objects.swg.weapon.WeaponObject +import com.projectswg.holocore.resources.support.objects.swg.weapon.WeaponType +import com.projectswg.holocore.services.gameplay.combat.command.CombatCommandService +import com.projectswg.holocore.services.support.global.commands.CommandExecutionService +import com.projectswg.holocore.services.support.global.commands.CommandQueueService +import com.projectswg.holocore.test.resources.GenericCreatureObject +import com.projectswg.holocore.test.resources.GenericPlayer +import com.projectswg.holocore.test.runners.TestRunnerSimulatedWorld +import org.junit.Assert.assertTrue +import org.junit.Before +import org.junit.Test + +class AttackCostTest : TestRunnerSimulatedWorld() { + + @Before + fun setup() { + registerService(CommandQueueService()) + registerService(CommandExecutionService()) + registerService(CombatCommandService()) + registerService(CombatStatusService()) + } + + @Test + fun `health points are spent when a combat command requires it`() { + val creatureObject = createCreatureObject() + val player = creatureObject.owner ?: throw RuntimeException("Unable to access player") + + burstRun(player) + + assertTrue(creatureObject.health < creatureObject.maxHealth) + } + + @Test + fun `action points are spent when a combat command requires it`() { + val creatureObject = createCreatureObject() + val player = creatureObject.owner ?: throw RuntimeException("Unable to access player") + + burstRun(player) + + assertTrue(creatureObject.action < creatureObject.maxAction) + } + + @Test + fun `mind points are spent when a combat command requires it`() { + val creatureObject = createCreatureObject() + val player = creatureObject.owner ?: throw RuntimeException("Unable to access player") + + burstRun(player) + + assertTrue(creatureObject.mind < creatureObject.maxMind) + } + + private fun burstRun(player: GenericPlayer) { + val crc = CRC.getCrc("burstrun") + + broadcastAndWait(InboundPacketIntent(player, CommandQueueEnqueue(player.creatureObject.objectId, 0, crc, 0, ""))) + } + + private fun createCreatureObject(): GenericCreatureObject { + val creatureObject = GenericCreatureObject(ObjectCreator.getNextObjectId()) + ObjectCreatedIntent.broadcast(creatureObject) + val defaultWeapon = createDefaultWeapon() + defaultWeapon.moveToContainer(creatureObject) + creatureObject.equippedWeapon = defaultWeapon + return creatureObject + } + + private fun createDefaultWeapon(): WeaponObject { + val defWeapon = ObjectCreator.createObjectFromTemplate("object/weapon/melee/unarmed/shared_unarmed_default_player.iff") as WeaponObject? + defWeapon ?: throw RuntimeException("Unable to create default weapon") + ObjectCreatedIntent.broadcast(defWeapon) + defWeapon.maxRange = 5f + defWeapon.type = WeaponType.UNARMED + defWeapon.attackSpeed = 4f + defWeapon.minDamage = 10 + defWeapon.maxDamage = 20 + return defWeapon + } +} \ No newline at end of file