Skip to content

Commit

Permalink
refactor: use PlayersState
Browse files Browse the repository at this point in the history
  • Loading branch information
stephtelolahy committed Jun 29, 2024
1 parent 4d2e149 commit 5130113
Show file tree
Hide file tree
Showing 12 changed files with 56 additions and 74 deletions.
49 changes: 0 additions & 49 deletions WildWestOnline/Core/Game/Sources/PlayersState.swift
Original file line number Diff line number Diff line change
Expand Up @@ -57,52 +57,3 @@ private extension PlayersState {
return state
}
}

public extension PlayersState {
class Builder {
private var players: [String: PlayersState.Player] = [:]

public func build() -> PlayersState {
.init(players: players)
}

public func withPlayer(_ id: String, builderFunc: (PlayersState.Player.Builder) -> PlayersState.Player.Builder) -> Self {
let builder = PlayersState.Player.makeBuilder()
let player = builderFunc(builder).build()
players[id] = player
return self
}
}

static func makeBuilder() -> Builder {
Builder()
}
}

public extension PlayersState.Player {
class Builder {
private var maxHealth: Int = 0
private var health: Int = 0

public func build() -> PlayersState.Player {
.init(
maxHealth: maxHealth,
health: health
)
}

public func withHealth(_ value: Int) -> Self {
health = value
return self
}

public func withMaxHealth(_ value: Int) -> Self {
maxHealth = value
return self
}
}

static func makeBuilder() -> Builder {
Builder()
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,13 @@ struct PlayerDamaged: ArgPlayerResolver {
func resolve(state: GameState, ctx: EffectContext) throws -> PlayerArgOutput {
let damaged = state.playOrder
.starting(with: ctx.sourceActor)
.filter { state.player($0).isDamaged }
.filter { state.playerState($0).isDamaged }
return .identified(damaged)
}
}

private extension PlayersState.Player {
var isDamaged: Bool {
health < maxHealth
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ struct OnDamage: PlayReqMatcher {
func match(state: GameState, ctx: PlayReqContext) -> Bool {
if case let .damage(_, player) = ctx.event,
player == ctx.actor,
state.player(player).health > 0 {
state.playerState(player).health > 0 {
true
} else {
false
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ struct OnDamageLethal: PlayReqMatcher {
func match(state: GameState, ctx: PlayReqContext) -> Bool {
if case let .damage(_, player) = ctx.event,
player == ctx.actor,
state.player(player).health <= 0 {
state.playerState(player).health <= 0 {
true
} else {
false
Expand Down
8 changes: 7 additions & 1 deletion WildWestOnline/Core/Game/Sources/Setup/Setup.swift
Original file line number Diff line number Diff line change
Expand Up @@ -42,13 +42,20 @@ public enum Setup {
}

var playerDictionary: [String: Player] = [:]
var playerStateDictionary: [String: PlayersState.Player] = [:]
var playOrder: [String] = []

for player in players {
playerDictionary[player.id] = player
let health = player.attributes[.maxHealth] ?? 0
playerStateDictionary[player.id] = .init(maxHealth: health, health: health)
playOrder.append(player.id)
}

let playersState = PlayersState(players: playerStateDictionary)

return GameState(
playersState: playersState,
players: playerDictionary,
playOrder: playOrder,
startOrder: playOrder,
Expand Down Expand Up @@ -106,7 +113,6 @@ private extension Setup {
figure: figure,
abilities: abilities,
attributes: figureObj.attributes,
health: health,
hand: hand,
inPlay: []
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@

public extension GameState {
class Builder {
private var playersStateBuilder: PlayersState.Builder = .init()
private var playersDictionary: [String: PlayersState.Player] = [:]
private var players: [String: Player] = [:]
private var playOrder: [String] = []
private var turn: String?
Expand All @@ -26,7 +26,7 @@ public extension GameState {

public func build() -> GameState {
.init(
playersState: playersStateBuilder.build(),
playersState: .init(players: playersDictionary),
players: players,
playOrder: playOrder,
startOrder: playOrder,
Expand All @@ -46,11 +46,6 @@ public extension GameState {
)
}

public func withPlayersState(_ builderFunc: (PlayersState.Builder) -> PlayersState.Builder) -> Self {
_ = builderFunc(playersStateBuilder)
return self
}

public func withTurn(_ value: String) -> Self {
turn = value
return self
Expand Down Expand Up @@ -113,9 +108,10 @@ public extension GameState {

public func withPlayer(_ id: String, builderFunc: (Player.Builder) -> Player.Builder = { $0 }) -> Self {
let builder = Player.makeBuilder().withId(id)
let player = builderFunc(builder).build()
players[player.id] = player
playOrder.append(player.id)
_ = builderFunc(builder)
players[id] = builder.build()
playersDictionary[id] = builder.buildState()
playOrder.append(id)
return self
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@ public extension Player {
private var attributes: [String: Int] = [:]
private var hand: [String] = []
private var inPlay: [String] = []
private var maxHealth: Int = 0
private var health: Int = 0

public func build() -> Player {
.init(
Expand All @@ -27,6 +29,13 @@ public extension Player {
)
}

public func buildState() -> PlayersState.Player {
.init(
maxHealth: maxHealth,
health: health
)
}

public func withId(_ value: String) -> Self {
id = value
return self
Expand Down Expand Up @@ -56,6 +65,16 @@ public extension Player {
inPlay = value
return self
}

public func withHealth(_ value: Int) -> Self {
health = value
return self
}

public func withMaxHealth(_ value: Int) -> Self {
maxHealth = value
return self
}
}

static func makeBuilder() -> Builder {
Expand Down
4 changes: 4 additions & 0 deletions WildWestOnline/Core/Game/Sources/State/GameState.swift
Original file line number Diff line number Diff line change
Expand Up @@ -69,4 +69,8 @@ public extension GameState {
}
return player
}

func playerState(_ id: String) -> PlayersState.Player {
playersState.players.get(id)
}
}
4 changes: 2 additions & 2 deletions WildWestOnline/Core/Game/Tests/DSL/GameTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -152,13 +152,13 @@ final class GameTests: XCTestCase {
XCTAssertEqual(state.playOrder, ["p1", "p2"])

XCTAssertNotNil(state.players["p1"])
XCTAssertEqual(state.player("p1").health, 3)
XCTAssertEqual(state.playerState("p1").health, 3)
XCTAssertEqual(state.player("p1").attributes, [:])
XCTAssertEqual(state.player("p1").hand, [])
XCTAssertEqual(state.player("p1").inPlay, [])

XCTAssertNotNil(state.players["p2"])
XCTAssertEqual(state.player("p2").health, 4)
XCTAssertEqual(state.playerState("p2").health, 4)
XCTAssertEqual(state.player("p2").attributes[.weapon], 2)
XCTAssertEqual(state.player("p2").abilities, ["a1"])
XCTAssertEqual(state.player("p2").hand, ["c21", "c22"])
Expand Down
4 changes: 2 additions & 2 deletions WildWestOnline/Core/Game/Tests/Mechanics/DamageTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ final class DamageTests: XCTestCase {
let result = GameState.reducer(state, action)

// Then
XCTAssertEqual(result.player("p1").health, 1)
XCTAssertEqual(result.playerState("p1").health, 1)
}

func test_damage_with2LifePoints_shouldReduceHealthBy2() {
Expand All @@ -38,6 +38,6 @@ final class DamageTests: XCTestCase {
let result = GameState.reducer(state, action)

// Then
XCTAssertEqual(result.player("p1").health, 0)
XCTAssertEqual(result.playerState("p1").health, 0)
}
}
10 changes: 5 additions & 5 deletions WildWestOnline/Core/Game/Tests/Mechanics/HealTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ final class HealTests: XCTestCase {
GameState.makeBuilder()
.withPlayer("p1") {
$0.withHealth(2)
.withAttributes([.maxHealth: 4])
.withMaxHealth(4)
}
.build()
}
Expand All @@ -24,7 +24,7 @@ final class HealTests: XCTestCase {
let result = GameState.reducer(state, action)

// Then
XCTAssertEqual(result.player("p1").health, 3)
XCTAssertEqual(result.playerState("p1").health, 3)
}

func test_heal_beingDamaged_amountEqualDamage_shouldGainLifePoints() {
Expand All @@ -33,16 +33,16 @@ final class HealTests: XCTestCase {
let result = GameState.reducer(state, action)

// Then
XCTAssertEqual(result.player("p1").health, 4)
XCTAssertEqual(result.playerState("p1").health, 4)
}

func test_heal_beingDamaged_amountGreaterThanDamage_shouldGainLifePointsLimitedToMaxHealth() {
// When
let action = GameAction.heal(2, player: "p1")
let action = GameAction.heal(3, player: "p1")
let result = GameState.reducer(state, action)

// Then
XCTAssertEqual(result.player("p1").health, 4)
XCTAssertEqual(result.playerState("p1").health, 4)
}

func test_heal_alreadyMaxHealth_shouldThrowError() {
Expand Down
4 changes: 2 additions & 2 deletions WildWestOnline/Core/Game/Tests/Setup/SetupTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -49,8 +49,8 @@ final class SetupTests: XCTestCase {
XCTAssertTrue(state.startOrder.contains(["p1", "p2"]))

// should set players to max health
XCTAssertEqual(state.player("p1").health, 4)
XCTAssertEqual(state.player("p2").health, 3)
XCTAssertEqual(state.playerState("p1").health, 4)
XCTAssertEqual(state.playerState("p2").health, 3)

// should set players hand cards to health
XCTAssertEqual(state.player("p1").hand.count, 4)
Expand Down

0 comments on commit 5130113

Please sign in to comment.