Complete native rewrite of the web-based SoliCards game as a SwiftUI multiplatform app targeting iOS 17+, iPadOS 17+, and macOS 14+. Three solitaire variants (Klondike, Spider, FreeCell) with full game rules, drag & drop, smart zoom layout, 6 themes, 4 difficulty levels, SwiftData persistence, VoiceOver accessibility, and 57 unit tests. Key features: - MVVM + Protocol-Oriented Strategy architecture - DragGesture with coordinate-space hit-testing (long press + drag) - Smart zoom: cards auto-size to fit screen based on deepest column - Landscape: 30% bigger cards with scrollable overflow (iOS) - macOS: 120pt card cap, 92% height buffer for window resizing - Auto-save, game resume, statistics tracking via SwiftData - Privacy manifest, app icon, String Catalog, zero dependencies Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
32 lines
847 B
Swift
32 lines
847 B
Swift
import Foundation
|
|
import SwiftData
|
|
|
|
@Model
|
|
final class GameRecord {
|
|
var variant: String
|
|
var difficulty: String
|
|
var snapshotData: Data
|
|
var elapsedSeconds: Int
|
|
var lastPlayedDate: Date
|
|
|
|
init(variant: GameVariant, difficulty: Difficulty, snapshot: GameSnapshot, elapsedSeconds: Int) {
|
|
self.variant = variant.rawValue
|
|
self.difficulty = difficulty.rawValue
|
|
self.snapshotData = (try? JSONEncoder().encode(snapshot)) ?? Data()
|
|
self.elapsedSeconds = elapsedSeconds
|
|
self.lastPlayedDate = Date()
|
|
}
|
|
|
|
var decodedSnapshot: GameSnapshot? {
|
|
try? JSONDecoder().decode(GameSnapshot.self, from: snapshotData)
|
|
}
|
|
|
|
var gameVariant: GameVariant? {
|
|
GameVariant(rawValue: variant)
|
|
}
|
|
|
|
var gameDifficulty: Difficulty? {
|
|
Difficulty(rawValue: difficulty)
|
|
}
|
|
}
|