using System.Collections; using System.Collections.Generic; using System.ComponentModel; using Unity.PlasticSCM.Editor.WebApi; using UnityEngine; public class NPC_Behavior : MonoBehaviour { [SerializeField] GameObject confettiEffect; [SerializeField] private double _caffeineLevel = 0.0; // max 100, min 0 [SerializeField] private double _hungerLevel = 0.0; // max 100, min 0 [SerializeField] private double _happinessLevel = 100.0; // max 100, min 0 [SerializeField] private double _baseDevelopementPower = 100.0; // max 100, min 0 [SerializeField] private double _developementPower = 100.0; // max unlimited, min 0 [SerializeField] double eventRate = 1.0; // max 60, min 0 -> how many events are requested per minute /// /// Gibt das Koffeinlevel des Entwicklers zurück /// public double CaffeineLevel => _caffeineLevel; /// /// Gibt das Hungerlevel des Entwicklers zurück /// public double HungerLevel => _hungerLevel; /// /// Gibt das Zufriedenheitslevel des Entwicklers zurück /// public double HappnessLevel => _happinessLevel; /// /// Gibt die Basisentwicklungskraft des Entwicklers zurück /// public double BaseDevelopementPower => _baseDevelopementPower; /// /// Gibt die jetzige Entwicklungskraft des Entwicklers zurück /// public double DevelopmentPower => _developementPower; private GameManager _gameManager; [SerializeField] private bool _deleteManually = false; [SerializeField] private float _timer; [SerializeField] private List _lastTenNeeds = new List(); private DeveloperNeeds _developerNeeds; private float _timeBetweenEvents; private GameObject _currentNeed = null; private bool _justFullfilledNeed = false; private float _justFullfilledNeedTimer = 2.0f; private bool _canNeedNewNeed = true; /// /// The name of the current need /// public string CurrentNeed => _lastTenNeeds[_lastTenNeeds.Count - 1]; /// /// Indicates if the developer has a need right now /// public bool HasNeed = false; // Start is called before the first frame update void Start() { _gameManager = GameManager.Instance; _developerNeeds = GetComponent(); ResetTimer(); } // Update is called once per frame void Update() { _timer -= Time.deltaTime; _justFullfilledNeedTimer -= Time.deltaTime; if (_justFullfilledNeedTimer <= 0 && _justFullfilledNeed) { _canNeedNewNeed = true; _justFullfilledNeed = false; _justFullfilledNeedTimer = 2.0f; } if (_timer <= 0 && _currentNeed == null && _canNeedNewNeed) { // List needs = new List() { "coffee", "mate", "toilet" }; _justFullfilledNeed = false; _canNeedNewNeed = false; string need = "coffee"; _currentNeed = _developerNeeds.spawnNeed(need); HasNeed = true; _lastTenNeeds.Add(need); if (_lastTenNeeds.Count > 10 ) { _lastTenNeeds.RemoveAt(0); } ResetTimer(); } // for Debugging if (_deleteManually) { _deleteManually = false; NeedFullfilled(); } } void ResetTimer() { if (eventRate <= 0) { _timeBetweenEvents = float.MaxValue; } else { _timeBetweenEvents = 60f / (float)eventRate; _timer = Random.Range(0.5f * _timeBetweenEvents, 1.5f * _timeBetweenEvents); } } /// /// Deletes the current need and its gameobject. /// /// bool: wether successfully deleted the gameobject or not public bool NeedFullfilled() { Destroy(_currentNeed); if (HasNeed) { HasNeed = false; _justFullfilledNeed = true; _canNeedNewNeed = false; Instantiate(confettiEffect, new Vector3(0.0f, 1.5f, 0.0f), confettiEffect.transform.rotation).transform.SetParent(transform, false); } return _currentNeed == null; } public Dictionary GetStats() { return new Dictionary { { "Caffeine", _caffeineLevel }, { "Hunger", _hungerLevel }, { "Happiness", _happinessLevel }, { "Developement Power", _developementPower } }; } public void SetStats(Dictionary stats) { foreach (string key in stats.Keys) { switch (key) { case "Caffeine": _caffeineLevel = stats[key]; break; case "Hunger": _hungerLevel = stats[key]; break; case "Happiness": _happinessLevel = stats[key]; break; case "Developement Power": _developementPower = stats[key]; break; default: Debug.LogError("Unknown Stat/Key"); break; } } } }