feat(assassin): add stealth and double jump
This commit is contained in:
@@ -0,0 +1,60 @@
|
||||
package games.dmg.spigottyrant;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||
|
||||
import java.time.Duration;
|
||||
import java.time.Instant;
|
||||
import java.util.Map;
|
||||
import java.util.Optional;
|
||||
import java.util.Set;
|
||||
import java.util.UUID;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
final class AbilityReadinessServiceTest {
|
||||
private static final Instant NOW = Instant.parse("2026-08-14T12:00:00Z");
|
||||
private final AbilityReadinessService service = new AbilityReadinessService();
|
||||
|
||||
@Test
|
||||
void successfulCooldownActivationConsumesItemAndRefreshRestoresIt() {
|
||||
PlayerState ready = player(
|
||||
TyrantClass.ASSASSIN, Map.of(), Set.of(Ability.ASSASSIN_INVISIBILITY)
|
||||
);
|
||||
|
||||
PlayerState used = service.consume(
|
||||
ready, Ability.ASSASSIN_INVISIBILITY, NOW, Duration.ofHours(1)
|
||||
);
|
||||
PlayerState refreshed = service.refresh(used, NOW.plus(Duration.ofHours(1)));
|
||||
|
||||
assertEquals(Set.of(), used.readyAbilityItems());
|
||||
assertEquals(NOW.plus(Duration.ofHours(1)),
|
||||
used.cooldownEnds().get(Ability.ASSASSIN_INVISIBILITY));
|
||||
assertEquals(Set.of(Ability.ASSASSIN_INVISIBILITY),
|
||||
refreshed.readyAbilityItems());
|
||||
assertEquals(Map.of(), refreshed.cooldownEnds());
|
||||
}
|
||||
|
||||
@Test
|
||||
void tamerItemRemainsReadyWithoutCooldown() {
|
||||
PlayerState tamer = player(
|
||||
TyrantClass.TAMER, Map.of(), Set.of(Ability.TAMER_CAPTURE)
|
||||
);
|
||||
|
||||
PlayerState after = service.consume(
|
||||
tamer, Ability.TAMER_CAPTURE, NOW, Duration.ZERO
|
||||
);
|
||||
|
||||
assertEquals(tamer, after);
|
||||
}
|
||||
|
||||
private static PlayerState player(
|
||||
TyrantClass tyrantClass,
|
||||
Map<Ability, Instant> cooldowns,
|
||||
Set<Ability> ready
|
||||
) {
|
||||
return new PlayerState(
|
||||
UUID.fromString("11111111-1111-1111-1111-111111111111"), "Player",
|
||||
Optional.empty(), Optional.empty(), tyrantClass, Optional.empty(),
|
||||
cooldowns, ready, java.util.List.of()
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,60 @@
|
||||
package games.dmg.spigottyrant;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||
|
||||
import java.time.Instant;
|
||||
import java.util.Map;
|
||||
import java.util.Optional;
|
||||
import java.util.Set;
|
||||
import java.util.UUID;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
final class AssassinAbilityServiceTest {
|
||||
private static final Instant NOW = Instant.parse("2026-08-14T12:00:00Z");
|
||||
private final PluginSettings settings = PluginSettings.from(Map.of());
|
||||
private final AssassinAbilityService service = new AssassinAbilityService(
|
||||
new AbilityReadinessService(), settings
|
||||
);
|
||||
|
||||
@Test
|
||||
void invisibilityConsumesItemAndDoublesDurationNearTyrant() {
|
||||
PlayerState ready = assassin(Set.of(Ability.ASSASSIN_INVISIBILITY), Map.of());
|
||||
|
||||
AbilityUseResult normal = service.activateInvisibility(ready, NOW, false);
|
||||
AbilityUseResult near = service.activateInvisibility(ready, NOW, true);
|
||||
|
||||
assertEquals(AbilityUseStatus.ACTIVATED, normal.status());
|
||||
assertEquals(NOW.plusSeconds(600), normal.player().cooldownEnds()
|
||||
.get(Ability.ASSASSIN_INVISIBILITY_ACTIVE));
|
||||
assertEquals(NOW.plusSeconds(1200), near.player().cooldownEnds()
|
||||
.get(Ability.ASSASSIN_INVISIBILITY_ACTIVE));
|
||||
assertEquals(NOW.plusSeconds(3600), normal.player().cooldownEnds()
|
||||
.get(Ability.ASSASSIN_INVISIBILITY));
|
||||
assertEquals(Set.of(), normal.player().readyAbilityItems());
|
||||
}
|
||||
|
||||
@Test
|
||||
void doubleJumpAddsSpeedWeaknessAndSixtySecondCooldown() {
|
||||
PlayerState assassin = assassin(Set.of(), Map.of());
|
||||
|
||||
AbilityUseResult result = service.doubleJump(assassin, NOW);
|
||||
AbilityUseResult blocked = service.doubleJump(result.player(), NOW.plusSeconds(30));
|
||||
|
||||
assertEquals(AbilityUseStatus.ACTIVATED, result.status());
|
||||
assertEquals(NOW.plusSeconds(60), result.player().cooldownEnds()
|
||||
.get(Ability.ASSASSIN_DOUBLE_JUMP));
|
||||
assertEquals(NOW.plusSeconds(15), result.player().cooldownEnds()
|
||||
.get(Ability.ASSASSIN_SPEED_ACTIVE));
|
||||
assertEquals(NOW.plusSeconds(20), result.player().cooldownEnds()
|
||||
.get(Ability.ASSASSIN_WEAKNESS_ACTIVE));
|
||||
assertEquals(AbilityUseStatus.COOLDOWN, blocked.status());
|
||||
}
|
||||
|
||||
private static PlayerState assassin(Set<Ability> ready, Map<Ability, Instant> cooldowns) {
|
||||
return new PlayerState(
|
||||
UUID.fromString("11111111-1111-1111-1111-111111111111"), "Assassin",
|
||||
Optional.empty(), Optional.empty(), TyrantClass.ASSASSIN, Optional.empty(),
|
||||
cooldowns, ready, java.util.List.of()
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -46,6 +46,8 @@ final class ClassAssignmentServiceTest {
|
||||
assertEquals(ClassAssignmentStatus.ASSIGNED, vigilanteResult.status());
|
||||
assertEquals(TyrantClass.ASSASSIN,
|
||||
vigilanteResult.players().get(VIGILANTE).tyrantClass());
|
||||
assertEquals(Set.of(Ability.ASSASSIN_INVISIBILITY),
|
||||
vigilanteResult.players().get(VIGILANTE).readyAbilityItems());
|
||||
assertEquals(ClassAssignmentStatus.ASSIGNED, followerResult.status());
|
||||
assertEquals(TyrantClass.NONE,
|
||||
followerResult.players().get(VIGILANTE).tyrantClass());
|
||||
|
||||
Reference in New Issue
Block a user