From 71f556868fa581c95fb43982354a658d4af45b23 Mon Sep 17 00:00:00 2001 From: Marcel Schwarz Date: Wed, 20 May 2020 18:42:57 +0200 Subject: [PATCH] Allow map to be loaded from predefined model --- GoldWars/GoldWars/Map/MapFactory.swift | 81 +++++++++---------- .../Map/TwoPlayerDefaultTestMap.swift | 2 +- .../GoldWars/Map/TwoPlayerMapGenerator.swift | 49 ++++++++--- GoldWars/GoldWars/Scenes/GameScene.swift | 2 +- 4 files changed, 74 insertions(+), 60 deletions(-) diff --git a/GoldWars/GoldWars/Map/MapFactory.swift b/GoldWars/GoldWars/Map/MapFactory.swift index 0aab86f..fd7dc3c 100644 --- a/GoldWars/GoldWars/Map/MapFactory.swift +++ b/GoldWars/GoldWars/Map/MapFactory.swift @@ -16,7 +16,7 @@ protocol MapProtocol { init(scene: SKScene, entityManager: EntityManager) - func load() + func load(withModel mapModel: MapGenerationModel) } protocol CenterElementProtocol { @@ -38,60 +38,51 @@ protocol CenterElementProtocol { class MapFactory { let LOG = OSLog.init(subsystem: "MapGenerator", category: "MapFactory") - var twoPlayerMaps: [MapProtocol]! - var threePlayerMaps: [MapProtocol]! - var fourPlayerMaps: [MapProtocol]! + var twoPlayerMapGenerator: TwoPlayerMapGenerator init(scene: SKScene, entityManager: EntityManager) { - self.twoPlayerMaps = [ - TwoPlayerMapGenerator(scene: scene, entityManager: entityManager) - ] - - self.threePlayerMaps = [MapProtocol]() - self.fourPlayerMaps = [MapProtocol]() + self.twoPlayerMapGenerator = TwoPlayerMapGenerator(scene: scene, entityManager: entityManager) } - func loadMap(playerCount: Int) { - if playerCount == 2 { - os_log("Loading two player map", log: LOG, type: .info) - twoPlayerMaps.randomElement()?.load() - } else if playerCount == 3 { - os_log("Loading three player map", log: LOG, type: .info) - threePlayerMaps.randomElement()?.load() - } else { - os_log("Loading four player map", log: LOG, type: .info) - fourPlayerMaps.randomElement()?.load() - } + func loadMap() -> MapGenerationModel{ + let mapModel = TwoPlayerMapGenerator.getNewMapModel() + loadMap(fromModel: mapModel) + return mapModel + } + + func loadMap(fromModel model: MapGenerationModel) { + os_log("Loading two player map", log: LOG, type: .info) + twoPlayerMapGenerator.load(withModel: model) } } class CenterElementProvider { static let LOG = OSLog.init(subsystem: "MapGenerator", category: "CenterElementProvider") - static func get(frame: CGRect) -> CenterElementProtocol { - os_log("Getting new center element from provider", log: LOG, type: .info) + static let centerElements: [CenterElementProtocol.Type] = [ + CElement0.self, + CElement1.self, + CElement2.self, + CElement3.self, + CElement4.self, + CElement5.self, + CElement6.self, + CElement7.self, + CElement8.self, + CElement9.self, + CElement10.self, + CElement11.self, + CElement12.self, + CElement13.self, + CElement14.self, + CElement15.self, + CElement16.self, + CElement17.self + ] + + static func get(inFrame frame: CGRect, withId id: Int) -> CenterElementProtocol { + os_log("Getting new predifined center element from provider", log: LOG, type: .info) - let centerElements: [CenterElementProtocol.Type] = [ - CElement1.self, - CElement2.self, - CElement3.self, - CElement4.self, - CElement5.self, - CElement6.self, - CElement7.self, - CElement8.self, - CElement9.self, - CElement10.self, - CElement11.self, - CElement12.self, - CElement13.self, - CElement14.self, - CElement15.self, - CElement16.self, - CElement17.self, - CElement18.self - ] - - return centerElements.randomElement()!.init(frame: frame) + return centerElements[id].init(frame: frame) } } diff --git a/GoldWars/GoldWars/Map/TwoPlayerDefaultTestMap.swift b/GoldWars/GoldWars/Map/TwoPlayerDefaultTestMap.swift index fa20823..5f67cd7 100644 --- a/GoldWars/GoldWars/Map/TwoPlayerDefaultTestMap.swift +++ b/GoldWars/GoldWars/Map/TwoPlayerDefaultTestMap.swift @@ -20,7 +20,7 @@ class TwoPlayerDefaultTestMap: MapProtocol { self.size = scene.size } - func load() { + func load(withModel mapModel: MapGenerationModel) { // Create Bases let basePlayerOne = Base( diff --git a/GoldWars/GoldWars/Map/TwoPlayerMapGenerator.swift b/GoldWars/GoldWars/Map/TwoPlayerMapGenerator.swift index 776dddb..d17add7 100644 --- a/GoldWars/GoldWars/Map/TwoPlayerMapGenerator.swift +++ b/GoldWars/GoldWars/Map/TwoPlayerMapGenerator.swift @@ -11,18 +11,45 @@ import SpriteKit import GameKit import os +struct MapGenerationModel: Codable { + + let numBasesP1: Int + let numBasesP2: Int + let topLeftId: Int + let topRightId: Int + let bottomLeftId: Int + let bottomRightId: Int + +} + class TwoPlayerMapGenerator: MapProtocol { + let LOG = OSLog.init(subsystem: "MapGenerator", category: "TwoPlayerMapGenerator") var size: CGSize! var entityManager: EntityManager! + static func getNewMapModel() -> MapGenerationModel { + + let noOfCElements = CenterElementProvider.centerElements.count + + return MapGenerationModel( + numBasesP1: Int.random(in: 1...3), + numBasesP2: Int.random(in: 1...3), + topLeftId: Int.random(in: 0...noOfCElements), + topRightId: Int.random(in: 0...noOfCElements), + bottomLeftId: Int.random(in: 0...noOfCElements), + bottomRightId: Int.random(in: 0...noOfCElements) + ) + + } + required init(scene: SKScene, entityManager: EntityManager) { self.size = scene.size self.entityManager = entityManager } - func load() { + func load(withModel mapModel: MapGenerationModel) { os_log("Loading from TwoPlayerMapFactory", log: LOG, type: .info) // Generate bases structure @@ -34,16 +61,13 @@ class TwoPlayerMapGenerator: MapProtocol { ) os_log("Get player one's startbases", log: LOG, type: .info) - - let p1StartBaseCount = Int.random(in: 1...3) var p1StartBases = [String: Base]() - var ways = [Way]() - if (p1StartBaseCount == 1) { + if (mapModel.numBasesP1 == 1) { p1StartBases["mid"] = Base(position: CGPoint(x: self.size.width * 0.2, y: self.size.height * 0.5)) ways.append(Way(fromBase: basePlayerOne, toBase: p1StartBases["mid"]!)) - } else if (p1StartBaseCount == 2) { + } else if (mapModel.numBasesP1 == 2) { p1StartBases["top"] = Base(position: CGPoint(x: self.size.width * 0.2, y: self.size.height * 0.333)) p1StartBases["bot"] = Base(position: CGPoint(x: self.size.width * 0.2, y: self.size.height * 0.666)) ways.append(Way(fromBase: basePlayerOne, toBase: p1StartBases["top"]!)) @@ -91,10 +115,10 @@ class TwoPlayerMapGenerator: MapProtocol { height: gridCellHeight ).insetBy(dx: cellInsetX, dy: cellInsetY) - let topLeft = CenterElementProvider.get(frame: gridTopLeft) - let topRight = CenterElementProvider.get(frame: gridTopRight) - let bottomLeft = CenterElementProvider.get(frame: gridBottomLeft) - let bottomRight = CenterElementProvider.get(frame: gridBottomRight) + let topLeft = CenterElementProvider.get(inFrame: gridTopLeft, withId: mapModel.topLeftId) + let topRight = CenterElementProvider.get(inFrame: gridTopRight, withId: mapModel.topRightId) + let bottomLeft = CenterElementProvider.get(inFrame: gridBottomLeft, withId: mapModel.bottomLeftId) + let bottomRight = CenterElementProvider.get(inFrame: gridBottomRight, withId: mapModel.bottomRightId) ways.append(contentsOf: topLeft.getInternalWays()) ways.append(contentsOf: topRight.getInternalWays()) @@ -109,13 +133,12 @@ class TwoPlayerMapGenerator: MapProtocol { ) os_log("Get player two's startbases", log: LOG, type: .info) - let p2StartBaseCount = Int.random(in: 1...3) var p2StartBases = [String: Base]() - if (p2StartBaseCount == 1) { + if (mapModel.numBasesP2 == 1) { p2StartBases["mid"] = Base(position: CGPoint(x: self.size.width * 0.8, y: self.size.height * 0.5)) ways.append(Way(fromBase: basePlayerTwo, toBase: p2StartBases["mid"]!)) - } else if (p1StartBaseCount == 2) { + } else if (mapModel.numBasesP2 == 2) { p2StartBases["top"] = Base(position: CGPoint(x: self.size.width * 0.8, y: self.size.height * 0.333)) p2StartBases["bot"] = Base(position: CGPoint(x: self.size.width * 0.8, y: self.size.height * 0.666)) ways.append(Way(fromBase: basePlayerTwo, toBase: p2StartBases["top"]!)) diff --git a/GoldWars/GoldWars/Scenes/GameScene.swift b/GoldWars/GoldWars/Scenes/GameScene.swift index 7b91850..8e9c7fa 100644 --- a/GoldWars/GoldWars/Scenes/GameScene.swift +++ b/GoldWars/GoldWars/Scenes/GameScene.swift @@ -26,7 +26,7 @@ class GameScene: SKScene{ } func initMap() { - MapFactory(scene: self, entityManager: EntityManager.sharedInstance).loadMap(playerCount: 2) + MapFactory(scene: self, entityManager: EntityManager.sharedInstance).loadMap(fromModel: MapGenerationModel(numBasesP1: 1, numBasesP2: 1, topLeftId: 3, topRightId: 3, bottomLeftId: 3, bottomRightId: 3)) DataService.sharedInstance.setSnapshotModel(snapshotModel: EntityManager.sharedInstance.getSnapshotModel()) }