view GeoQuiz/Controllers/CityGameController.swift @ 33:6d574bd1644f

refactor controllers
author Dennis C. M. <dennis@denniscm.com>
date Sat, 12 Nov 2022 11:18:30 +0100
parents eb23effeede7
children 6ec51a4ca897
line wrap: on
line source

//
//  CityGameController.swift
//  GeoQuiz
//
//  Created by Dennis Concepción Martín on 29/9/22.
//

import Foundation
import AVFAudio

@MainActor class CityGameController: Game, ObservableObject {
    
    // Define generic type
    typealias T = CityModel.City
    
    // Game
    var data: [String: T]
    var dataAsked = [String: T]()
    
    @Published var userChoices = [String: T]()
    @Published var userScore = 0
    @Published var userLives = 3
    
    @Published var correctAnswer = (key: String(), value: T(country: String(), lat: Double(), lon: Double()))
    @Published var correctAnswers = [String: T]()
    @Published var wrongAnswers = [String: T]()
    
    // Alerts
    @Published var alertTitle = String()
    @Published var alertMessage = String()
    
    @Published var showingEndGameAlert = false
    @Published var showingWrongAnswerAlert = false
    @Published var showingExitGameAlert = false
    
    // Animations
    @Published var scoreScaleAmount = 1.0
    @Published var livesScaleAmount = 1.0
    
    // Sound effects
    @Published var player: AVAudioPlayer?
    
    init() {
        let data: CityModel = Bundle.main.decode("cities.json")
        let shuffledCities = data.cities.shuffled()
        var cities = [String: T]()
        
        for _ in 1...10 {
            let countryNames = cities.map { $0.value.country }
            let city = shuffledCities.first(where: {
                !countryNames.contains($0.value.country)
            })!
            
            cities[city.key] = city.value
        }
        
        self.data = cities
        
        let user = UserController()
        userLives = user.data.numberOfLives
        
        if let userData = UserDefaults.standard.data(forKey: "UserData") {
            if let decodedUserData = try? JSONDecoder().decode(UserDataModel.self, from: userData) {
                userLives = decodedUserData.numberOfLives
            }
        }
        
        ask()
    }
}