From 890d43edca622b245005622bcb47c0e4f5c46d69 Mon Sep 17 00:00:00 2001 From: Marcel Schwarz Date: Thu, 25 Jun 2020 17:23:51 +0200 Subject: [PATCH 1/3] Report scores to multiple leaderboards --- GoldWars/GoldWars/EloHelper.swift | 30 ++++++++++++++--------- GoldWars/GoldWars/GameCenterManager.swift | 6 +---- 2 files changed, 19 insertions(+), 17 deletions(-) diff --git a/GoldWars/GoldWars/EloHelper.swift b/GoldWars/GoldWars/EloHelper.swift index 0b08cde..ff1d543 100644 --- a/GoldWars/GoldWars/EloHelper.swift +++ b/GoldWars/GoldWars/EloHelper.swift @@ -17,18 +17,19 @@ class EloHelper { static private let LOG = OSLog.init(subsystem: "EloHelper", category: "EloHelper") - static let IDENTIFIER = "de.hft.stuttgart.ip2.goldwars.matchmaking" + static let IDENTIFIER_ALL_ELO = "de.hft.stuttgart.ip2.goldwars.leaderboard" + static let IDENTIFIER_ELO = "de.hft.stuttgart.ip2.goldwars.matchmaking" static func updateEloScore(winner: GKPlayer, hatDenNikoGemacht looser: GKPlayer) { let leaderboard = GKLeaderboard.init(players: [winner, looser]) - leaderboard.identifier = EloHelper.IDENTIFIER + leaderboard.identifier = EloHelper.IDENTIFIER_ELO leaderboard.loadScores{scores, error in // Get Scores - let R_looser = scores?.filter { $0.player == looser }.first ?? GKScore(leaderboardIdentifier: EloHelper.IDENTIFIER, player: looser) - let R_winner = scores?.filter { $0.player == winner }.first ?? GKScore(leaderboardIdentifier: EloHelper.IDENTIFIER, player: winner) + let R_looser = scores?.filter { $0.player == looser }.first ?? GKScore(leaderboardIdentifier: EloHelper.IDENTIFIER_ELO, player: looser) + let R_winner = scores?.filter { $0.player == winner }.first ?? GKScore(leaderboardIdentifier: EloHelper.IDENTIFIER_ELO, player: winner) // Calc ELO let Q_looser = pow(10.0, Double(R_looser.value) / 400.0) @@ -40,21 +41,26 @@ class EloHelper { let R_looser_new = Int64(Double(R_looser.value) + 10.0 * (0.0 - E_looser)) // Update Elo on leaderboard - let winner_new = GKScore(leaderboardIdentifier: EloHelper.IDENTIFIER, player: winner) + let winner_new = GKScore(leaderboardIdentifier: EloHelper.IDENTIFIER_ELO, player: winner) winner_new.value = R_winner_new - let looser_new = GKScore(leaderboardIdentifier: EloHelper.IDENTIFIER, player: looser) + let looser_new = GKScore(leaderboardIdentifier: EloHelper.IDENTIFIER_ELO, player: looser) looser_new.value = R_looser_new let scoreForPeer = winner == GameCenterManager.sharedInstance.localPlayer ? looser_new : winner_new let scoreForHost = winner == GameCenterManager.sharedInstance.localPlayer ? winner_new : looser_new MultiplayerNetwork.sharedInstance.sendEloData(scoreToReport: scoreForPeer) - - GKScore.report([scoreForHost], withCompletionHandler: { error in - os_log("New Scores reported to EloSystem", log: LOG, type: .info) - }) - + reportScore(score: scoreForHost.value) } - + } + + static func reportScore(score: Int64) { + let gkScoreElo = GKScore(leaderboardIdentifier: EloHelper.IDENTIFIER_ELO, player: GameCenterManager.sharedInstance.localPlayer) + gkScoreElo.value = score + let gkScoreAll = GKScore(leaderboardIdentifier: EloHelper.IDENTIFIER_ALL_ELO, player: GameCenterManager.sharedInstance.localPlayer) + gkScoreAll.value = score + GKScore.report([gkScoreAll, gkScoreElo], withCompletionHandler: { error in + os_log("New Scores reported to EloSystem", log: self.LOG, type: .info) + }) } } diff --git a/GoldWars/GoldWars/GameCenterManager.swift b/GoldWars/GoldWars/GameCenterManager.swift index 0b7a26e..fbf0c8d 100644 --- a/GoldWars/GoldWars/GameCenterManager.swift +++ b/GoldWars/GoldWars/GameCenterManager.swift @@ -213,11 +213,7 @@ final class GameCenterManager: NSObject, GKMatchmakerViewControllerDelegate, GKG if let eloData = try? jsonDecoder.decode(EloDataForPeer.self, from: data) { print("Recieved elo data: \(eloData.scoreToReport)") - let score = GKScore(leaderboardIdentifier: EloHelper.IDENTIFIER, player: self.localPlayer) - score.value = eloData.scoreToReport - GKScore.report([score], withCompletionHandler: { error in - os_log("New Scores reported to EloSystem", log: self.LOG, type: .info) - }) + EloHelper.reportScore(score: eloData.scoreToReport) } if let heartbeat = try? jsonDecoder.decode(Heartbeat.self, from: data) { entityManager.getHUD()?.roundTimer.isHeartbeatLocked = false From 2d00bc363a80a1c71c09ce3930e3ba593a27700f Mon Sep 17 00:00:00 2001 From: Marcel Schwarz Date: Thu, 25 Jun 2020 17:59:05 +0200 Subject: [PATCH 2/3] New leaderboard for best elo --- GoldWars/GoldWars/EloHelper.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/GoldWars/GoldWars/EloHelper.swift b/GoldWars/GoldWars/EloHelper.swift index ff1d543..7620a75 100644 --- a/GoldWars/GoldWars/EloHelper.swift +++ b/GoldWars/GoldWars/EloHelper.swift @@ -17,7 +17,7 @@ class EloHelper { static private let LOG = OSLog.init(subsystem: "EloHelper", category: "EloHelper") - static let IDENTIFIER_ALL_ELO = "de.hft.stuttgart.ip2.goldwars.leaderboard" + static let IDENTIFIER_ALL_ELO = "de.hft.stuttgart.ip2.goldwars.bestelo" static let IDENTIFIER_ELO = "de.hft.stuttgart.ip2.goldwars.matchmaking" static func updateEloScore(winner: GKPlayer, hatDenNikoGemacht looser: GKPlayer) { From 43e474467b42f5e7c9b233380ef7729d79add4cb Mon Sep 17 00:00:00 2001 From: Marcel Schwarz Date: Thu, 25 Jun 2020 18:22:17 +0200 Subject: [PATCH 3/3] Introduce error logging for elo system --- GoldWars/GoldWars/EloHelper.swift | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/GoldWars/GoldWars/EloHelper.swift b/GoldWars/GoldWars/EloHelper.swift index 7620a75..35d7287 100644 --- a/GoldWars/GoldWars/EloHelper.swift +++ b/GoldWars/GoldWars/EloHelper.swift @@ -55,12 +55,16 @@ class EloHelper { } static func reportScore(score: Int64) { - let gkScoreElo = GKScore(leaderboardIdentifier: EloHelper.IDENTIFIER_ELO, player: GameCenterManager.sharedInstance.localPlayer) + let gkScoreElo = GKScore(leaderboardIdentifier: EloHelper.IDENTIFIER_ELO, player: GKLocalPlayer.local) gkScoreElo.value = score - let gkScoreAll = GKScore(leaderboardIdentifier: EloHelper.IDENTIFIER_ALL_ELO, player: GameCenterManager.sharedInstance.localPlayer) + let gkScoreAll = GKScore(leaderboardIdentifier: EloHelper.IDENTIFIER_ALL_ELO, player: GKLocalPlayer.local) gkScoreAll.value = score GKScore.report([gkScoreAll, gkScoreElo], withCompletionHandler: { error in - os_log("New Scores reported to EloSystem", log: self.LOG, type: .info) + if error != nil { + os_log("Could not report %@", log: LOG, type: .error, error!.localizedDescription) + } else { + os_log("New Scores reported to EloSystem", log: self.LOG, type: .info) + } }) } }