Merge branch 'development'

Conflicts:
	GoldWars/GoldWars.xcodeproj/project.pbxproj
This commit is contained in:
Aldin Duraki 2020-05-20 21:00:15 +02:00
commit fdb3877194
16 changed files with 1945 additions and 47 deletions

View File

@ -18,6 +18,9 @@
116060F7245C57D2004E5A36 /* EntityManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 116060F6245C57D2004E5A36 /* EntityManager.swift */; }; 116060F7245C57D2004E5A36 /* EntityManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 116060F6245C57D2004E5A36 /* EntityManager.swift */; };
11738A3B24508F68004426F1 /* UnitType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11738A3A24508F68004426F1 /* UnitType.swift */; }; 11738A3B24508F68004426F1 /* UnitType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11738A3A24508F68004426F1 /* UnitType.swift */; };
2086465C2461B66200817C23 /* TimerComponent.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2086465B2461B66200817C23 /* TimerComponent.swift */; }; 2086465C2461B66200817C23 /* TimerComponent.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2086465B2461B66200817C23 /* TimerComponent.swift */; };
3E67854024728368007B9DE4 /* CElements.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3E67853F24728368007B9DE4 /* CElements.swift */; };
3E6785422472CBEC007B9DE4 /* Way.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3E6785412472CBEC007B9DE4 /* Way.swift */; };
3E6785442472CC27007B9DE4 /* DefaultWayComponent.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3E6785432472CC27007B9DE4 /* DefaultWayComponent.swift */; };
3EBD242C245D8044003CECE7 /* GameCenterHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3EBD242B245D8044003CECE7 /* GameCenterHelper.swift */; }; 3EBD242C245D8044003CECE7 /* GameCenterHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3EBD242B245D8044003CECE7 /* GameCenterHelper.swift */; };
3EBD242E245D9332003CECE7 /* Team.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3EBD242D245D9332003CECE7 /* Team.swift */; }; 3EBD242E245D9332003CECE7 /* Team.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3EBD242D245D9332003CECE7 /* Team.swift */; };
8BB6FF402472B8F000162BBD /* SkillButtonNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8BB6FF3F2472B8F000162BBD /* SkillButtonNode.swift */; }; 8BB6FF402472B8F000162BBD /* SkillButtonNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8BB6FF3F2472B8F000162BBD /* SkillButtonNode.swift */; };
@ -47,9 +50,9 @@
9EC86BA6245C8AD000796EF3 /* ModalType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9EC86BA5245C8AD000796EF3 /* ModalType.swift */; }; 9EC86BA6245C8AD000796EF3 /* ModalType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9EC86BA5245C8AD000796EF3 /* ModalType.swift */; };
9EEDE02D246FCD770096C735 /* SpinningLogoEntity.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9EEDE02C246FCD770096C735 /* SpinningLogoEntity.swift */; }; 9EEDE02D246FCD770096C735 /* SpinningLogoEntity.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9EEDE02C246FCD770096C735 /* SpinningLogoEntity.swift */; };
9EEDE02F246FCD800096C735 /* SpinningLogoComponent.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9EEDE02E246FCD800096C735 /* SpinningLogoComponent.swift */; }; 9EEDE02F246FCD800096C735 /* SpinningLogoComponent.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9EEDE02E246FCD800096C735 /* SpinningLogoComponent.swift */; };
AB1D759C245DD18100671525 /* MapProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = AB1D759A245DD18100671525 /* MapProtocol.swift */; };
AB1D759D245DD18100671525 /* TwoPlayerDefaultTestMap.swift in Sources */ = {isa = PBXBuildFile; fileRef = AB1D759B245DD18100671525 /* TwoPlayerDefaultTestMap.swift */; }; AB1D759D245DD18100671525 /* TwoPlayerDefaultTestMap.swift in Sources */ = {isa = PBXBuildFile; fileRef = AB1D759B245DD18100671525 /* TwoPlayerDefaultTestMap.swift */; };
AB1D75A0245DEC0500671525 /* MapFactory.swift in Sources */ = {isa = PBXBuildFile; fileRef = AB1D759F245DEC0500671525 /* MapFactory.swift */; }; AB1D75A0245DEC0500671525 /* MapFactory.swift in Sources */ = {isa = PBXBuildFile; fileRef = AB1D759F245DEC0500671525 /* MapFactory.swift */; };
AB21D7D5246C748A00B09CBA /* TwoPlayerMapGenerator.swift in Sources */ = {isa = PBXBuildFile; fileRef = AB21D7D4246C748A00B09CBA /* TwoPlayerMapGenerator.swift */; };
ABA03DA0244BD54F00A66916 /* Base.swift in Sources */ = {isa = PBXBuildFile; fileRef = ABA03D9F244BD54F00A66916 /* Base.swift */; }; ABA03DA0244BD54F00A66916 /* Base.swift in Sources */ = {isa = PBXBuildFile; fileRef = ABA03D9F244BD54F00A66916 /* Base.swift */; };
AE151589245F18EF001D363E /* MatchmakingHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = AE151588245F18EF001D363E /* MatchmakingHelper.swift */; }; AE151589245F18EF001D363E /* MatchmakingHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = AE151588245F18EF001D363E /* MatchmakingHelper.swift */; };
AEBF3AFF246EB146004F7CD5 /* CancelBtnNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = AEBF3AFE246EB146004F7CD5 /* CancelBtnNode.swift */; }; AEBF3AFF246EB146004F7CD5 /* CancelBtnNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = AEBF3AFE246EB146004F7CD5 /* CancelBtnNode.swift */; };
@ -89,6 +92,9 @@
116060F6245C57D2004E5A36 /* EntityManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EntityManager.swift; sourceTree = "<group>"; }; 116060F6245C57D2004E5A36 /* EntityManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EntityManager.swift; sourceTree = "<group>"; };
11738A3A24508F68004426F1 /* UnitType.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UnitType.swift; sourceTree = "<group>"; }; 11738A3A24508F68004426F1 /* UnitType.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UnitType.swift; sourceTree = "<group>"; };
2086465B2461B66200817C23 /* TimerComponent.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TimerComponent.swift; sourceTree = "<group>"; }; 2086465B2461B66200817C23 /* TimerComponent.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TimerComponent.swift; sourceTree = "<group>"; };
3E67853F24728368007B9DE4 /* CElements.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CElements.swift; sourceTree = "<group>"; };
3E6785412472CBEC007B9DE4 /* Way.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Way.swift; sourceTree = "<group>"; };
3E6785432472CC27007B9DE4 /* DefaultWayComponent.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DefaultWayComponent.swift; sourceTree = "<group>"; };
3EBD242B245D8044003CECE7 /* GameCenterHelper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GameCenterHelper.swift; sourceTree = "<group>"; }; 3EBD242B245D8044003CECE7 /* GameCenterHelper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GameCenterHelper.swift; sourceTree = "<group>"; };
3EBD242D245D9332003CECE7 /* Team.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Team.swift; sourceTree = "<group>"; }; 3EBD242D245D9332003CECE7 /* Team.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Team.swift; sourceTree = "<group>"; };
8BB6FF3F2472B8F000162BBD /* SkillButtonNode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SkillButtonNode.swift; sourceTree = "<group>"; }; 8BB6FF3F2472B8F000162BBD /* SkillButtonNode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SkillButtonNode.swift; sourceTree = "<group>"; };
@ -119,9 +125,9 @@
9ECD3699245C91F7008DEEBD /* GoldWars.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = GoldWars.entitlements; sourceTree = "<group>"; }; 9ECD3699245C91F7008DEEBD /* GoldWars.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = GoldWars.entitlements; sourceTree = "<group>"; };
9EEDE02C246FCD770096C735 /* SpinningLogoEntity.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SpinningLogoEntity.swift; sourceTree = "<group>"; }; 9EEDE02C246FCD770096C735 /* SpinningLogoEntity.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SpinningLogoEntity.swift; sourceTree = "<group>"; };
9EEDE02E246FCD800096C735 /* SpinningLogoComponent.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SpinningLogoComponent.swift; sourceTree = "<group>"; }; 9EEDE02E246FCD800096C735 /* SpinningLogoComponent.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SpinningLogoComponent.swift; sourceTree = "<group>"; };
AB1D759A245DD18100671525 /* MapProtocol.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MapProtocol.swift; sourceTree = "<group>"; };
AB1D759B245DD18100671525 /* TwoPlayerDefaultTestMap.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TwoPlayerDefaultTestMap.swift; sourceTree = "<group>"; }; AB1D759B245DD18100671525 /* TwoPlayerDefaultTestMap.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TwoPlayerDefaultTestMap.swift; sourceTree = "<group>"; };
AB1D759F245DEC0500671525 /* MapFactory.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MapFactory.swift; sourceTree = "<group>"; }; AB1D759F245DEC0500671525 /* MapFactory.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MapFactory.swift; sourceTree = "<group>"; };
AB21D7D4246C748A00B09CBA /* TwoPlayerMapGenerator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TwoPlayerMapGenerator.swift; sourceTree = "<group>"; };
ABA03D9F244BD54F00A66916 /* Base.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Base.swift; sourceTree = "<group>"; }; ABA03D9F244BD54F00A66916 /* Base.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Base.swift; sourceTree = "<group>"; };
AE151588245F18EF001D363E /* MatchmakingHelper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MatchmakingHelper.swift; sourceTree = "<group>"; }; AE151588245F18EF001D363E /* MatchmakingHelper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MatchmakingHelper.swift; sourceTree = "<group>"; };
AEBF3AFE246EB146004F7CD5 /* CancelBtnNode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CancelBtnNode.swift; sourceTree = "<group>"; }; AEBF3AFE246EB146004F7CD5 /* CancelBtnNode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CancelBtnNode.swift; sourceTree = "<group>"; };
@ -233,6 +239,7 @@
2086465B2461B66200817C23 /* TimerComponent.swift */, 2086465B2461B66200817C23 /* TimerComponent.swift */,
9EBFD7542462CF5A00E1E219 /* SliderComponent.swift */, 9EBFD7542462CF5A00E1E219 /* SliderComponent.swift */,
9EC7E48A2461FBF700396BCD /* SliderNode.swift */, 9EC7E48A2461FBF700396BCD /* SliderNode.swift */,
3E6785432472CC27007B9DE4 /* DefaultWayComponent.swift */,
8BB6FF3F2472B8F000162BBD /* SkillButtonNode.swift */, 8BB6FF3F2472B8F000162BBD /* SkillButtonNode.swift */,
); );
path = Components; path = Components;
@ -241,13 +248,14 @@
116060F5245C5709004E5A36 /* Entities */ = { 116060F5245C5709004E5A36 /* Entities */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
9EEDE02C246FCD770096C735 /* SpinningLogoEntity.swift */, 9E174C89245E1A0A00209FF0 /* Background.swift */,
ABA03D9F244BD54F00A66916 /* Base.swift */, ABA03D9F244BD54F00A66916 /* Base.swift */,
9EC86B9E245C88A300796EF3 /* Modal.swift */, 9E174C83245DD8CE00209FF0 /* Button.swift */,
116060F6245C57D2004E5A36 /* EntityManager.swift */, 116060F6245C57D2004E5A36 /* EntityManager.swift */,
9E78ACB9245CBDAF00526FF7 /* HUD.swift */, 9E78ACB9245CBDAF00526FF7 /* HUD.swift */,
9E174C83245DD8CE00209FF0 /* Button.swift */, 9EC86B9E245C88A300796EF3 /* Modal.swift */,
9E174C89245E1A0A00209FF0 /* Background.swift */, 9EEDE02C246FCD770096C735 /* SpinningLogoEntity.swift */,
3E6785412472CBEC007B9DE4 /* Way.swift */,
); );
path = Entities; path = Entities;
sourceTree = "<group>"; sourceTree = "<group>";
@ -300,9 +308,10 @@
AB1D759E245DD2EA00671525 /* Map */ = { AB1D759E245DD2EA00671525 /* Map */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
AB1D759A245DD18100671525 /* MapProtocol.swift */, 3E67853F24728368007B9DE4 /* CElements.swift */,
AB1D759F245DEC0500671525 /* MapFactory.swift */, AB1D759F245DEC0500671525 /* MapFactory.swift */,
AB1D759B245DD18100671525 /* TwoPlayerDefaultTestMap.swift */, AB1D759B245DD18100671525 /* TwoPlayerDefaultTestMap.swift */,
AB21D7D4246C748A00B09CBA /* TwoPlayerMapGenerator.swift */,
); );
path = Map; path = Map;
sourceTree = "<group>"; sourceTree = "<group>";
@ -419,6 +428,7 @@
9E78ACC4245CCA3600526FF7 /* SpySkillComponent.swift in Sources */, 9E78ACC4245CCA3600526FF7 /* SpySkillComponent.swift in Sources */,
9EA3ABEB245C6DFA006BC61D /* BaseNode.swift in Sources */, 9EA3ABEB245C6DFA006BC61D /* BaseNode.swift in Sources */,
9E04AFAF245E2B73002D5CFC /* AttackActionComponent.swift in Sources */, 9E04AFAF245E2B73002D5CFC /* AttackActionComponent.swift in Sources */,
3E6785422472CBEC007B9DE4 /* Way.swift in Sources */,
110360D9244B101A008610AF /* GameScene.swift in Sources */, 110360D9244B101A008610AF /* GameScene.swift in Sources */,
C04783F024685995004961FB /* SettingsScene.swift in Sources */, C04783F024685995004961FB /* SettingsScene.swift in Sources */,
116060F7245C57D2004E5A36 /* EntityManager.swift in Sources */, 116060F7245C57D2004E5A36 /* EntityManager.swift in Sources */,
@ -432,6 +442,7 @@
AE151589245F18EF001D363E /* MatchmakingHelper.swift in Sources */, AE151589245F18EF001D363E /* MatchmakingHelper.swift in Sources */,
11036113244B3E30008610AF /* MenuScene.swift in Sources */, 11036113244B3E30008610AF /* MenuScene.swift in Sources */,
C099579C246C5E5C0016AA22 /* DataService.swift in Sources */, C099579C246C5E5C0016AA22 /* DataService.swift in Sources */,
AB21D7D5246C748A00B09CBA /* TwoPlayerMapGenerator.swift in Sources */,
9EA3ABE9245C6DAA006BC61D /* DefaultBaseComponent.swift in Sources */, 9EA3ABE9245C6DAA006BC61D /* DefaultBaseComponent.swift in Sources */,
9E174C8A245E1A0A00209FF0 /* Background.swift in Sources */, 9E174C8A245E1A0A00209FF0 /* Background.swift in Sources */,
8BB6FF402472B8F000162BBD /* SkillButtonNode.swift in Sources */, 8BB6FF402472B8F000162BBD /* SkillButtonNode.swift in Sources */,
@ -439,11 +450,11 @@
C064E9A8246C0EA50022B228 /* LabelNode.swift in Sources */, C064E9A8246C0EA50022B228 /* LabelNode.swift in Sources */,
3EBD242C245D8044003CECE7 /* GameCenterHelper.swift in Sources */, 3EBD242C245D8044003CECE7 /* GameCenterHelper.swift in Sources */,
3F745DF0246F48FC00CE7375 /* PlayerMoveType.swift in Sources */, 3F745DF0246F48FC00CE7375 /* PlayerMoveType.swift in Sources */,
AB1D759C245DD18100671525 /* MapProtocol.swift in Sources */,
AEBF3B01246EB187004F7CD5 /* CancelBtnComponent.swift in Sources */, AEBF3B01246EB187004F7CD5 /* CancelBtnComponent.swift in Sources */,
AB1D75A0245DEC0500671525 /* MapFactory.swift in Sources */, AB1D75A0245DEC0500671525 /* MapFactory.swift in Sources */,
AB1D759D245DD18100671525 /* TwoPlayerDefaultTestMap.swift in Sources */, AB1D759D245DD18100671525 /* TwoPlayerDefaultTestMap.swift in Sources */,
9EBFD7552462CF5A00E1E219 /* SliderComponent.swift in Sources */, 9EBFD7552462CF5A00E1E219 /* SliderComponent.swift in Sources */,
3E67854024728368007B9DE4 /* CElements.swift in Sources */,
ABA03DA0244BD54F00A66916 /* Base.swift in Sources */, ABA03DA0244BD54F00A66916 /* Base.swift in Sources */,
C064E9AC246C151F0022B228 /* Label.swift in Sources */, C064E9AC246C151F0022B228 /* Label.swift in Sources */,
9E174C82245DD81D00209FF0 /* ButtonNode.swift in Sources */, 9E174C82245DD81D00209FF0 /* ButtonNode.swift in Sources */,
@ -452,6 +463,7 @@
9E174C84245DD8CE00209FF0 /* Button.swift in Sources */, 9E174C84245DD8CE00209FF0 /* Button.swift in Sources */,
AEBF3AFF246EB146004F7CD5 /* CancelBtnNode.swift in Sources */, AEBF3AFF246EB146004F7CD5 /* CancelBtnNode.swift in Sources */,
110360DB244B101A008610AF /* GameViewController.swift in Sources */, 110360DB244B101A008610AF /* GameViewController.swift in Sources */,
3E6785442472CC27007B9DE4 /* DefaultWayComponent.swift in Sources */,
2086465C2461B66200817C23 /* TimerComponent.swift in Sources */, 2086465C2461B66200817C23 /* TimerComponent.swift in Sources */,
110360D3244B101A008610AF /* AppDelegate.swift in Sources */, 110360D3244B101A008610AF /* AppDelegate.swift in Sources */,
9EC86B9F245C88A300796EF3 /* Modal.swift in Sources */, 9EC86B9F245C88A300796EF3 /* Modal.swift in Sources */,

View File

@ -0,0 +1,28 @@
//
// DefaultWayComponent.swift
// GoldWars
//
// Created by Jakob Haag on 18.05.20.
// Copyright © 2020 SP2. All rights reserved.
//
import Foundation
import GameplayKit
import SpriteKit
class DefaultWayComponent: GKComponent {
var shapeNode: SKShapeNode
init(pathToDraw: CGMutablePath) {
self.shapeNode = SKShapeNode()
shapeNode.path = pathToDraw
shapeNode.strokeColor = UIColor(red: 0.852, green: 0.649, blue: 0.123, alpha: 1)
shapeNode.lineWidth = 10
shapeNode.zPosition = -1
super.init()
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}

View File

@ -0,0 +1,25 @@
//
// WayNode.swift
// GoldWars
//
// Created by Jakob Haag on 18.05.20.
// Copyright © 2020 SP2. All rights reserved.
//
import SpriteKit
class WayNode: SKSpriteNode{
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
print("touched Way")
// TODO: PopUp Einheiten + Close PopUp
}
override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
// TODO: zeige Angirff Effect
}
override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
// TODO: Open Slider PopUp
}
}

View File

@ -42,6 +42,7 @@ class DataService {
var remotePlayerMoves: [String: [PlayerMove]] = [:] var remotePlayerMoves: [String: [PlayerMove]] = [:]
var snapshotModel: SnapshotModel? var snapshotModel: SnapshotModel?
var gameHost: Host? var gameHost: Host?
var mapModel: MapGenerationModel?
func addMove(playerMove: PlayerMove) { func addMove(playerMove: PlayerMove) {
var equalMove = localPlayerMoves.filter { (ele) -> Bool in var equalMove = localPlayerMoves.filter { (ele) -> Bool in
@ -69,4 +70,9 @@ class DataService {
func setSnapshotModel(snapshotModel: SnapshotModel) { func setSnapshotModel(snapshotModel: SnapshotModel) {
self.snapshotModel = snapshotModel self.snapshotModel = snapshotModel
} }
func setMapModel(model: MapGenerationModel) {
self.mapModel = model
MapFactory(scene: EntityManager.sharedInstance.scene, entityManager: EntityManager.sharedInstance).loadMap(fromModel: DataService.sharedInstance.mapModel!)
}
} }

View File

@ -18,6 +18,7 @@ class Base: GKEntity{
var changeOwnership: Bool var changeOwnership: Bool
var ownershipPlayer: GKPlayer? var ownershipPlayer: GKPlayer?
var baseID: Int var baseID: Int
var position: CGPoint
init(position: CGPoint, player: GKPlayer! = nil, team: Team! = nil) { init(position: CGPoint, player: GKPlayer! = nil, team: Team! = nil) {
self.unitCount = 0 self.unitCount = 0
@ -27,6 +28,7 @@ class Base: GKEntity{
self.ownershipPlayer = player self.ownershipPlayer = player
self.baseID = Base.BASE_ID_COUNT self.baseID = Base.BASE_ID_COUNT
Base.BASE_ID_COUNT += 1 Base.BASE_ID_COUNT += 1
self.position = position
super.init() super.init()
addComponent(DefaultBaseComponent(texture: SKTexture(imageNamed: "Base"), position: position)) addComponent(DefaultBaseComponent(texture: SKTexture(imageNamed: "Base"), position: position))

View File

@ -81,6 +81,9 @@ class EntityManager {
if let node = entity.component(ofType: SpinningLogoComponent.self)?.node { if let node = entity.component(ofType: SpinningLogoComponent.self)?.node {
scene.addChild(node) scene.addChild(node)
} }
if let wayNode = entity.component(ofType: DefaultWayComponent.self)?.shapeNode {
scene.addChild(wayNode)
}
} }
func remove(_ entity: GKEntity) { func remove(_ entity: GKEntity) {

View File

@ -0,0 +1,30 @@
//
// Way.swift
// GoldWars
//
// Created by Jakob Haag on 18.05.20.
// Copyright © 2020 SP2. All rights reserved.
//
import Foundation
import SpriteKit
import GameplayKit
class Way: GKEntity {
required init(fromBase: Base, toBase: Base) {
super.init()
let pathToDraw = CGMutablePath()
pathToDraw.move(to: fromBase.position)
pathToDraw.addLine(to: toBase.position)
addComponent(DefaultWayComponent(pathToDraw: pathToDraw))
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}

File diff suppressed because it is too large Load Diff

View File

@ -8,29 +8,81 @@
import Foundation import Foundation
import SpriteKit import SpriteKit
import os
protocol MapProtocol {
var size: CGSize! {get set}
var entityManager: EntityManager! {get set}
init(scene: SKScene, entityManager: EntityManager)
func load(withModel mapModel: MapGenerationModel)
}
protocol CenterElementProtocol {
var bases: [Base] {get set}
var ways: [Way] {get set}
var id: Int { get }
init(frame: CGRect)
func getAllBases() -> [Base]
func getInternalWays() -> [Way]
func getTopConnection() -> Base?
func getRightConnection() -> Base?
func getBottomConnection() -> Base?
func getLeftConnection() -> Base?
}
class MapFactory { class MapFactory {
let LOG = OSLog.init(subsystem: "MapGenerator", category: "MapFactory")
var twoPlayerMaps: [MapProtocol]! var twoPlayerMapGenerator: TwoPlayerMapGenerator
var threePlayerMaps: [MapProtocol]!
var fourPlayerMaps: [MapProtocol]!
init(scene: SKScene, entityManager: EntityManager) { init(scene: SKScene, entityManager: EntityManager) {
self.twoPlayerMaps = [ self.twoPlayerMapGenerator = TwoPlayerMapGenerator(scene: scene, entityManager: entityManager)
TwoPlayerDefaultTestMap(scene: scene, entityManager: entityManager)
]
self.threePlayerMaps = [MapProtocol]()
self.fourPlayerMaps = [MapProtocol]()
} }
func loadMap(playerCount: Int) { func loadMap() -> MapGenerationModel{
if playerCount == 2 { let mapModel = TwoPlayerMapGenerator.getNewMapModel()
twoPlayerMaps.randomElement()?.load() loadMap(fromModel: mapModel)
} else if playerCount == 3 { return mapModel
threePlayerMaps.randomElement()?.load() }
} else {
fourPlayerMaps.randomElement()?.load() 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 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)
return centerElements[id].init(frame: frame)
} }
} }

View File

@ -1,20 +0,0 @@
//
// MapProtocoll.swift
// GoldWars
//
// Created by Marcel Schwarz on 02.05.20.
// Copyright © 2020 SP2. All rights reserved.
//
import Foundation
import SpriteKit
protocol MapProtocol {
var size: CGSize! {get set}
var entityManager: EntityManager! {get set}
init(scene: SKScene, entityManager: EntityManager)
func load()
}

View File

@ -0,0 +1,123 @@
//
// CElemente.swift
// GoldWars
//
// Created by Jakob Haag on 14.05.20.
// Copyright © 2020 SP2. All rights reserved.
//
import Foundation
import SpriteKit
class SampleCElement : CenterElementProtocol {
var frame: CGRect
var bases: [Base] = []
var centerBase: Base
required init(frame: CGRect) {
self.frame = frame
self.centerBase = Base(
position: CGPoint(
x: frame.midX,
y: frame.midY
)
)
self.bases.append(centerBase)
}
func getAllBases() -> [Base] {
return self.bases
}
func getTopConnection() -> Base? {
return self.centerBase
}
func getRightConnection() -> Base? {
return self.centerBase
}
func getBottomConnection() -> Base? {
return self.centerBase
}
func getLeftConnection() -> Base? {
return self.centerBase
}
}
//
// CElement7.swift
// GoldWars
//
// Created by Jakob Haag on 14.05.20.
// Copyright © 2020 SP2. All rights reserved.
//
import Foundation
import SpriteKit
class CElement1700 : CenterElementProtocol {
var frame: CGRect
var bases: [Base] = []
var topBase: Base
var bottomBase: Base
var leftBase: Base
var rightBase: Base
required init(frame: CGRect) {
self.frame = frame
self.topBase = Base(
position: CGPoint(
x: frame.midX,
y: frame.minY
)
)
self.bottomBase = Base(
position: CGPoint(
x: frame.midX,
y: frame.maxY
)
)
self.leftBase = Base(
position: CGPoint(
x: frame.minX,
y: frame.midY
)
)
self.rightBase = Base(
position: CGPoint(
x: frame.maxX,
y: frame.midY
)
)
self.bases.append(topBase)
self.bases.append(bottomBase)
self.bases.append(leftBase)
self.bases.append(rightBase)
}
func getAllBases() -> [Base] {
return self.bases
}
func getTopConnection() -> Base? {
return self.topBase
}
func getRightConnection() -> Base? {
return self.rightBase
}
func getBottomConnection() -> Base? {
return self.bottomBase
}
func getLeftConnection() -> Base? {
return self.leftBase
}
}

View File

@ -20,7 +20,7 @@ class TwoPlayerDefaultTestMap: MapProtocol {
self.size = scene.size self.size = scene.size
} }
func load() { func load(withModel mapModel: MapGenerationModel) {
// Create Bases // Create Bases
let basePlayerOne = Base( let basePlayerOne = Base(

View File

@ -0,0 +1,273 @@
//
// TwoPlayerMapGenerator.swift
// GoldWars
//
// Created by Marcel Schwarz on 13.05.20.
// Copyright © 2020 SP2. All rights reserved.
//
import Foundation
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 - 1
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(withModel mapModel: MapGenerationModel) {
os_log("Loading from TwoPlayerMapFactory", log: LOG, type: .info)
// Generate bases structure
os_log("Get player one base", log: LOG, type: .info)
let basePlayerOne = Base(
position: CGPoint(x: self.size.width * 0.07, y: self.size.height / 2),
player: (MatchmakingHelper.sharedInstance.isServer) ? GKLocalPlayer.local : MatchmakingHelper.sharedInstance.mpMatch?.players[0],
team: .team1
)
os_log("Get player one's startbases", log: LOG, type: .info)
var p1StartBases = [String: Base]()
var ways = [Way]()
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 (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"]!))
ways.append(Way(fromBase: basePlayerOne, toBase: p1StartBases["bot"]!))
} else {
p1StartBases["top"] = Base(position: CGPoint(x: self.size.width * 0.2, y: self.size.height * 0.25))
p1StartBases["mid"] = Base(position: CGPoint(x: self.size.width * 0.2, y: self.size.height * 0.5))
p1StartBases["bot"] = Base(position: CGPoint(x: self.size.width * 0.2, y: self.size.height * 0.75))
ways.append(Way(fromBase: basePlayerOne, toBase: p1StartBases["top"]!))
ways.append(Way(fromBase: basePlayerOne, toBase: p1StartBases["mid"]!))
ways.append(Way(fromBase: basePlayerOne, toBase: p1StartBases["bot"]!))
}
os_log("Generate Map center", log: LOG, type: .info)
let gridCellWidth = self.size.width * 0.2
let gridCellHeight = self.size.height * 0.4
let cellInsetX = CGFloat(self.size.width * 0.05)
let cellInsetY = CGFloat(self.size.height * 0.07)
let gridTopLeft = CGRect(
x: self.size.width * 0.3,
y: self.size.height * 0.1,
width: gridCellWidth,
height: gridCellHeight
).insetBy(dx: cellInsetX, dy: cellInsetY)
let gridTopRight = CGRect(
x: self.size.width * 0.5,
y: self.size.height * 0.1,
width: gridCellWidth,
height: gridCellHeight
).insetBy(dx: cellInsetX, dy: cellInsetY)
let gridBottomLeft = CGRect(
x: self.size.width * 0.3,
y: self.size.height * 0.5,
width: gridCellWidth,
height: gridCellHeight
).insetBy(dx: cellInsetX, dy: cellInsetY)
let gridBottomRight = CGRect(
x: self.size.width * 0.5,
y: self.size.height * 0.5,
width: gridCellWidth,
height: gridCellHeight
).insetBy(dx: cellInsetX, dy: cellInsetY)
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())
ways.append(contentsOf: bottomLeft.getInternalWays())
ways.append(contentsOf: bottomRight.getInternalWays())
os_log("Get player two base", log: LOG, type: .info)
let basePlayerTwo = Base(
position: CGPoint(x: self.size.width * 0.93, y: self.size.height / 2),
player: (!MatchmakingHelper.sharedInstance.isServer) ? GKLocalPlayer.local : MatchmakingHelper.sharedInstance.mpMatch?.players[0],
team: .team2
)
os_log("Get player two's startbases", log: LOG, type: .info)
var p2StartBases = [String: Base]()
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 (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"]!))
ways.append(Way(fromBase: basePlayerTwo, toBase: p2StartBases["bot"]!))
} else {
p2StartBases["top"] = Base(position: CGPoint(x: self.size.width * 0.8, y: self.size.height * 0.25))
p2StartBases["mid"] = Base(position: CGPoint(x: self.size.width * 0.8, y: self.size.height * 0.5))
p2StartBases["bot"] = Base(position: CGPoint(x: self.size.width * 0.8, y: self.size.height * 0.75))
ways.append(Way(fromBase: basePlayerTwo, toBase: p2StartBases["top"]!))
ways.append(Way(fromBase: basePlayerTwo, toBase: p2StartBases["mid"]!))
ways.append(Way(fromBase: basePlayerTwo, toBase: p2StartBases["bot"]!))
}
// Create adjacency mapping
os_log("Connecting base p1 and start bases", log: LOG, type: .info)
basePlayerOne.adjacencyList.append(contentsOf: p1StartBases.values)
p1StartBases.values.forEach({base in base.adjacencyList.append(basePlayerOne)})
if (p1StartBases["top"] != nil && topLeft.getLeftConnection() != nil) {
os_log("Connecting p1 startbase top with topLeft segment", log: LOG, type: .info)
p1StartBases["top"]!.adjacencyList.append(topLeft.getLeftConnection()!)
topLeft.getLeftConnection()!.adjacencyList.append(p1StartBases["top"]!)
ways.append(Way(fromBase: p1StartBases["top"]!, toBase: topLeft.getLeftConnection()!))
}
if (p1StartBases["mid"] != nil) {
if (topLeft.getLeftConnection() != nil) {
os_log("Connecting p1 startbase mid with topLeft segment", log: LOG, type: .info)
p1StartBases["mid"]!.adjacencyList.append(topLeft.getLeftConnection()!)
topLeft.getLeftConnection()!.adjacencyList.append(p1StartBases["mid"]!)
ways.append(Way(fromBase: p1StartBases["mid"]!, toBase: topLeft.getLeftConnection()!))
}
if (bottomLeft.getLeftConnection() != nil) {
os_log("Connecting p1 startbase mid with bottomLeft segment", log: LOG, type: .info)
p1StartBases["mid"]!.adjacencyList.append(bottomLeft.getLeftConnection()!)
bottomLeft.getLeftConnection()!.adjacencyList.append(p1StartBases["mid"]!)
ways.append(Way(fromBase: p1StartBases["mid"]!, toBase: bottomLeft.getLeftConnection()!))
}
}
if (p1StartBases["bot"] != nil && bottomLeft.getLeftConnection() != nil) {
os_log("Connecting p1 startbase bot with bottomLeft segment", log: LOG, type: .info)
p1StartBases["bot"]!.adjacencyList.append(bottomLeft.getLeftConnection()!)
bottomLeft.getLeftConnection()!.adjacencyList.append(p1StartBases["bot"]!)
ways.append(Way(fromBase: p1StartBases["bot"]!, toBase: bottomLeft.getLeftConnection()!))
}
if (topLeft.getRightConnection() != nil && topRight.getLeftConnection() != nil) {
os_log("Connecting topLeft with topRight segment horizontally", log: LOG, type: .info)
topLeft.getRightConnection()!.adjacencyList.append(topRight.getLeftConnection()!)
topRight.getLeftConnection()!.adjacencyList.append(topLeft.getRightConnection()!)
ways.append(Way(fromBase: topLeft.getRightConnection()!, toBase: topRight.getLeftConnection()!))
}
if (bottomLeft.getRightConnection() != nil && bottomRight.getLeftConnection() != nil) {
os_log("Connecting bottomLeft with bottomRight segment horizontally", log: LOG, type: .info)
bottomLeft.getRightConnection()!.adjacencyList.append(bottomRight.getLeftConnection()!)
bottomRight.getLeftConnection()!.adjacencyList.append(bottomLeft.getRightConnection()!)
ways.append(Way(fromBase: bottomLeft.getRightConnection()!, toBase: bottomRight.getLeftConnection()!))
}
if (topLeft.getBottomConnection() != nil && bottomLeft.getTopConnection() != nil) {
os_log("Connecting topLeft with bottomLeft segment vertically", log: LOG, type: .info)
topLeft.getBottomConnection()!.adjacencyList.append(bottomLeft.getTopConnection()!)
bottomLeft.getTopConnection()!.adjacencyList.append(topLeft.getBottomConnection()!)
ways.append(Way(fromBase: topLeft.getBottomConnection()!, toBase: bottomLeft.getTopConnection()!))
}
if (topRight.getBottomConnection() != nil && bottomRight.getTopConnection() != nil) {
os_log("Connecting topRight with bottomRight segment vertically", log: LOG, type: .info)
topRight.getBottomConnection()!.adjacencyList.append(bottomRight.getTopConnection()!)
bottomRight.getTopConnection()!.adjacencyList.append(topRight.getBottomConnection()!)
ways.append(Way(fromBase: topRight.getBottomConnection()!, toBase: bottomRight.getTopConnection()!))
}
os_log("Connecting base p2 and start bases", log: LOG, type: .info)
basePlayerTwo.adjacencyList.append(contentsOf: p2StartBases.values)
p2StartBases.values.forEach({base in base.adjacencyList.append(basePlayerTwo)})
if (p2StartBases["top"] != nil && topRight.getRightConnection() != nil) {
os_log("Connecting p2 startbase top with topRight segment", log: LOG, type: .info)
p2StartBases["top"]!.adjacencyList.append(topRight.getRightConnection()!)
topRight.getRightConnection()!.adjacencyList.append(p2StartBases["top"]!)
ways.append(Way(fromBase: p2StartBases["top"]!, toBase: topRight.getRightConnection()!))
}
if (p2StartBases["mid"] != nil) {
if (topRight.getRightConnection() != nil) {
os_log("Connecting p2 startbase mid with topRight segment", log: LOG, type: .info)
p2StartBases["mid"]!.adjacencyList.append(topRight.getRightConnection()!)
topRight.getRightConnection()!.adjacencyList.append(p2StartBases["mid"]!)
ways.append(Way(fromBase: topRight.getRightConnection()!, toBase: p2StartBases["mid"]!))
}
if (bottomRight.getRightConnection() != nil) {
os_log("Connecting p2 startbase mid with bottomRight segment", log: LOG, type: .info)
p2StartBases["mid"]!.adjacencyList.append(bottomRight.getRightConnection()!)
bottomRight.getRightConnection()!.adjacencyList.append(p2StartBases["mid"]!)
ways.append(Way(fromBase: p2StartBases["mid"]!, toBase: bottomRight.getRightConnection()!))
}
}
if (p2StartBases["bot"] != nil && bottomRight.getRightConnection() != nil) {
os_log("Connecting p2 startbase bot with bottomRight segment", log: LOG, type: .info)
p2StartBases["bot"]!.adjacencyList.append(bottomRight.getRightConnection()!)
bottomRight.getRightConnection()!.adjacencyList.append(p2StartBases["bot"]!)
ways.append(Way(fromBase: p2StartBases["bot"]!, toBase: bottomRight.getRightConnection()!))
}
// Add all bases to the scene
entityManager.add(basePlayerOne)
p1StartBases.forEach({(key, base) in entityManager.add(base)})
topLeft.getAllBases().forEach({base in entityManager.add(base)})
topRight.getAllBases().forEach({base in entityManager.add(base)})
bottomLeft.getAllBases().forEach({base in entityManager.add(base)})
bottomRight.getAllBases().forEach({base in entityManager.add(base)})
entityManager.add(basePlayerTwo)
p2StartBases.forEach({(key, base) in entityManager.add(base)})
ways.forEach({way in entityManager.add(way)})
}
func createPathFromBaseToBase(fromBase: Base, toBase: Base) {
let path = Way(fromBase: fromBase, toBase: toBase)
entityManager.add(path)
}
}

View File

@ -122,6 +122,10 @@ class MatchmakingHelper: NSObject, GKMatchmakerViewControllerDelegate, GKMatchDe
EntityManager.sharedInstance.updateSnapshotModel(snapshotModel: snapshotModel) EntityManager.sharedInstance.updateSnapshotModel(snapshotModel: snapshotModel)
} }
if let mapModel = try? jsonDecoder.decode(MapGenerationModel.self, from: data) {
DataService.sharedInstance.setMapModel(model: mapModel)
}
MultiplayerNetwork.sharedInstance.isSending = false MultiplayerNetwork.sharedInstance.isSending = false
} }

View File

@ -60,5 +60,11 @@ class MultiplayerNetwork{
let encoded = (try? encoder.encode(DataService.sharedInstance.snapshotModel))! let encoded = (try? encoder.encode(DataService.sharedInstance.snapshotModel))!
sendData(data: encoded) sendData(data: encoded)
} }
func sendMapModelToPlayers(mapModel: MapGenerationModel) {
let encoder = JSONEncoder()
let encoded = (try? encoder.encode(mapModel))!
sendData(data: encoded)
}
} }

View File

@ -26,7 +26,12 @@ class GameScene: SKScene{
} }
func initMap() { func initMap() {
MapFactory(scene: self, entityManager: EntityManager.sharedInstance).loadMap(playerCount: 2)
if (DataService.sharedInstance.gameHost?.playerName == GKLocalPlayer.local.displayName) {
let mapModel = MapFactory(scene: self, entityManager: EntityManager.sharedInstance).loadMap()
MultiplayerNetwork.sharedInstance.sendMapModelToPlayers(mapModel: mapModel)
}
DataService.sharedInstance.setSnapshotModel(snapshotModel: EntityManager.sharedInstance.getSnapshotModel()) DataService.sharedInstance.setSnapshotModel(snapshotModel: EntityManager.sharedInstance.getSnapshotModel())
} }