Entwickler haben also Bedürfnisse?

This commit is contained in:
Simon Lübeß 2024-04-05 19:24:26 +02:00
parent 17dbb6a356
commit 1bae35b3be
9 changed files with 14720 additions and 15 deletions

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 094c049ae10f1c3419c96c4bce41cf8c
timeCreated: 1486485857
licenseType: Store
NativeFormatImporter:
userData:
assetBundleName:
assetBundleVariant:

View File

@ -997,6 +997,201 @@ RectTransform:
m_AnchoredPosition: {x: 117, y: -165.8}
m_SizeDelta: {x: 200, y: 50}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!1 &983523618
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 983523620}
- component: {fileID: 983523619}
- component: {fileID: 983523622}
- component: {fileID: 983523621}
- component: {fileID: 983523623}
m_Layer: 0
m_Name: Dev1
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!114 &983523619
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 983523618}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 6dcc72027d5c35441a351fdb5140b0f8, type: 3}
m_Name:
m_EditorClassIdentifier:
_baseStats:
BaseEfficiency: 1
Fingers: 10
CaffeineDrainFactor: 1
HungerDrainFactor: 1
UrinationDrainFactor: 1
_currentEfficiency: 1
_fingersLeft: 10
_caffeineLevel: 1
_hungerLevel: 1
_urinationDrain: 1
_isSleeping: 0
_isHyperactive: 0
_isOvercaffeinated: 0
_developerNeeds: {fileID: 0}
_caffeineNeed: {fileID: 0}
_hungerNeed: {fileID: 0}
_toiletNeed: {fileID: 0}
--- !u!4 &983523620
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 983523618}
serializedVersion: 2
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 1.7602714, y: 10.847181, z: -9.905458}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 0}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!114 &983523621
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 983523618}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: ef5183dac70a54b4cbed3e05d617524f, type: 3}
m_Name:
m_EditorClassIdentifier:
context: going for a walk, falling, explosion, blood
gender: MALE
speakingSpeed: 1.1
playSound: 0
generate: 0
--- !u!114 &983523622
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 983523618}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: f7e417f330c4dd845a8f3dc744dff25a, type: 3}
m_Name:
m_EditorClassIdentifier:
Needs:
- {fileID: 2907046783514947559, guid: 92b71cfc6a2687d44b165ead746233f0, type: 3}
- {fileID: 3355435593704932208, guid: b31fb59d198e53b459943bf898293618, type: 3}
- {fileID: 2405502523364773131, guid: b396df2098c22e1488c2c2769c6ddcd6, type: 3}
- {fileID: 7697340910557049827, guid: 5d809e3a343d45f4185615db92384dc7, type: 3}
--- !u!82 &983523623
AudioSource:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 983523618}
m_Enabled: 1
serializedVersion: 4
OutputAudioMixerGroup: {fileID: 0}
m_audioClip: {fileID: 0}
m_PlayOnAwake: 1
m_Volume: 1
m_Pitch: 1
Loop: 0
Mute: 0
Spatialize: 0
SpatializePostEffects: 0
Priority: 128
DopplerLevel: 1
MinDistance: 1
MaxDistance: 500
Pan2D: 0
rolloffMode: 0
BypassEffects: 0
BypassListenerEffects: 0
BypassReverbZones: 0
rolloffCustomCurve:
serializedVersion: 2
m_Curve:
- serializedVersion: 3
time: 0
value: 1
inSlope: 0
outSlope: 0
tangentMode: 0
weightedMode: 0
inWeight: 0.33333334
outWeight: 0.33333334
- serializedVersion: 3
time: 1
value: 0
inSlope: 0
outSlope: 0
tangentMode: 0
weightedMode: 0
inWeight: 0.33333334
outWeight: 0.33333334
m_PreInfinity: 2
m_PostInfinity: 2
m_RotationOrder: 4
panLevelCustomCurve:
serializedVersion: 2
m_Curve:
- serializedVersion: 3
time: 0
value: 0
inSlope: 0
outSlope: 0
tangentMode: 0
weightedMode: 0
inWeight: 0.33333334
outWeight: 0.33333334
m_PreInfinity: 2
m_PostInfinity: 2
m_RotationOrder: 4
spreadCustomCurve:
serializedVersion: 2
m_Curve:
- serializedVersion: 3
time: 0
value: 0
inSlope: 0
outSlope: 0
tangentMode: 0
weightedMode: 0
inWeight: 0.33333334
outWeight: 0.33333334
m_PreInfinity: 2
m_PostInfinity: 2
m_RotationOrder: 4
reverbZoneMixCustomCurve:
serializedVersion: 2
m_Curve:
- serializedVersion: 3
time: 0
value: 1
inSlope: 0
outSlope: 0
tangentMode: 0
weightedMode: 0
inWeight: 0.33333334
outWeight: 0.33333334
m_PreInfinity: 2
m_PostInfinity: 2
m_RotationOrder: 4
--- !u!1 &1088929059
GameObject:
m_ObjectHideFlags: 0
@ -1451,6 +1646,14 @@ PrefabInstance:
propertyPath: m_LocalEulerAnglesHint.z
value: 0
objectReference: {fileID: 0}
- target: {fileID: 3650884189301972455, guid: e1e33f0b2075b5c40817665dd8a86f31, type: 3}
propertyPath: _developers.Array.size
value: 1
objectReference: {fileID: 0}
- target: {fileID: 3650884189301972455, guid: e1e33f0b2075b5c40817665dd8a86f31, type: 3}
propertyPath: _developers.Array.data[0]
value:
objectReference: {fileID: 983523619}
m_RemovedComponents: []
m_RemovedGameObjects: []
m_AddedGameObjects: []
@ -1548,6 +1751,112 @@ Transform:
m_Children: []
m_Father: {fileID: 0}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!1 &2113596626
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 2113596630}
- component: {fileID: 2113596629}
- component: {fileID: 2113596628}
- component: {fileID: 2113596627}
m_Layer: 0
m_Name: Quad
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!64 &2113596627
MeshCollider:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2113596626}
m_Material: {fileID: 0}
m_IncludeLayers:
serializedVersion: 2
m_Bits: 0
m_ExcludeLayers:
serializedVersion: 2
m_Bits: 0
m_LayerOverridePriority: 0
m_IsTrigger: 0
m_ProvidesContacts: 0
m_Enabled: 1
serializedVersion: 5
m_Convex: 0
m_CookingOptions: 30
m_Mesh: {fileID: 10210, guid: 0000000000000000e000000000000000, type: 0}
--- !u!23 &2113596628
MeshRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2113596626}
m_Enabled: 1
m_CastShadows: 1
m_ReceiveShadows: 1
m_DynamicOccludee: 1
m_StaticShadowCaster: 0
m_MotionVectors: 1
m_LightProbeUsage: 1
m_ReflectionProbeUsage: 1
m_RayTracingMode: 2
m_RayTraceProcedural: 0
m_RenderingLayerMask: 1
m_RendererPriority: 0
m_Materials:
- {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0}
m_StaticBatchInfo:
firstSubMesh: 0
subMeshCount: 0
m_StaticBatchRoot: {fileID: 0}
m_ProbeAnchor: {fileID: 0}
m_LightProbeVolumeOverride: {fileID: 0}
m_ScaleInLightmap: 1
m_ReceiveGI: 1
m_PreserveUVs: 0
m_IgnoreNormalsForChartDetection: 0
m_ImportantGI: 0
m_StitchLightmapSeams: 1
m_SelectedEditorRenderState: 3
m_MinimumChartSize: 4
m_AutoUVMaxDistance: 0.5
m_AutoUVMaxAngle: 89
m_LightmapParameters: {fileID: 0}
m_SortingLayerID: 0
m_SortingLayer: 0
m_SortingOrder: 0
m_AdditionalVertexStreams: {fileID: 0}
--- !u!33 &2113596629
MeshFilter:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2113596626}
m_Mesh: {fileID: 10210, guid: 0000000000000000e000000000000000, type: 0}
--- !u!4 &2113596630
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2113596626}
serializedVersion: 2
m_LocalRotation: {x: 0.7071068, y: 0, z: 0, w: 0.7071068}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 33.02, y: 33.02, z: 33.02}
m_ConstrainProportionsScale: 1
m_Children: []
m_Father: {fileID: 0}
m_LocalEulerAnglesHint: {x: 90, y: 0, z: 0}
--- !u!1660057539 &9223372036854775807
SceneRoots:
m_ObjectHideFlags: 0
@ -1558,3 +1867,5 @@ SceneRoots:
- {fileID: 4836486}
- {fileID: 845814462}
- {fileID: 1648641904}
- {fileID: 2113596630}
- {fileID: 983523620}

View File

@ -1,26 +1,70 @@
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Serialization;
using Utility;
[Serializable]
public struct DeveloperStats
{
public double BaseEfficiency;
public int Fingers;
public double CaffeineDrainFactor;
public double HungerDrainFactor;
[FormerlySerializedAs("UrgeToUrinateFillFactor")] public double UrinationDrainFactor;
public DeveloperStats(double baseEfficiency, int fingers, double caffeineDrainFactor, double hungerDrainFactor, double urinationDrainFactor)
{
BaseEfficiency = baseEfficiency;
Fingers = fingers;
CaffeineDrainFactor = caffeineDrainFactor;
HungerDrainFactor = hungerDrainFactor;
UrinationDrainFactor = urinationDrainFactor;
}
public static readonly DeveloperStats Default = new DeveloperStats(1.0, 10, 1, 1, 1);
}
public class Developer : MonoBehaviour
{
private string _name;
[SerializeField]
private double _baseEfficiency = 1.0;
private DeveloperStats _baseStats = DeveloperStats.Default;
[SerializeField, ShowOnly]
private double _currentCurrentEfficiency = 1.0;
[FormerlySerializedAs("_currentCurrentEfficiency")] [SerializeField, ShowOnly]
private double _currentEfficiency = 1.0;
[SerializeField]
private int _fingersLeft = 10;
[SerializeField]
private double _caffeineLevel = 1.0;
[SerializeField]
private double _hungerLevel = 1.0;
[FormerlySerializedAs("_urgeToUrinateLevel")] [SerializeField]
private double _urinationDrain = 1.0;
[SerializeField, ShowOnly]
private bool _isSleeping = false;
[SerializeField, ShowOnly]
private bool _isHyperactive = false;
[SerializeField, ShowOnly]
private bool _isOvercaffeinated = false;
[SerializeField]
private DeveloperNeeds _developerNeeds;
/// <summary>
/// Gibt die Grundeffizienz des Entwicklers zurück.
/// Gibt die Grunddaten des Entwicklers zurück.
/// </summary>
public double BaseEfficiency => _baseEfficiency;
public DeveloperStats BaseStats => _baseStats;
/// <summary>
/// Gibt die Anzahl der Finger zurück.
@ -30,15 +74,153 @@ public class Developer : MonoBehaviour
/// <summary>
/// Gibt die aktuelle Effizienz des Entwicklers in Prozent zurück.
/// </summary>
public double CurrentEfficiency => _currentCurrentEfficiency;
public double CurrentEfficiency => _currentEfficiency;
public string Name => _name;
public void UpdateEfficiency()
[SerializeField]
private GameObject _caffeineNeed;
[SerializeField]
private GameObject _hungerNeed;
[SerializeField]
private GameObject _toiletNeed;
void Start()
{
_currentCurrentEfficiency = _baseEfficiency * (_fingersLeft / 10.0);
_developerNeeds = gameObject.GetComponent<DeveloperNeeds>();
_fingersLeft = _baseStats.Fingers;
}
[ContextMenu("Give Drink")]
private void TestDrink()
{
GiveDrink(0.25);
}
[ContextMenu("Give Food")]
private void TestFood()
{
GiveFood(0.25);
}
[ContextMenu("Drain Bladder")]
private void TestPee()
{
Pee(0.25);
}
public void GiveDrink(double caffeineAmount)
{
_caffeineLevel += caffeineAmount;
if (_caffeineNeed != null && _caffeineLevel > GameManager.Instance.NeedNotificationThreshold)
{
NeedFullfilled(_caffeineNeed);
}
}
public void GiveFood(double foodAmount)
{
_hungerLevel += foodAmount;
if (_hungerNeed != null && _hungerLevel > GameManager.Instance.NeedNotificationThreshold)
{
NeedFullfilled(_hungerNeed);
}
}
public void Pee(double peeAmount)
{
_urinationDrain += peeAmount;
if (_toiletNeed != null && _urinationDrain > GameManager.Instance.NeedNotificationThreshold)
{
NeedFullfilled(_toiletNeed);
}
}
public void UpdateStats(double caffeineDrain, double hungerDrain, double urinationDrain)
{
_caffeineLevel -= caffeineDrain * _baseStats.CaffeineDrainFactor;
_hungerLevel -= hungerDrain * _baseStats.HungerDrainFactor;
_urinationDrain -= urinationDrain * _baseStats.UrinationDrainFactor;
_caffeineLevel = Math.Clamp(_caffeineLevel, 0.0, 2.0);
_hungerLevel = Math.Clamp(_hungerLevel, 0.0, 1.0);
_urinationDrain = Math.Clamp(_urinationDrain, 0.0, 1.0);
_isHyperactive = _caffeineLevel > 1.0;
_isOvercaffeinated = _caffeineLevel > 1.5;
_isSleeping = _caffeineLevel <= 0.0;
if (_caffeineLevel < GameManager.Instance.NeedNotificationThreshold && _caffeineNeed == null)
{
_caffeineNeed = _developerNeeds.SpawnCaffeineNeed();
}
if (_hungerLevel < GameManager.Instance.NeedNotificationThreshold && _hungerNeed == null)
{
_hungerNeed = _developerNeeds.SpawnHungerNeed();
}
if (_urinationDrain < GameManager.Instance.NeedNotificationThreshold && _toiletNeed == null)
{
// TODO: Go to toilet
Debug.Log("Ich muss aufs Klo!");
_toiletNeed = _developerNeeds.SpawnToiletNeed();
}
if (_hungerLevel <= 0.0)
{
Die();
}
}
private void NeedFullfilled(GameObject needObject)
{
Instantiate(GameManager.Instance.NeedFullfilledParticleEffect, needObject.transform.position, needObject.transform.rotation);
Destroy(needObject);
}
public void UpdateEfficiency()
{
_currentEfficiency = _baseStats.BaseEfficiency * (_fingersLeft / 10.0) * CalculateCaffeineEfficiency() * CalculateHungerEfficiency() * CalculateUrinationEfficiency();
}
// TODO: Es könnte sich als schwierig erweisen, die Effizienz hoch zu halten.
// Man könnte ggf. die Funktionen so anpassen, dass sie eine ganze Weile 100% Effizienz geben.
private double CalculateCaffeineEfficiency()
{
if (_isSleeping)
return 0.0;
// Die Formel hat schon recht vielversprechendes Verhalten im Bereich > 1
//if (_isHyperactive)
// return 1.0 + (_caffeineLevel - 1.0) * (_caffeineLevel - 1.0);
if (_isOvercaffeinated)
return 0.0;
// https://easings.net/#easeOutCubic
return 1.0 - Math.Pow(1.0 - _caffeineLevel, 3.0);
}
private double CalculateHungerEfficiency()
{
// https://easings.net/#easeOutCirc
return Math.Sqrt(1.0 - Math.Pow(_caffeineLevel - 1.0, 2.0));
}
private double CalculateUrinationEfficiency()
{
// https://easings.net/#easeOutExpo
return Math.Abs(_urinationDrain - 1.0) < 0.0001f ? 1.0 : 1.0 - Math.Pow(2, -10 * _urinationDrain);
}
/// <summary>
/// Der Entwickler wird verletzt und der Idiot bricht sich ausgerechnet einen Finger...
/// </summary>

View File

@ -22,6 +22,14 @@ public class DeveloperNeeds : MonoBehaviour
}
// TODO: Enums statt strings verwenden
// TODO: Multiple Needs möglich übereinander anzeigen?
public GameObject SpawnCaffeineNeed() => spawnNeed(Random.Range(0.0f, 1.0f) < 0.5f ? "coffee" : "mate");
public GameObject SpawnToiletNeed() => spawnNeed("toilet");
public GameObject SpawnHungerNeed() => spawnNeed("hunger");
public GameObject SpawnMoneyNeed() => spawnNeed("money");
public GameObject spawnNeed(string needName)
{
@ -47,6 +55,7 @@ public class DeveloperNeeds : MonoBehaviour
context = "The NPC wants a raise, The NPC needs more money";
break;
default:
Debug.LogError($"Unbekannter need \"{needName}\"");
break;
}

View File

@ -1,3 +1,4 @@
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
@ -7,7 +8,9 @@ using Utility;
public partial class GameManager : MonoBehaviourSingleton<GameManager>
{
[SerializeField] private Difficulty _difficulty = Difficulty.Medium;
[SerializeField] private Difficulty _difficulty = Difficulty.Medium;
public GameObject NeedFullfilledParticleEffect;
[SerializeField]
private double _totalGameDurationSeconds;
@ -18,14 +21,25 @@ public partial class GameManager : MonoBehaviourSingleton<GameManager>
[SerializeField, ShowOnly]
private double _currentEfficiency = 0.0;
[SerializeField]
private double _generalNeedDrainScaling = 0.001;
[SerializeField]
private List<Developer> _developers = new();
[SerializeField]
private MultiFalsableBool _gameRunning = new(false);
[SerializeField, Tooltip("Der Schwellwert am dem eine Benachrichtigung für das Bedürfnis ausgelöst wird.")]
private double _needNotificationThreshold = 0.25;
[SerializeField]
private DifficultySettings _difficultySettings;
public Difficulty Difficulty => _difficulty;
public double NeedNotificationThreshold => _needNotificationThreshold;
/// <summary>
/// Wie weit das Spiel bereits fortgeschritten ist.
/// </summary>
@ -57,7 +71,9 @@ public partial class GameManager : MonoBehaviourSingleton<GameManager>
{
TimeManager.Instance.Init();
_totalGameDurationSeconds = TimeManager.Instance.CalculateActualDeveloperTime(_difficulty, 4);
_difficultySettings = _difficulty.GetSettings();
_totalGameDurationSeconds = TimeManager.Instance.CalculateActualDeveloperTime(_difficultySettings, 4);
_remainingGameDurationSeconds = _totalGameDurationSeconds;
@ -131,8 +147,13 @@ public partial class GameManager : MonoBehaviourSingleton<GameManager>
{
double developerEfficiency = 0.0f;
double caffeineDrain = _generalNeedDrainScaling * Math.Pow(2, _difficultySettings.CaffeineDrainScaling * GameProgress);
double hungerDrain = _generalNeedDrainScaling * Math.Pow(2, _difficultySettings.HungerDrainScaling * GameProgress);
double urinationDrain = _generalNeedDrainScaling * Math.Pow(2, _difficultySettings.UrinationDrainScaling * GameProgress);
foreach (Developer developer in _developers)
{
developer.UpdateStats(caffeineDrain, hungerDrain, urinationDrain);
developer.UpdateEfficiency();
developerEfficiency += developer.CurrentEfficiency;
}

View File

@ -155,6 +155,7 @@ public class NPC_Behavior : MonoBehaviour
/// Deletes the current need and its gameobject.
/// </summary>
/// <returns>bool: wether successfully deleted the gameobject or not</returns>
[ContextMenu("Fullfill Need")]
public bool NeedFullfilled()
{
Destroy(_currentNeed);

View File

@ -54,11 +54,9 @@ public class TimeManager : MonoBehaviourSingleton<TimeManager>
/// <summary>
/// Berechnet die (real life) Sekunden, die die Entwickler bei 100% Effizienz benötigen um das Spiel bei gegebener Schwierigkeit zu entwickeln.
/// </summary>
public double CalculateActualDeveloperTime(Difficulty difficulty, int developerCount)
public double CalculateActualDeveloperTime(DifficultySettings difficultySettings, int developerCount)
{
DifficultySettings settings = difficulty.GetSettings();
return (_daysUntilRelease * _secondsPerDay * developerCount) / settings.DaysUntilReleaseFactor;
return (_daysUntilRelease * _secondsPerDay * developerCount) / difficultySettings.DaysUntilReleaseFactor;
}
void Update()

View File

@ -9,6 +9,7 @@ namespace Utility
Hard
}
[Serializable]
public abstract class DifficultySettings
{
public Difficulty Difficulty { get; protected set; }
@ -17,6 +18,10 @@ namespace Utility
/// Faktor, wie viel mehr Zeit man halt als die Entwickler bei 100% effizienz benötigen.
/// </summary>
public double DaysUntilReleaseFactor { get; protected set; }
public double CaffeineDrainScaling { get; protected set; }
public double HungerDrainScaling { get; protected set; }
public double UrinationDrainScaling { get; protected set; }
}
public class EasyDifficulty : DifficultySettings
@ -34,6 +39,9 @@ namespace Utility
{
Difficulty = Difficulty.Medium;
DaysUntilReleaseFactor = 1.5;
CaffeineDrainScaling = 1.5;
HungerDrainScaling = 1.5;
UrinationDrainScaling = 1.5;
}
}