Skip to content

Commit

Permalink
Merge pull request #19 from cs3217-2324/feat/persistence
Browse files Browse the repository at this point in the history
Persistence
  • Loading branch information
ruihan00 committed Mar 22, 2024
2 parents e01793f + 17db1f1 commit 11cc529
Show file tree
Hide file tree
Showing 19 changed files with 677 additions and 16 deletions.
89 changes: 89 additions & 0 deletions star-dash/star-dash.xcodeproj/project.pbxproj
Expand Up @@ -53,6 +53,19 @@
4E3458E92BA75E7C00E817C6 /* SpriteComponentTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E3458E82BA75E7C00E817C6 /* SpriteComponentTests.swift */; };
4E3458EB2BA75E8B00E817C6 /* PhysicsComponentTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E3458EA2BA75E8B00E817C6 /* PhysicsComponentTests.swift */; };
4E3458ED2BA75F1200E817C6 /* Util.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E3458EC2BA75F1200E817C6 /* Util.swift */; };
4E59E2512BAB2EAE007B3FA7 /* StorageManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E59E2502BAB2EAE007B3FA7 /* StorageManager.swift */; };
4E59E2532BAB3061007B3FA7 /* Database.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E59E2522BAB3061007B3FA7 /* Database.swift */; };
4E59E2562BAB33EC007B3FA7 /* SQLite in Frameworks */ = {isa = PBXBuildFile; productRef = 4E59E2552BAB33EC007B3FA7 /* SQLite */; };
4E59E2582BAB3B5B007B3FA7 /* data.json in Resources */ = {isa = PBXBuildFile; fileRef = 4E59E2572BAB3B5B007B3FA7 /* data.json */; };
4E59E25B2BAB3FDB007B3FA7 /* Level.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E59E25A2BAB3FDB007B3FA7 /* Level.swift */; };
4E59E25D2BAB405A007B3FA7 /* EntityPersistable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E59E25C2BAB405A007B3FA7 /* EntityPersistable.swift */; };
4E59E25F2BAB4134007B3FA7 /* EntityType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E59E25E2BAB4134007B3FA7 /* EntityType.swift */; };
4E59E2612BAB42FD007B3FA7 /* LevelPersistable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E59E2602BAB42FD007B3FA7 /* LevelPersistable.swift */; };
4E59E2632BACB9E2007B3FA7 /* LevelData.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E59E2622BACB9E2007B3FA7 /* LevelData.swift */; };
4E59E2662BADA79A007B3FA7 /* MonsterEntityPersistable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E59E2652BADA79A007B3FA7 /* MonsterEntityPersistable.swift */; };
4E59E2682BADA7B6007B3FA7 /* CollectibleEntityPersistable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E59E2672BADA7B6007B3FA7 /* CollectibleEntityPersistable.swift */; };
4E59E26A2BADA7C7007B3FA7 /* ToolEntityPersistable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E59E2692BADA7C7007B3FA7 /* ToolEntityPersistable.swift */; };
4E59E26C2BADA7DD007B3FA7 /* ObstacleEntityPersistable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E59E26B2BADA7DD007B3FA7 /* ObstacleEntityPersistable.swift */; };
4E630EF62B9F7E070008F887 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E630EF52B9F7E070008F887 /* AppDelegate.swift */; };
4E630EF82B9F7E070008F887 /* SceneDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E630EF72B9F7E070008F887 /* SceneDelegate.swift */; };
4E630EFA2B9F7E070008F887 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E630EF92B9F7E070008F887 /* ViewController.swift */; };
Expand Down Expand Up @@ -178,6 +191,18 @@
4E3458E82BA75E7C00E817C6 /* SpriteComponentTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SpriteComponentTests.swift; sourceTree = "<group>"; };
4E3458EA2BA75E8B00E817C6 /* PhysicsComponentTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PhysicsComponentTests.swift; sourceTree = "<group>"; };
4E3458EC2BA75F1200E817C6 /* Util.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Util.swift; sourceTree = "<group>"; };
4E59E2502BAB2EAE007B3FA7 /* StorageManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StorageManager.swift; sourceTree = "<group>"; };
4E59E2522BAB3061007B3FA7 /* Database.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Database.swift; sourceTree = "<group>"; };
4E59E2572BAB3B5B007B3FA7 /* data.json */ = {isa = PBXFileReference; lastKnownFileType = text.json; path = data.json; sourceTree = "<group>"; };
4E59E25A2BAB3FDB007B3FA7 /* Level.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Level.swift; sourceTree = "<group>"; };
4E59E25C2BAB405A007B3FA7 /* EntityPersistable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EntityPersistable.swift; sourceTree = "<group>"; };
4E59E25E2BAB4134007B3FA7 /* EntityType.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EntityType.swift; sourceTree = "<group>"; };
4E59E2602BAB42FD007B3FA7 /* LevelPersistable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LevelPersistable.swift; sourceTree = "<group>"; };
4E59E2622BACB9E2007B3FA7 /* LevelData.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LevelData.swift; sourceTree = "<group>"; };
4E59E2652BADA79A007B3FA7 /* MonsterEntityPersistable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MonsterEntityPersistable.swift; sourceTree = "<group>"; };
4E59E2672BADA7B6007B3FA7 /* CollectibleEntityPersistable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CollectibleEntityPersistable.swift; sourceTree = "<group>"; };
4E59E2692BADA7C7007B3FA7 /* ToolEntityPersistable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ToolEntityPersistable.swift; sourceTree = "<group>"; };
4E59E26B2BADA7DD007B3FA7 /* ObstacleEntityPersistable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ObstacleEntityPersistable.swift; sourceTree = "<group>"; };
4E630EF22B9F7E070008F887 /* star-dash.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "star-dash.app"; sourceTree = BUILT_PRODUCTS_DIR; };
4E630EF52B9F7E070008F887 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
4E630EF72B9F7E070008F887 /* SceneDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SceneDelegate.swift; sourceTree = "<group>"; };
Expand Down Expand Up @@ -235,6 +260,7 @@
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
4E59E2562BAB33EC007B3FA7 /* SQLite in Frameworks */,
14E247932BA2CA920071FFC0 /* DequeModule in Frameworks */,
E6E4B8302BA6C8D4005ABAB1 /* SDPhysicsEngine in Frameworks */,
);
Expand Down Expand Up @@ -392,6 +418,39 @@
path = Components;
sourceTree = "<group>";
};
4E59E24F2BAB2DBB007B3FA7 /* Persistence */ = {
isa = PBXGroup;
children = (
4E59E2642BAD9A06007B3FA7 /* Data */,
4E59E2502BAB2EAE007B3FA7 /* StorageManager.swift */,
4E59E2522BAB3061007B3FA7 /* Database.swift */,
4E59E25C2BAB405A007B3FA7 /* EntityPersistable.swift */,
4E59E2602BAB42FD007B3FA7 /* LevelPersistable.swift */,
4E59E2652BADA79A007B3FA7 /* MonsterEntityPersistable.swift */,
4E59E26B2BADA7DD007B3FA7 /* ObstacleEntityPersistable.swift */,
4E59E2672BADA7B6007B3FA7 /* CollectibleEntityPersistable.swift */,
4E59E2692BADA7C7007B3FA7 /* ToolEntityPersistable.swift */,
);
path = Persistence;
sourceTree = "<group>";
};
4E59E2592BAB3FC9007B3FA7 /* Model */ = {
isa = PBXGroup;
children = (
4E59E25A2BAB3FDB007B3FA7 /* Level.swift */,
);
path = Model;
sourceTree = "<group>";
};
4E59E2642BAD9A06007B3FA7 /* Data */ = {
isa = PBXGroup;
children = (
4E59E2572BAB3B5B007B3FA7 /* data.json */,
4E59E2622BACB9E2007B3FA7 /* LevelData.swift */,
);
path = Data;
sourceTree = "<group>";
};
4E630EE92B9F7E070008F887 = {
isa = PBXGroup;
children = (
Expand All @@ -418,6 +477,8 @@
4E630EF42B9F7E070008F887 /* star-dash */ = {
isa = PBXGroup;
children = (
4E59E2592BAB3FC9007B3FA7 /* Model */,
4E59E24F2BAB2DBB007B3FA7 /* Persistence */,
E6A011152BA5D111006904D9 /* GameBridge */,
46B8C0982BA328BF00498705 /* GameEngine */,
E6A745102BA057040080C1BE /* Rendering */,
Expand Down Expand Up @@ -485,6 +546,7 @@
isa = PBXGroup;
children = (
4E630F362B9F91DE0008F887 /* PlayerSprite.swift */,
4E59E25E2BAB4134007B3FA7 /* EntityType.swift */,
);
path = Enums;
sourceTree = "<group>";
Expand Down Expand Up @@ -588,6 +650,7 @@
packageProductDependencies = (
14E247922BA2CA920071FFC0 /* DequeModule */,
E6E4B82F2BA6C8D4005ABAB1 /* SDPhysicsEngine */,
4E59E2552BAB33EC007B3FA7 /* SQLite */,
);
productName = "star-dash";
productReference = 4E630EF22B9F7E070008F887 /* star-dash.app */;
Expand Down Expand Up @@ -663,6 +726,7 @@
mainGroup = 4E630EE92B9F7E070008F887;
packageReferences = (
14E247912BA2CA920071FFC0 /* XCRemoteSwiftPackageReference "swift-collections" */,
4E59E2542BAB33EC007B3FA7 /* XCRemoteSwiftPackageReference "SQLite.swift" */,
);
productRefGroup = 4E630EF32B9F7E070008F887 /* Products */;
projectDirPath = "";
Expand All @@ -684,6 +748,7 @@
4E630F022B9F7E090008F887 /* LaunchScreen.storyboard in Resources */,
4E630EFF2B9F7E090008F887 /* Assets.xcassets in Resources */,
4E630EFD2B9F7E070008F887 /* Main.storyboard in Resources */,
4E59E2582BAB3B5B007B3FA7 /* data.json in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
Expand Down Expand Up @@ -730,7 +795,9 @@
buildActionMask = 2147483647;
files = (
46D418182BA5CD840091A38B /* Player+Collidable.swift in Sources */,
4E59E25B2BAB3FDB007B3FA7 /* Level.swift in Sources */,
46D4181E2BA5D2620091A38B /* Monster+Collidable.swift in Sources */,
4E59E2662BADA79A007B3FA7 /* MonsterEntityPersistable.swift in Sources */,
E69EE9342BAC6CC300033AB5 /* OverlayInfo.swift in Sources */,
E6B1DC902BA34A4800473563 /* SDPhysicsEngine in Sources */,
4E630F272B9F7E770008F887 /* Entity.swift in Sources */,
Expand All @@ -749,24 +816,30 @@
46D4181A2BA5CDBD0091A38B /* CollisionHandler.swift in Sources */,
4E86605F2BA095E30035530D /* Collectible.swift in Sources */,
E64361122BA4C2CD003850FD /* ObjectModule.swift in Sources */,
4E59E2532BAB3061007B3FA7 /* Database.swift in Sources */,
4E8660662BA097D40035530D /* PhysicsConstants.swift in Sources */,
143AA3952BA4DF1C009C28E7 /* MonsterAttackPlayerEvent.swift in Sources */,
143AA3932BA4DBE7009C28E7 /* PlayerMonsterContactEvent.swift in Sources */,
4E59E2682BADA7B6007B3FA7 /* CollectibleEntityPersistable.swift in Sources */,
46D418162BA5CBD60091A38B /* Collidable.swift in Sources */,
461148912BA1CDBF0073E7E1 /* SystemManager.swift in Sources */,
4E59E2512BAB2EAE007B3FA7 /* StorageManager.swift in Sources */,
145F2C842BA22CA300457549 /* EventModifiable.swift in Sources */,
4E630EFA2B9F7E070008F887 /* ViewController.swift in Sources */,
E6A011172BA5F4AD006904D9 /* EntitySyncInterface.swift in Sources */,
E6B0AAD52BAAE4EC009CB939 /* PlayerFloorContactEvent.swift in Sources */,
E64361132BA4C2CD003850FD /* PhysicsModule.swift in Sources */,
4E630F322B9F887C0008F887 /* PhysicsComponent.swift in Sources */,
4E59E25D2BAB405A007B3FA7 /* EntityPersistable.swift in Sources */,
1471B0AD2BA6AE4E00878B14 /* UseGrappleHookEvent.swift in Sources */,
4E59E26C2BADA7DD007B3FA7 /* ObstacleEntityPersistable.swift in Sources */,
4E630EF62B9F7E070008F887 /* AppDelegate.swift in Sources */,
461148962BA1D53D0073E7E1 /* PositionSystem.swift in Sources */,
143AA38C2BA4D3E3009C28E7 /* JumpEvent.swift in Sources */,
4E630F2A2B9F7EF60008F887 /* PositionComponent.swift in Sources */,
46D418132BA5C9930091A38B /* Floor.swift in Sources */,
E64361152BA4C2CD003850FD /* GameBridge.swift in Sources */,
4E59E26A2BADA7C7007B3FA7 /* ToolEntityPersistable.swift in Sources */,
E6B0AAD32BAAE438009CB939 /* ControlViewDelegate.swift in Sources */,
4604BBD92BA81C940078B84C /* InventorySystem.swift in Sources */,
14E247952BA2CB480071FFC0 /* EventManager.swift in Sources */,
Expand All @@ -784,8 +857,10 @@
143AA3972BA4E0D9009C28E7 /* PickupCollectibleEvent.swift in Sources */,
46D418242BA5D5280091A38B /* Tool+Collidable.swift in Sources */,
E64361142BA4C2CD003850FD /* CreationModule.swift in Sources */,
4E59E2612BAB42FD007B3FA7 /* LevelPersistable.swift in Sources */,
E6A745162BA057040080C1BE /* MTKRenderer.swift in Sources */,
E6A745182BA057040080C1BE /* Renderer.swift in Sources */,
4E59E25F2BAB4134007B3FA7 /* EntityType.swift in Sources */,
E6A745172BA057040080C1BE /* ControlView.swift in Sources */,
14970F562BA8177B00CC1E8A /* GameConstants.swift in Sources */,
1471B0A42BA6AAF200878B14 /* PlayerDeathEvent.swift in Sources */,
Expand All @@ -805,6 +880,7 @@
461148982BA1E41F0073E7E1 /* PhysicsSystem.swift in Sources */,
4E630F2E2B9F81850008F887 /* HealthComponent.swift in Sources */,
4E86605C2BA095460035530D /* Monster.swift in Sources */,
4E59E2632BACB9E2007B3FA7 /* LevelData.swift in Sources */,
145F2C802BA203B400457549 /* Event.swift in Sources */,
1471B0A22BA6AA2200878B14 /* RespawnEvent.swift in Sources */,
46D418112BA5C88B0091A38B /* Wall.swift in Sources */,
Expand Down Expand Up @@ -1187,6 +1263,14 @@
minimumVersion = 1.1.0;
};
};
4E59E2542BAB33EC007B3FA7 /* XCRemoteSwiftPackageReference "SQLite.swift" */ = {
isa = XCRemoteSwiftPackageReference;
repositoryURL = "https://github.com/stephencelis/SQLite.swift.git";
requirement = {
kind = upToNextMajorVersion;
minimumVersion = 0.15.0;
};
};
/* End XCRemoteSwiftPackageReference section */

/* Begin XCSwiftPackageProductDependency section */
Expand All @@ -1195,6 +1279,11 @@
package = 14E247912BA2CA920071FFC0 /* XCRemoteSwiftPackageReference "swift-collections" */;
productName = DequeModule;
};
4E59E2552BAB33EC007B3FA7 /* SQLite */ = {
isa = XCSwiftPackageProductDependency;
package = 4E59E2542BAB33EC007B3FA7 /* XCRemoteSwiftPackageReference "SQLite.swift" */;
productName = SQLite;
};
E6B1DC8E2BA3459600473563 /* SDPhysicsEngine */ = {
isa = XCSwiftPackageProductDependency;
productName = SDPhysicsEngine;
Expand Down
@@ -1,5 +1,14 @@
{
"pins" : [
{
"identity" : "sqlite.swift",
"kind" : "remoteSourceControl",
"location" : "https://github.com/stephencelis/SQLite.swift.git",
"state" : {
"revision" : "e78ae0220e17525a15ac68c697a155eb7a672a8e",
"version" : "0.15.0"
}
},
{
"identity" : "swift-collections",
"kind" : "remoteSourceControl",
Expand Down
14 changes: 14 additions & 0 deletions star-dash/star-dash/Enums/EntityType.swift
@@ -0,0 +1,14 @@
//
// EntityType.swift
// star-dash
//
// Created by Lau Rui han on 21/3/24.
//

import Foundation
enum EntityType: String, Encodable, Decodable {
case Monster = "monster"
case Collectible = "collectible"
case Obstacle = "obstacle"
case Tool = "tool"
}
Expand Up @@ -16,7 +16,6 @@ class EntityManager {
var componentMap: ComponentMap
var entityMap: EntityMap
var entityComponentMap: EntityComponentMap

init(componentMap: ComponentMap, entityMap: EntityMap, entityComponentMap: EntityComponentMap) {
self.componentMap = componentMap
self.entityMap = entityMap
Expand Down
15 changes: 10 additions & 5 deletions star-dash/star-dash/GameEngine/Entities/GameEntities/Monster.swift
Expand Up @@ -10,19 +10,24 @@ import Foundation
class Monster: Entity {
let id: EntityId
private let position: CGPoint

init(id: EntityId, position: CGPoint) {
private let health: Int
private let sprite: String
private let size: CGSize
init(id: EntityId, position: CGPoint, health: Int, sprite: String, size: CGSize) {
self.id = id
self.position = position
self.health = health
self.sprite = sprite
self.size = size
}

convenience init(position: CGPoint) {
self.init(id: UUID(), position: position)
convenience init(position: CGPoint, health: Int, sprite: String, size: CGSize) {
self.init(id: UUID(), position: position, health: health, sprite: sprite, size: size)
}

func setUpAndAdd(to: EntityManager) {
let positionComponent = PositionComponent(entityId: self.id, position: self.position, rotation: .zero)
let healthComponent = HealthComponent(entityId: self.id, health: GameConstants.InitialHealth.monster)
let healthComponent = HealthComponent(entityId: self.id, health: self.health)
let physicsComponent = PhysicsComponent(entityId: self.id, size: PhysicsConstants.Dimensions.monster)
physicsComponent.collisionBitMask = PhysicsConstants.CollisionMask.monster
physicsComponent.affectedByGravity = true
Expand Down
Expand Up @@ -10,14 +10,17 @@ import Foundation
class Obstacle: Entity {
let id: EntityId
private let position: CGPoint

init(id: EntityId, position: CGPoint) {
private let sprite: String
private let size: CGSize
init(id: EntityId, position: CGPoint, sprite: String, size: CGSize) {
self.id = id
self.position = position
self.sprite = sprite
self.size = size
}

convenience init(position: CGPoint) {
self.init(id: UUID(), position: position)
convenience init(position: CGPoint, sprite: String, size: CGSize) {
self.init(id: UUID(), position: position, sprite: sprite, size: size)
}

func setUpAndAdd(to: EntityManager) {
Expand Down
11 changes: 7 additions & 4 deletions star-dash/star-dash/GameEngine/Entities/GameEntities/Tool.swift
Expand Up @@ -10,14 +10,17 @@ import Foundation
class Tool: Entity {
let id: EntityId
private let position: CGPoint

init(id: EntityId, position: CGPoint) {
private let sprite: String
private let size: CGSize
init(id: EntityId, position: CGPoint, sprite: String, size: CGSize) {
self.id = id
self.position = position
self.sprite = sprite
self.size = size
}

convenience init(position: CGPoint) {
self.init(id: UUID(), position: position)
convenience init(position: CGPoint, sprite: String, size: CGSize) {
self.init(id: UUID(), position: position, sprite: sprite, size: size)
}

func setUpAndAdd(to: EntityManager) {
Expand Down
21 changes: 21 additions & 0 deletions star-dash/star-dash/Model/Level.swift
@@ -0,0 +1,21 @@
//
// Level.swift
// star-dash
//
// Created by Lau Rui han on 21/3/24.
//

import Foundation
struct Level {
var name: String
var entities: [Entity]
init(name: String, entities: [Entity]) {
self.name = name
self.entities = entities
}

init(levelPersistable: LevelPersistable, entityPersistables: [EntityPersistable]) {
let entities = entityPersistables.compactMap { $0.toEntity() }
self.init(name: levelPersistable.name, entities: entities)
}
}
19 changes: 19 additions & 0 deletions star-dash/star-dash/Persistence/CollectibleEntityPersistable.swift
@@ -0,0 +1,19 @@
//
// CollectibleEntityPersistable.swift
// star-dash
//
// Created by Lau Rui han on 22/3/24.
//

import Foundation
struct CollectibleEntityPersistable: Codable, EntityPersistable {

var levelId: Int64
var position: CGPoint
var sprite: String
var points: Int
var size: CGSize
func toEntity() -> Entity {
Collectible(position: self.position, sprite: self.sprite, points: self.points, size: self.size)
}
}
18 changes: 18 additions & 0 deletions star-dash/star-dash/Persistence/Data/LevelData.swift
@@ -0,0 +1,18 @@
//
// LevelData.swift
// star-dash
//
// Created by Lau Rui han on 22/3/24.
//

import Foundation

struct LevelData: Codable {
var id: Int64
var name: String
var size: CGSize
var monsters: [MonsterEntityPersistable]
var obstacles: [ObstacleEntityPersistable]
var collectibles: [CollectibleEntityPersistable]
var tools: [ToolEntityPersistable]
}

0 comments on commit 11cc529

Please sign in to comment.