From b04bbe5036cc0953b5a893c46aa32ea5d6f2f81f Mon Sep 17 00:00:00 2001 From: Aldin Duraki Date: Tue, 19 May 2020 02:21:41 +0200 Subject: [PATCH] * Fixed TeamComponent when updating Entities * Minor refactor --- .../GoldWars/Components/TeamComponent.swift | 4 +- GoldWars/GoldWars/DataService.swift | 10 +-- .../GoldWars/Entities/EntityManager.swift | 70 +++++++++++-------- .../GoldWars/RoundCalculatorService.swift | 17 ++--- GoldWars/GoldWars/Scenes/GameScene.swift | 2 +- 5 files changed, 52 insertions(+), 51 deletions(-) diff --git a/GoldWars/GoldWars/Components/TeamComponent.swift b/GoldWars/GoldWars/Components/TeamComponent.swift index 2369f7b..db67deb 100644 --- a/GoldWars/GoldWars/Components/TeamComponent.swift +++ b/GoldWars/GoldWars/Components/TeamComponent.swift @@ -11,9 +11,9 @@ import GameplayKit import GameKit class TeamComponent: GKComponent { - let team: Team + var team: Team + var player: GKPlayer let fire: SKEmitterNode - let player: GKPlayer init(team: Team, player: GKPlayer, position: CGPoint) { fire = SKEmitterNode(fileNamed: "Fire")! diff --git a/GoldWars/GoldWars/DataService.swift b/GoldWars/GoldWars/DataService.swift index 452e65f..e06dff6 100644 --- a/GoldWars/GoldWars/DataService.swift +++ b/GoldWars/GoldWars/DataService.swift @@ -18,11 +18,7 @@ struct Host: Codable { class SnapshotModel: Codable { var baseEntites: [BaseEntityModel] -// -// init() { -// self.baseEntites = [] -// } -// + init(baseEntites: [BaseEntityModel]) { self.baseEntites = baseEntites } @@ -47,8 +43,6 @@ class DataService { var snapshotModel: SnapshotModel? var gameHost: Host? - - // TODO: Update entries to merge equal moves func addMove(playerMove: PlayerMove) { var equalMove = localPlayerMoves.filter { (ele) -> Bool in ele.fromBase == playerMove.fromBase && ele.toBase == playerMove.toBase @@ -72,7 +66,7 @@ class DataService { self.gameHost = host } - func safeSnapshot(snapshotModel: SnapshotModel) { + func setSnapshotModel(snapshotModel: SnapshotModel) { self.snapshotModel = snapshotModel } } diff --git a/GoldWars/GoldWars/Entities/EntityManager.swift b/GoldWars/GoldWars/Entities/EntityManager.swift index 9ebfc7a..82b37d9 100644 --- a/GoldWars/GoldWars/Entities/EntityManager.swift +++ b/GoldWars/GoldWars/Entities/EntityManager.swift @@ -102,25 +102,30 @@ class EntityManager { } entities.remove(entity) } - + func update(_ entities: [GKEntity]){ for entity in entities { self.entities.update(with: entity) let base = (entity as! Base) - + if base.changeOwnership { - base.addComponent(TeamComponent( - team: (entities[0] as! Base).component(ofType: TeamComponent.self)!.team, - player: (entities[0] as! Base).component(ofType: TeamComponent.self)!.player, - position: (base.component(ofType: DefaultBaseComponent.self)?.spriteNode.position)! + if let component = entity.component(ofType: TeamComponent.self) { + component.player = entities[0].component(ofType: TeamComponent.self)!.player + component.team = entities[0].component(ofType: TeamComponent.self)!.team + } else { + base.addComponent(TeamComponent( + team: (entities[0] as! Base).component(ofType: TeamComponent.self)!.team, + player: (entities[0] as! Base).component(ofType: TeamComponent.self)!.player, + position: (base.component(ofType: DefaultBaseComponent.self)?.spriteNode.position)! + ) ) - ) + } base.changeOwnership = false scene.addChild(base.component(ofType: TeamComponent.self)!.fire) } } } - + func updateSnapshotModel(snapshotModel: SnapshotModel) { let bases = entities.filter{$0 is Base} for entity in bases{ @@ -137,14 +142,21 @@ class EntityManager { if getOwnerBySnapBase != nil { base.changeOwnership = true base.ownershipPlayer = getOwnerBySnapBase - entity.addComponent(TeamComponent( + if let component = entity.component(ofType: TeamComponent.self) { + component.player = getOwnerBySnapBase! + component.team = getTeamByPlayer(playerName: snapBase.ownership!) + } else { + entity.addComponent(TeamComponent( team: getTeamByPlayer(playerName: snapBase.ownership!), player: getOwnerBySnapBase!, position: (entity.component(ofType: DefaultBaseComponent.self)?.spriteNode.position)! + ) ) - ) - print(entity) - print(getTeamByBase(base: base)) + if let fire = entity.component(ofType: TeamComponent.self)?.fire{ + scene.addChild(fire) + } + } + } print("nach updateSnap -> Entity \(base)") @@ -166,7 +178,7 @@ class EntityManager { } return nil } - + func getBaseByTeam(for team: Team) -> GKEntity? { for entity in entities { if let teamComponent = entity.component(ofType: TeamComponent.self), @@ -178,15 +190,15 @@ class EntityManager { } return nil } - + func getBasesByTeam(for team: Team) -> Set { return entities.filter{$0 is Base && ($0 as! Base).component(ofType: TeamComponent.self)?.team == team } as! Set } - + func getBasesByPlayer(for player: GKPlayer) -> Set { return entities.filter{$0 is Base && ($0 as! Base).component(ofType: TeamComponent.self)?.player == player } as! Set } - + func getTeamByBase(base: Base) -> Team? { for entity in entities { if entity is Base && entity == base{ @@ -203,24 +215,24 @@ class EntityManager { func getTeamByPlayer(playerName: String) -> Team { return entities.filter { $0 is Base && ($0 as! Base).component(ofType: TeamComponent.self)?.player.displayName == playerName }[0].component(ofType: TeamComponent.self)!.team } - - func getBasebyID(id: Int) -> Base?{ - for entity in entities { - if entity is Base && (entity as! Base).baseID == id { - return (entity as! Base) - } - } - return nil - } - - func getBackground() -> GKEntity? { + + func getBasebyID(id: Int) -> Base?{ + for entity in entities { + if entity is Base && (entity as! Base).baseID == id { + return (entity as! Base) + } + } + return nil + } + + func getBackground() -> GKEntity? { return entities.filter{$0 is Background}[0] } - + func getBaseNodeByTeam(for team: Team) -> SKSpriteNode? { return getBaseByTeam(for: team)?.component(ofType: DefaultBaseComponent.self)?.spriteNode } - + func getButtonByName(buttonName:String) -> Button { return entities.filter{$0 is Button && ($0 as! Button).name == buttonName }[0] as! Button } diff --git a/GoldWars/GoldWars/RoundCalculatorService.swift b/GoldWars/GoldWars/RoundCalculatorService.swift index b8fde43..72e31a2 100644 --- a/GoldWars/GoldWars/RoundCalculatorService.swift +++ b/GoldWars/GoldWars/RoundCalculatorService.swift @@ -30,7 +30,6 @@ class RoundCalculatorServie { } addPlayerMove(playerName: GKLocalPlayer.local.displayName, playerMoves: DataService.sharedInstance.localPlayerMoves) - print("allPlayerMoves -> \(allPlayerMoves)") for entry in allPlayerMoves { for move in entry.value { mapPlayerMoveToAttackedBase(playerName: entry.key, playerMove: move) @@ -38,16 +37,17 @@ class RoundCalculatorServie { } // TODO-END: + + // TODO: Refactor -> O(n*3n^2) to maybe O(n*3n) + // We might not need to map and iterate over toBase for (key, value) in baseSpecificMoves { let baseId = key var playerMovesByBase = value - let targetBase = currentSnapshotModel?.baseEntites.filter { $0.baseId == baseId }[0] let possiblyOwnershipMoves = playerMovesByBase.filter { $0.key == targetBase?.ownership} - // spieler verschiebt einheiten beim schieben for (playerName, playerMove) in possiblyOwnershipMoves { - for var base in currentSnapshotModel!.baseEntites { + for base in currentSnapshotModel!.baseEntites { if base.baseId == playerMove.fromBase { base.unitCount -= playerMove.unitCount } @@ -59,14 +59,13 @@ class RoundCalculatorServie { } for (_, playerMove) in playerMovesByBase { - for var base in currentSnapshotModel!.baseEntites { + for base in currentSnapshotModel!.baseEntites { if base.baseId == playerMove.fromBase { base.unitCount -= playerMove.unitCount } } } - let sorted = playerMovesByBase.sorted { (e1: (key: String, value: PlayerMove), e2: (key: String, value: PlayerMove)) -> Bool in e1.value.unitCount > e2.value.unitCount } @@ -75,10 +74,9 @@ class RoundCalculatorServie { if sorted.count == 2 { let secMax = sorted[1] max.value.unitCount -= secMax.value.unitCount - } - for var base in currentSnapshotModel!.baseEntites { + for base in currentSnapshotModel!.baseEntites { if base.baseId == max.value.toBase { base.unitCount += max.value.unitCount if max.value.unitCount == 0 { @@ -89,11 +87,8 @@ class RoundCalculatorServie { } } - baseSpecificMoves.removeValue(forKey: baseId) } - - print(currentSnapshotModel) MultiplayerNetwork.sharedInstance.sendSnapshotModelToPlayers() EntityManager.sharedInstance.updateSnapshotModel(snapshotModel: currentSnapshotModel!) let calcTime = CFAbsoluteTimeGetCurrent() - startTime diff --git a/GoldWars/GoldWars/Scenes/GameScene.swift b/GoldWars/GoldWars/Scenes/GameScene.swift index a6934bd..913d41a 100644 --- a/GoldWars/GoldWars/Scenes/GameScene.swift +++ b/GoldWars/GoldWars/Scenes/GameScene.swift @@ -25,7 +25,7 @@ class GameScene: SKScene{ func initMap() { MapFactory(scene: self, entityManager: EntityManager.sharedInstance).loadMap(playerCount: 2) - DataService.sharedInstance.safeSnapshot(snapshotModel: EntityManager.sharedInstance.getSnapshotModel()) + DataService.sharedInstance.setSnapshotModel(snapshotModel: EntityManager.sharedInstance.getSnapshotModel()) } override func touchesEnded(_ touches: Set, with event: UIEvent?) {