Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
104 changes: 53 additions & 51 deletions src/main/java/sc2002/turnbased/report/ActionEvent.java
Original file line number Diff line number Diff line change
Expand Up @@ -7,65 +7,67 @@
import sc2002.turnbased.domain.Combatant;
import sc2002.turnbased.domain.CombatantId;

public class ActionEvent implements BattleEvent {
private final CombatantId actorId;
private final String actorName;
private final String actionName;
private final CombatantId targetId;
private final String targetName;
private final int hpBefore;
private final int hpAfter;
private final int attackerAttack;
private final int targetDefense;
private final int damage;
private final boolean targetEliminated;
private final List<String> statusEffectNotes;

public ActionEvent(
CombatantId actorId,
String actorName,
String actionName,
CombatantId targetId,
String targetName,
int hpBefore,
int hpAfter,
int attackerAttack,
int targetDefense,
int damage,
boolean targetEliminated,
List<String> statusEffectNotes
) {
this.actorId = Objects.requireNonNull(actorId, "actorId");
this.actorName = actorName;
this.actionName = actionName;
this.targetId = Objects.requireNonNull(targetId, "targetId");
this.targetName = targetName;
this.hpBefore = hpBefore;
this.hpAfter = hpAfter;
this.attackerAttack = attackerAttack;
this.targetDefense = targetDefense;
this.damage = damage;
this.targetEliminated = targetEliminated;
this.statusEffectNotes = List.copyOf(Objects.requireNonNull(statusEffectNotes, "statusEffectNotes"));
public record ActionEvent(
CombatantId actorId,
String actorName,
String actionName,
CombatantId targetId,
String targetName,
int hpBefore,
int hpAfter,
int attackerAttack,
int targetDefense,
int damage,
boolean targetEliminated,
List<String> statusEffectNotes
) implements BattleEvent {
public ActionEvent {
actorId = Objects.requireNonNull(actorId, "actorId");
actorName = Objects.requireNonNull(actorName, "actorName");
actionName = Objects.requireNonNull(actionName, "actionName");
targetId = Objects.requireNonNull(targetId, "targetId");
targetName = Objects.requireNonNull(targetName, "targetName");
statusEffectNotes = List.copyOf(Objects.requireNonNull(statusEffectNotes, "statusEffectNotes"));
}

public ActionEvent(Combatant actor, String actionName, Combatant target, AttackResolution attackResolution) {
this(
actor.combatantId(),
actor.getName(),
requireActor(actor).combatantId(),
requireCombatantName(actor, "actor"),
actionName,
target.combatantId(),
target.getName(),
attackResolution.hpBefore(),
attackResolution.hpAfter(),
attackResolution.attackUsed(),
attackResolution.targetDefense(),
attackResolution.damage(),
attackResolution.targetEliminated(),
StatusEffectReportMapper.toNotes(attackResolution.statusEffectOutcomes())
requireTarget(target).combatantId(),
requireCombatantName(target, "target"),
requireAttackResolution(attackResolution).hpBefore(),
requireAttackResolution(attackResolution).hpAfter(),
requireAttackResolution(attackResolution).attackUsed(),
requireAttackResolution(attackResolution).targetDefense(),
requireAttackResolution(attackResolution).damage(),
requireAttackResolution(attackResolution).targetEliminated(),
StatusEffectReportMapper.toNotes(requireAttackResolution(attackResolution).statusEffectOutcomes())
);
}

private static Combatant requireActor(Combatant actor) {
return Objects.requireNonNull(actor, "actor");
}

private static Combatant requireTarget(Combatant target) {
return Objects.requireNonNull(target, "target");
}

private static AttackResolution requireAttackResolution(AttackResolution attackResolution) {
return Objects.requireNonNull(attackResolution, "attackResolution");
}

private static String requireCombatantName(Combatant combatant, String role) {
return Objects.requireNonNull(Objects.requireNonNull(combatant, role).getName(), role + ".name");
}

@Override
public <T> T visit(Visitor<T> visitor) {
return visitor.onAction(this);
}

public CombatantId getActorId() {
return actorId;
}
Expand Down
15 changes: 15 additions & 0 deletions src/main/java/sc2002/turnbased/report/BattleEvent.java
Original file line number Diff line number Diff line change
@@ -1,4 +1,19 @@
package sc2002.turnbased.report;

public interface BattleEvent {
<T> T visit(Visitor<T> visitor);

interface Visitor<T> {
T onAction(ActionEvent actionEvent);

T onNarration(NarrationEvent narrationEvent);

T onRoundStart(RoundStartEvent roundStartEvent);

T onRoundSummary(RoundSummaryEvent roundSummaryEvent);

T onSkippedTurn(SkippedTurnEvent skippedTurnEvent);

T onStatusEffectReport(StatusEffectReportEvent statusEffectReportEvent);
}
}
47 changes: 16 additions & 31 deletions src/main/java/sc2002/turnbased/report/CombatantSummary.java
Original file line number Diff line number Diff line change
@@ -1,39 +1,24 @@
package sc2002.turnbased.report;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Objects;

import sc2002.turnbased.domain.CombatantId;

public class CombatantSummary {
private final CombatantId combatantId;
private final String name;
private final int currentHp;
private final int maxHp;
private final int currentAttack;
private final int baseAttack;
private final boolean alive;
private final List<String> activeStatuses;

public CombatantSummary(
CombatantId combatantId,
String name,
int currentHp,
int maxHp,
int currentAttack,
int baseAttack,
boolean alive,
List<String> activeStatuses
) {
this.combatantId = combatantId;
this.name = name;
this.currentHp = currentHp;
this.maxHp = maxHp;
this.currentAttack = currentAttack;
this.baseAttack = baseAttack;
this.alive = alive;
this.activeStatuses = new ArrayList<>(activeStatuses);
public record CombatantSummary(
CombatantId combatantId,
String name,
int currentHp,
int maxHp,
int currentAttack,
int baseAttack,
boolean alive,
List<String> activeStatuses
) {
public CombatantSummary {
combatantId = Objects.requireNonNull(combatantId, "combatantId");
name = Objects.requireNonNull(name, "name");
activeStatuses = List.copyOf(Objects.requireNonNull(activeStatuses, "activeStatuses"));
}

public CombatantId getCombatantId() {
Expand Down Expand Up @@ -65,6 +50,6 @@ public boolean isAlive() {
}

public List<String> getActiveStatuses() {
return Collections.unmodifiableList(activeStatuses);
return activeStatuses;
}
}
13 changes: 9 additions & 4 deletions src/main/java/sc2002/turnbased/report/NarrationEvent.java
Original file line number Diff line number Diff line change
@@ -1,10 +1,15 @@
package sc2002.turnbased.report;

public class NarrationEvent implements BattleEvent {
private final String text;
import java.util.Objects;

public NarrationEvent(String text) {
this.text = text;
public record NarrationEvent(String text) implements BattleEvent {
public NarrationEvent {
text = Objects.requireNonNull(text, "text");
}

@Override
public <T> T visit(Visitor<T> visitor) {
return visitor.onNarration(this);
}

public String getText() {
Expand Down
9 changes: 4 additions & 5 deletions src/main/java/sc2002/turnbased/report/RoundStartEvent.java
Original file line number Diff line number Diff line change
@@ -1,10 +1,9 @@
package sc2002.turnbased.report;

public class RoundStartEvent implements BattleEvent {
private final int roundNumber;

public RoundStartEvent(int roundNumber) {
this.roundNumber = roundNumber;
public record RoundStartEvent(int roundNumber) implements BattleEvent {
@Override
public <T> T visit(Visitor<T> visitor) {
return visitor.onRoundStart(this);
}

public int getRoundNumber() {
Expand Down
44 changes: 22 additions & 22 deletions src/main/java/sc2002/turnbased/report/RoundSummaryEvent.java
Original file line number Diff line number Diff line change
@@ -1,31 +1,31 @@
package sc2002.turnbased.report;

import java.util.ArrayList;
import java.util.Collections;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;

import sc2002.turnbased.domain.ItemType;

public class RoundSummaryEvent implements BattleEvent {
private final int roundNumber;
private final CombatantSummary playerSummary;
private final List<CombatantSummary> enemySummaries;
private final Map<ItemType, Integer> inventorySnapshot;
private final int specialSkillCooldown;

public RoundSummaryEvent(
int roundNumber,
CombatantSummary playerSummary,
List<CombatantSummary> enemySummaries,
Map<ItemType, Integer> inventorySnapshot,
int specialSkillCooldown
) {
this.roundNumber = roundNumber;
this.playerSummary = playerSummary;
this.enemySummaries = new ArrayList<>(enemySummaries);
this.inventorySnapshot = inventorySnapshot;
this.specialSkillCooldown = specialSkillCooldown;
public record RoundSummaryEvent(
int roundNumber,
CombatantSummary playerSummary,
List<CombatantSummary> enemySummaries,
Map<ItemType, Integer> inventorySnapshot,
int specialSkillCooldown
) implements BattleEvent {
public RoundSummaryEvent {
playerSummary = Objects.requireNonNull(playerSummary, "playerSummary");
enemySummaries = List.copyOf(Objects.requireNonNull(enemySummaries, "enemySummaries"));
inventorySnapshot = Collections.unmodifiableMap(new LinkedHashMap<>(
Objects.requireNonNull(inventorySnapshot, "inventorySnapshot")
));
}

@Override
public <T> T visit(Visitor<T> visitor) {
return visitor.onRoundSummary(this);
}

public int getRoundNumber() {
Expand All @@ -37,11 +37,11 @@ public CombatantSummary getPlayerSummary() {
}

public List<CombatantSummary> getEnemySummaries() {
return Collections.unmodifiableList(enemySummaries);
return enemySummaries;
}

public Map<ItemType, Integer> getInventorySnapshot() {
return Collections.unmodifiableMap(inventorySnapshot);
return inventorySnapshot;
}

public int getSpecialSkillCooldown() {
Expand Down
27 changes: 16 additions & 11 deletions src/main/java/sc2002/turnbased/report/SkippedTurnEvent.java
Original file line number Diff line number Diff line change
Expand Up @@ -7,17 +7,17 @@
import sc2002.turnbased.domain.CombatantId;
import sc2002.turnbased.domain.status.CombatantStatusOutcome;

public class SkippedTurnEvent implements BattleEvent {
private final CombatantId combatantId;
private final String combatantName;
private final String reason;
private final List<String> statusEffectNotes;

public SkippedTurnEvent(CombatantId combatantId, String combatantName, String reason, List<String> statusEffectNotes) {
this.combatantId = Objects.requireNonNull(combatantId, "combatantId");
this.combatantName = combatantName;
this.reason = reason;
this.statusEffectNotes = List.copyOf(Objects.requireNonNull(statusEffectNotes, "statusEffectNotes"));
public record SkippedTurnEvent(
CombatantId combatantId,
String combatantName,
String reason,
List<String> statusEffectNotes
) implements BattleEvent {
public SkippedTurnEvent {
combatantId = Objects.requireNonNull(combatantId, "combatantId");
combatantName = Objects.requireNonNull(combatantName, "combatantName");
reason = Objects.requireNonNull(reason, "reason");
statusEffectNotes = List.copyOf(Objects.requireNonNull(statusEffectNotes, "statusEffectNotes"));
}

public static SkippedTurnEvent fromStatusEffectOutcomes(
Expand All @@ -34,6 +34,11 @@ public static SkippedTurnEvent fromStatusEffectOutcomes(
);
}

@Override
public <T> T visit(Visitor<T> visitor) {
return visitor.onSkippedTurn(this);
}

public CombatantId getCombatantId() {
return combatantId;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,11 @@ public record StatusEffectReportEvent(List<String> statusEffectNotes) implements
statusEffectNotes = List.copyOf(Objects.requireNonNull(statusEffectNotes, "statusEffectNotes"));
}

@Override
public <T> T visit(Visitor<T> visitor) {
return visitor.onStatusEffectReport(this);
}

public static StatusEffectReportEvent fromStatusEffectOutcomes(List<CombatantStatusOutcome> statusEffectOutcomes) {
return new StatusEffectReportEvent(StatusEffectReportMapper.toNotes(statusEffectOutcomes));
}
Expand Down
Loading
Loading