Merge branch 'main' of ssh://gitfrieds.nackenbox.xyz:3011/MeigoFried/GameVsJam

This commit is contained in:
klappstuhl24 2024-04-08 21:31:40 +02:00
commit 288678f3b5
11 changed files with 2109 additions and 82 deletions

View File

@ -16,6 +16,11 @@ public class NPCAnimationController : MonoBehaviour
private NavMeshAgent agent;
private Animator animator;
public Developer Developer;
[SerializeField]
private bool _canTakeNewJob;
private void Awake()
{
agent = GetComponent<NavMeshAgent>();
@ -25,21 +30,23 @@ public class NPCAnimationController : MonoBehaviour
}
private IEnumerator GetToWorkRoutine()
{
yield return TakeLock();
animator.SetLayerWeight(animator.GetLayerIndex("Typing"), 0);
animator.SetTrigger("Walk");
yield return new WaitUntil(() => animator.GetCurrentAnimatorStateInfo(0).IsName("WalkBack"));
MoveTo(workPosition.position);
yield return new WaitUntil(() => agent.remainingDistance <= agent.stoppingDistance);
animator.ResetTrigger("Walk"); // Setze den Lauf-Trigger zurück
animator.ResetTrigger("Walk"); // Setze den Lauf-Trigger zur<EFBFBD>ck
animator.SetTrigger("SitDown");
yield return new WaitUntil(() => animator.GetCurrentAnimatorStateInfo(0).IsName("Sit"));
transform.rotation = workPosition.rotation;
yield return StartCoroutine(FadeLayerWeight(animator.GetLayerIndex("Typing"), 1, 1f));
ReleaseLock();
}
private IEnumerator FadeLayerWeight(int layerIndex, float targetWeight, float duration)
private IEnumerator FadeLayerWeight(int layerIndex, float targetWeight, float duration)
{
float time = 0;
float startWeight = animator.GetLayerWeight(layerIndex);
@ -56,14 +63,24 @@ public class NPCAnimationController : MonoBehaviour
public void DrinkCoffee()
{
StartCoroutine(DrinkCoffeeRoutine());
}
private IEnumerator TakeLock()
{
yield return new WaitUntil(() => _canTakeNewJob);
_canTakeNewJob = false;
}
private void ReleaseLock()
{
_canTakeNewJob = true;
}
private IEnumerator DrinkCoffeeRoutine()
{
yield return TakeLock();
yield return StartCoroutine(FadeLayerWeight(animator.GetLayerIndex("Coffee"), 1, 1f)); // 1 Sekunde zum Einblenden
animator.SetTrigger("DrinkCoffee");
@ -78,7 +95,7 @@ public class NPCAnimationController : MonoBehaviour
animator.ResetTrigger("DrinkCoffee");
Cup.SetActive(true);
ReleaseLock();
}
public void GoToToilet()
@ -88,7 +105,17 @@ public class NPCAnimationController : MonoBehaviour
private IEnumerator GoToToiletRoutine()
{
yield return TakeLock();
yield return StartCoroutine(FadeLayerWeight(animator.GetLayerIndex("Typing"), 0, 1f));
while (ToiletManager.Instance.IsOccupied)
{
yield return new WaitForSeconds(2);
}
ToiletManager.Instance.IsOccupied = true;
// Beginne mit dem Laufen zur Toilette.
animator.SetTrigger("Walk");
yield return new WaitUntil(() => animator.GetCurrentAnimatorStateInfo(0).IsName("Walk"));
@ -97,24 +124,33 @@ public class NPCAnimationController : MonoBehaviour
yield return new WaitUntil(() => agent.remainingDistance <= agent.stoppingDistance);
// Hört auf zu laufen und beginnt zu sitzen.
animator.ResetTrigger("Walk"); // Es ist wichtig, den vorherigen Trigger zurückzusetzen
// H<EFBFBD>rt auf zu laufen und beginnt zu sitzen.
animator.ResetTrigger("Walk"); // Es ist wichtig, den vorherigen Trigger zur<EFBFBD>ckzusetzen
transform.LookAt(new Vector3(toiletLookAtTransform.position.x, toiletLookAtTransform.position.y, toiletLookAtTransform.position.z));
animator.SetTrigger("SitDown");
transform.LookAt(new Vector3(toiletLookAtTransform.position.x, toiletLookAtTransform.position.y, toiletLookAtTransform.position.z));
yield return new WaitUntil(() => animator.GetCurrentAnimatorStateInfo(0).IsName("Ready"));
// Stehe auf und gehe zurück zum Ausgangspunkt.
Developer.Pee(1.0, true);
// Stehe auf und gehe zur<75>ck zum Ausgangspunkt.
transform.LookAt(new Vector3(toiletLookAtTransform.position.x, toiletLookAtTransform.position.y, toiletLookAtTransform.position.z));
animator.ResetTrigger("SitDown"); // Setze den Sitzen-Trigger zurück
animator.ResetTrigger("SitDown"); // Setze den Sitzen-Trigger zur<75>ck
ToiletManager.Instance.IsOccupied = false;
animator.SetTrigger("Walk");
yield return new WaitUntil(() => animator.GetCurrentAnimatorStateInfo(0).IsName("WalkBack"));
MoveTo(workPosition.position);
yield return new WaitUntil(() => agent.remainingDistance <= agent.stoppingDistance);
animator.ResetTrigger("Walk"); // Setze den Lauf-Trigger zurück
animator.ResetTrigger("Walk"); // Setze den Lauf-Trigger zur<EFBFBD>ck
animator.SetTrigger("SitDown");
yield return new WaitUntil(() => animator.GetCurrentAnimatorStateInfo(0).IsName("Sit"));
transform.rotation = workPosition.rotation;
yield return StartCoroutine(FadeLayerWeight(animator.GetLayerIndex("Typing"), 1, 1f));
ReleaseLock();
}
// Hier kannst du entscheiden, ob der Charakter wieder sitzt oder steht.
// Beispiel: Setze IsSitting oder IsStanding entsprechend.
@ -126,12 +162,15 @@ public class NPCAnimationController : MonoBehaviour
private IEnumerator GettingMadRoutine()
{
yield return TakeLock();
animator.SetTrigger("GetMad");
yield return StartCoroutine(FadeLayerWeight(animator.GetLayerIndex("Coffee"), 1, 2f)); // 1 Sekunde zum Einblenden
yield return new WaitForSeconds(8f);
yield return StartCoroutine(FadeLayerWeight(animator.GetLayerIndex("Coffee"), 0, 1f)); // 1 Sekunde zum Ausblenden
animator.ResetTrigger("GetMad");
ReleaseLock();
}
public void CaffeinOverdose()
@ -141,6 +180,8 @@ public class NPCAnimationController : MonoBehaviour
private IEnumerator CaffeinRoutine()
{
yield return TakeLock();
yield return StartCoroutine(FadeLayerWeight(animator.GetLayerIndex("Typing"), 0, 1f));
// Beginne mit dem Laufen zur Toilette.
animator.SetTrigger("Walk");
@ -149,24 +190,23 @@ public class NPCAnimationController : MonoBehaviour
yield return new WaitUntil(() => agent.remainingDistance <= agent.stoppingDistance);
animator.ResetTrigger("Walk");
animator.SetTrigger("TooMuchCaffein");
yield return new WaitForSeconds(8f);
yield return new WaitWhile(() => Developer.IsOvercaffeinated);
animator.ResetTrigger("TooMuchCaffein");
animator.SetTrigger("Walk");
yield return new WaitUntil(() => animator.GetCurrentAnimatorStateInfo(0).IsName("WalkBack"));
MoveTo(workPosition.position);
yield return new WaitUntil(() => agent.remainingDistance <= agent.stoppingDistance);
transform.rotation = workPosition.rotation;
animator.ResetTrigger("Walk"); // Setze den Lauf-Trigger zurück
animator.ResetTrigger("Walk"); // Setze den Lauf-Trigger zur<EFBFBD>ck
animator.SetTrigger("SitDown");
yield return new WaitUntil(() => animator.GetCurrentAnimatorStateInfo(0).IsName("Sit"));
yield return StartCoroutine(FadeLayerWeight(animator.GetLayerIndex("Typing"), 1, 1f));
ReleaseLock();
}
private void MoveTo(Vector3 destination)
{
agent.destination = destination;
@ -175,28 +215,27 @@ public class NPCAnimationController : MonoBehaviour
private void Update()
{
// Prüft, ob der Buchstabe 'C' gedrückt wurde
// Pr<EFBFBD>ft, ob der Buchstabe 'C' gedr<64>ckt wurde
if (Input.GetKeyDown(KeyCode.C))
{
DrinkCoffee();
}
// Prüft, ob der Buchstabe 'T' gedrückt wurde
// Pr<EFBFBD>ft, ob der Buchstabe 'T' gedr<64>ckt wurde
if (Input.GetKeyDown(KeyCode.T))
{
GoToToilet();
}
// Prüft, ob der Buchstabe 'M' gedrückt wurde
// Pr<EFBFBD>ft, ob der Buchstabe 'M' gedr<64>ckt wurde
if (Input.GetKeyDown(KeyCode.M))
{
GettingMad();
}
// Prüft, ob der Buchstabe 'C' gedrückt wurde
// Pr<EFBFBD>ft, ob der Buchstabe 'C' gedr<64>ckt wurde
if (Input.GetKeyDown(KeyCode.O))
{
CaffeinOverdose();
}
}
}

View File

@ -1,7 +0,0 @@
fileFormatVersion: 2
guid: 73951a4b66414d24999d439134425a40
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -38,7 +38,7 @@ public class DeveloperInfoUi : MonoBehaviour
// Update is called once per frame
void Update()
{
_happinessImage.color = _statusGradient.Evaluate((float)_developer.CurrentUrgeToUrinate);
_happinessImage.color = _statusGradient.Evaluate((float)_developer.CurrentHappiness);
_caffeineImage.color = _statusGradient.Evaluate((float)_developer.CurrentCaffeination);
_hungerImage.color = _statusGradient.Evaluate((float)_developer.CurrentHunger);
_toiletImage.color = _statusGradient.Evaluate((float)_developer.CurrentUrgeToUrinate);

View File

@ -6,7 +6,7 @@ TextureImporter:
serializedVersion: 12
mipmaps:
mipMapMode: 0
enableMipMap: 1
enableMipMap: 0
sRGBTexture: 1
linearTexture: 0
fadeOut: 0
@ -37,24 +37,24 @@ TextureImporter:
filterMode: 1
aniso: 1
mipBias: 0
wrapU: 0
wrapV: 0
wrapU: 1
wrapV: 1
wrapW: 0
nPOTScale: 1
nPOTScale: 0
lightmap: 0
compressionQuality: 50
spriteMode: 0
spriteMode: 1
spriteExtrude: 1
spriteMeshType: 1
spriteMeshType: 0
alignment: 0
spritePivot: {x: 0.5, y: 0.5}
spritePixelsToUnits: 100
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
spritePixelsToUnits: 1000
spriteBorder: {x: 300, y: 300, z: 300, w: 300}
spriteGenerateFallbackPhysicsShape: 1
alphaUsage: 1
alphaIsTransparency: 0
alphaIsTransparency: 1
spriteTessellationDetail: -1
textureType: 0
textureType: 8
textureShape: 1
singleChannelComponent: 0
flipbookRows: 1
@ -112,8 +112,8 @@ TextureImporter:
outline: []
physicsShape: []
bones: []
spriteID:
internalID: 0
spriteID: 5e97eb03825dee720800000000000000
internalID: 1537655665
vertices: []
indices:
edges: []

File diff suppressed because it is too large Load Diff

View File

@ -122,6 +122,8 @@ public class Developer : MonoBehaviour
private List<GameObject> _needList = new List<GameObject>();
private bool _isDead = false;
[SerializeField] private NPCAnimationController _npcAnimation;
/// <summary>
/// indicates wether the Dev is dead or not
/// </summary>
@ -146,6 +148,9 @@ public class Developer : MonoBehaviour
private bool _hasTalkedWhileOvercaffeinated = false;
private bool _hasTalkedBeforeSleeping = false;
public bool IsOvercaffeinated => _isOvercaffeinated;
public bool IsHyperactive => _isHyperactive;
void Start()
{
_developerNeeds = gameObject.GetComponent<DeveloperNeeds>();
@ -237,9 +242,11 @@ public class Developer : MonoBehaviour
_happiness += 0.2;
}
_urgeToUrinateLevel -= caffeineAmount / 0.5f;
_urgeToUrinateLevel -= caffeineAmount / 2.0;
_wantedDrink = WantedConsumable.None;
_npcAnimation.DrinkCoffee();
}
public void GiveFood(double foodAmount, WantedConsumable foodType)
@ -272,7 +279,7 @@ public class Developer : MonoBehaviour
_happiness += 0.2;
}
_urgeToUrinateLevel -= foodAmount / 0.5f;
_urgeToUrinateLevel -= foodAmount / 2.0;
_wantedFood = WantedConsumable.None;
}
@ -307,7 +314,7 @@ public class Developer : MonoBehaviour
_caffeineLevel -= caffeineDrain * _baseStats.CaffeineDrainFactor;
_hungerLevel -= hungerDrain * _baseStats.HungerDrainFactor;
_urgeToUrinateLevel -= urinationDrain * _baseStats.UrinationDrainFactor;
_happiness -= happinessDrain * _baseStats.UrinationDrainFactor;
_happiness -= happinessDrain * _baseStats.HappinessDrainFactor;
_caffeineLevel = Math.Max(_caffeineLevel, 0.0);
_hungerLevel = Math.Max(_hungerLevel, 0.0);
@ -315,7 +322,15 @@ public class Developer : MonoBehaviour
_happiness = Math.Max(_happiness, 0.0);
_isHyperactive = _caffeineLevel > 1.0 && _caffeineLevel <= 1.5;
bool wasOvercaffeinated = _isOvercaffeinated;
_isOvercaffeinated = _caffeineLevel > 1.5;
if (!wasOvercaffeinated && _isOvercaffeinated)
{
_npcAnimation.CaffeinOverdose();
}
_isSleeping = _caffeineLevel <= 0.0;
if (_caffeineLevel < GameManager.Instance.NeedNotificationThreshold && _caffeineNeed == null)
@ -351,6 +366,8 @@ public class Developer : MonoBehaviour
_toiletNeed = _developerNeeds.SpawnToiletNeed(_needList.Count);
_needList.Add(_toiletNeed);
_npcAnimation.GoToToilet();
}
if (_hungerLevel <= 0.0)
@ -458,11 +475,13 @@ public class Developer : MonoBehaviour
private double CalculateUrinationEfficiency()
{
if (_urgeToUrinateLevel > 1.0)
if (_urgeToUrinateLevel > GameManager.Instance.NeedNotificationThreshold)
return 1.0;
// https://easings.net/#easeOutExpo
return Math.Abs(_urgeToUrinateLevel - 1.0) < 0.0001f ? 1.0 : 1.0 - Math.Pow(2, -10 * _urgeToUrinateLevel);
return _urgeToUrinateLevel / GameManager.Instance.NeedNotificationThreshold;
//Math.Abs(_urgeToUrinateLevel - 1.0) < 0.0001f ? 1.0 : 1.0 - Math.Pow(2, -10 * _urgeToUrinateLevel);
}
private double CalculateHappinessEfficiency()

View File

@ -153,15 +153,27 @@ public partial class GameManager : MonoBehaviourSingleton<GameManager>
}
}
[SerializeField]
private bool _won;
public bool Won => _won;
[SerializeField]
private bool _lost;
public bool Lost => _lost;
private void EndGame(EndGameCondition endGameCondition)
{
if (endGameCondition.IsWin())
{
Debug.Log("You won!");
_won = true;
}
else if (endGameCondition.IsLose())
{
Debug.Log("You lost!");
_lost = true;
}
Debug.Log(endGameCondition.GetEndGameMessage());

View File

@ -47,7 +47,14 @@ public class TimeManager : MonoBehaviourSingleton<TimeManager>
double realSeconds = GameManager.Instance.ExpectedRemainingGameDuration;
double gameDays = realSeconds / _secondsPerDay;
return CurrentDate.AddDays(gameDays);
if (double.IsFinite(gameDays))
{
return CurrentDate.AddDays(gameDays);
}
else
{
return DateTime.MaxValue;
}
}
}

View File

@ -4,6 +4,7 @@ using System.Collections.Generic;
using Interaction;
using TMPro;
using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.Serialization;
using UnityEngine.UI;
@ -38,11 +39,17 @@ public class UiController : MonoBehaviour
[SerializeField] private Gradient _deadlineTextColors;
public GameObject WinScreen;
public GameObject LoseScreen;
void Update()
{
UpdateActionDisplay();
UpdateProgressBar();
UpdateDeadlineDateStuffTexts();
WinScreen.SetActive(GameManager.Instance.Won);
LoseScreen.SetActive(GameManager.Instance.Lost);
}
private void UpdateProgressBar()
@ -59,7 +66,7 @@ public class UiController : MonoBehaviour
{
_currentDateText.text = $"Aktuelle Zeit: {TimeManager.Instance.CurrentDate: dddd dd.MM.yy hh U\\hr}";
_deadlineText.text = $"Deadline: {TimeManager.Instance.Deadline: dddd dd.MM.yy hh U\\hr}";
_predictedEndText.text = $"Vorraussichtlich fertig: {TimeManager.Instance.PredictedEndDate: dddd dd.MM.yy hh U\\hr}";
_predictedEndText.text = $"Vorraussichtlich fertig: {(TimeManager.Instance.PredictedEndDate == DateTime.MaxValue ? "Nie" : TimeManager.Instance.PredictedEndDate.ToString("dddd dd.MM.yy hh U\\hr"))}";
_predictedEndText.color = _deadlineTextColors.Evaluate(TimeManager.Instance.PredictedMissesDeadline ? 0.0f : 1.0f);
}
@ -97,4 +104,16 @@ public class UiController : MonoBehaviour
//_prevActionButton.interactable = _pickupper.CanSelectPrevious;
//_nextActionButton.interactable = _pickupper.CanSelectNext;
}
public void Replay()
{
string currentSceneName = SceneManager.GetActiveScene().name;
SceneManager.LoadScene(currentSceneName);
}
public void Exit()
{
UnityEditor.EditorApplication.isPlaying = false;
Application.Quit();
}
}

View File

@ -0,0 +1,9 @@
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Utility;
public class ToiletManager : MonoBehaviourSingleton<ToiletManager>
{
public bool IsOccupied;
}

View File

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 459a8de1571412a44927af6c9cc4ef5e
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant: