GameTeam
unknown
java
3 months ago
3.2 kB
11
Indexable
package me.monoto.towerDefense.game;
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;
import java.util.UUID;
public class GameTeam {
private final TeamColor color;
private final Set<UUID> members = new HashSet<>();
private final TowerOwnership ownership = new TowerOwnership();
private int castleHp = 10_000;
public GameTeam(TeamColor color) {
this.color = color;
}
public void addMember(UUID player) { members.add(player); }
public void removeMember(UUID player) { members.remove(player); }
public boolean hasMember(UUID player) { return members.contains(player); }
public Set<UUID> members() { return Collections.unmodifiableSet(members); }
public TowerOwnership ownership() { return ownership; }
/** Claim a tower on behalf of a placing player. */
public void claimTower(UUID towerUuid, UUID playerUuid) {
ownership.claim(towerUuid, playerUuid);
}
/** Release a sold/removed tower. */
public void releaseTower(UUID towerUuid) {
ownership.release(towerUuid);
}
/**
* Can this player place, upgrade, sell, or choose a path for this tower?
* Returns {false} if the player isn't even on this team.
*/
public InteractResult checkInteract(UUID towerUuid, UUID playerUuid,
InteractType type) {
if (!hasMember(playerUuid)) return InteractResult.WRONG_TEAM;
return switch (type) {
case PLACE -> InteractResult.ALLOWED; // validation is offloaded
case SELL, UPGRADE_FREE ->
ownership.canFullyInteract(towerUuid, playerUuid)
? InteractResult.ALLOWED
: InteractResult.NOT_OWNER;
case UPGRADE_EXISTING_PATH ->
InteractResult.ALLOWED; // always allowed for teammates
case CHOOSE_PATH ->
ownership.canChoosePath(towerUuid, playerUuid)
? InteractResult.ALLOWED
: InteractResult.NOT_OWNER;
};
}
public void onPlayerLeft(UUID player) {
ownership.playerLeft(player);
}
public void onPlayerRejoined(UUID player) {
ownership.playerRejoined(player);
}
public int getCastleHp() { return castleHp; }
public void setCastleHp(int h) { this.castleHp = h; }
public void damageCastle(int d){ this.castleHp = Math.max(0, castleHp - d); }
public boolean isCastleAlive() { return castleHp > 0; }
public TeamColor color() { return color; }
public enum InteractType {
PLACE,
UPGRADE_EXISTING_PATH,
UPGRADE_FREE, // upgrade at a split point where path must be chosen
CHOOSE_PATH,
SELL
}
public enum InteractResult {
ALLOWED,
WRONG_TEAM, // player is on a different team entirely
NOT_OWNER // player is a teammate but doesn't own it yet (grace period)
}
}Editor is loading...
Leave a Comment