parent
7ae16d7cc1
commit
595996f639
@ -0,0 +1,73 @@
|
|||||||
|
import Foundation
|
||||||
|
import Connect4Persistance
|
||||||
|
|
||||||
|
class SavedGamesVM: ObservableObject {
|
||||||
|
private var loaded: Bool = false
|
||||||
|
|
||||||
|
@Published
|
||||||
|
var results: [ResultVM] = []
|
||||||
|
|
||||||
|
init() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
func loadData() {
|
||||||
|
if (!loaded) {
|
||||||
|
loaded = true
|
||||||
|
|
||||||
|
Task(priority: .userInitiated) {
|
||||||
|
let results = (try await Persistance.loadGameResults(withName: "savedGames.json", withFolderName: "connect4.games")) ?? []
|
||||||
|
let vms = results.map(ResultVM.init)
|
||||||
|
|
||||||
|
DispatchQueue.main.async {
|
||||||
|
self.results = vms
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class ResultVM: Identifiable {
|
||||||
|
var id: Date { self.date }
|
||||||
|
|
||||||
|
let date: Date
|
||||||
|
let player1: String
|
||||||
|
let player1Type: PlayerType
|
||||||
|
let player2: String
|
||||||
|
let player2Type: PlayerType
|
||||||
|
let rules: RulesType
|
||||||
|
|
||||||
|
init(from: GameResult) {
|
||||||
|
self.date = from.date
|
||||||
|
let p = from.players[0]
|
||||||
|
|
||||||
|
if p.id == .player1 {
|
||||||
|
self.player1 = p.name
|
||||||
|
self.player1Type = Self.i(data: p)
|
||||||
|
self.player2 = p.name
|
||||||
|
self.player2Type = Self.i(data: from.players[1])
|
||||||
|
} else {
|
||||||
|
self.player2 = p.name
|
||||||
|
self.player2Type = Self.i(data: p)
|
||||||
|
self.player1 = p.name
|
||||||
|
self.player1Type = Self.i(data: from.players[1])
|
||||||
|
}
|
||||||
|
|
||||||
|
self.rules = switch (from.rules.type) {
|
||||||
|
case "Connect4Rules": .Classic
|
||||||
|
case "TicTacToeRules": .TicTacToe
|
||||||
|
case "PopOutRules": .PopOut
|
||||||
|
default: fatalError("Unexpected rules type")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static func i(data: PlayerData) -> PlayerType {
|
||||||
|
return switch (data.type) {
|
||||||
|
case "HumanPlayer": .Human
|
||||||
|
case "RandomPlayer": .AIRandom
|
||||||
|
case "FinnishHimPlayer": .AIFinnishHim
|
||||||
|
case "SimpleNegaMaxPlayer": .AISimpleNegaMax
|
||||||
|
default: fatalError("Unexpected player type")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in new issue