Files
beyond/Assets/Scripts/Controllers/Confession/PlayerConfessionController.cs
2024-11-20 15:21:28 +01:00

241 lines
7.2 KiB
C#

using System;
using System.Collections;
using System.Collections.Generic;
using PixelCrushers.QuestMachine;
using Sirenix.OdinInspector;
using UnityEngine;
using UnityEngine.Events;
namespace Beyond
{
public class PlayerConfessionController : MonoBehaviour
{
[SerializeField] private List<Quest> m_guilts = new List<Quest>();
private QuestJournal m_questJournal;
private List<string> m_guiltsToBeForgiven = new List<string>();
private List<string> m_guiltsNotForgiven = new List<string>();
private static readonly string BP_STR = "BrightnessPoints";
public List<Quest> Guilts
{
get { return m_guilts; }
}
public void LoadGuilts()
{
m_guilts = GetRedeemableGuiltsFromQuestDB();
}
private void Awake()
{
m_questJournal = GetComponent<QuestJournal>();
}
private void OnEnable()
{
StartCoroutine(AddGuiltAddedListenerCoroutine());
}
//because saver on each load would remove bp as quests are added per load
private IEnumerator AddGuiltAddedListenerCoroutine()
{
yield return null;
yield return null;
yield return null;
m_questJournal.questAdded += AddGuiltInternal;
}
private void OnDisable()
{
m_questJournal.questAdded -= AddGuiltInternal;
}
private List<Quest> GetAllGuiltsFromQuestDB()
{
if (!m_questJournal)
{
Debug.LogError("There is no Players Journal component on player game object");
return null;
}
List<Quest> guilts = new List<Quest>();
for (int i = 0; i < m_questJournal.questList.Count; i++)
{
Quest quest = m_questJournal.questList[i];
if (quest.isTrackable == false) // if in future will be not trackable quest we also should check quest group
{
guilts.Add(m_questJournal.questList[i]);
//m_guilts.Add(quest);
//AddGuilt(m_questJournal.questList[i]);
}
}
return guilts;
}
public List<Quest> GetRedeemableGuiltsFromQuestDB()
{
if (!m_questJournal)
{
Debug.LogError("There is no Players Journal component on player game object");
return null;
}
List<Quest> guilts = new List<Quest>();
for (int i = 0; i < m_questJournal.questList.Count; i++)
{
Quest quest = m_questJournal.questList[i];
if (quest.isTrackable == false && quest.GetState() != QuestState.Abandoned)
{
Debug.Log(quest.GetState());
guilts.Add(m_questJournal.questList[i]);
// AddGuiltInternal(quest);
}
}
return guilts;
}
private int GetBrightnessPoints(Quest guilt)
{
var ctr = guilt.GetCounter(BP_STR);
if (ctr == null)
{
Debug.LogError("No BrightnessPoints set for guilt: " + guilt.name);
return 0;
}
return ctr.currentValue;
}
public Quest GetGuilt(string id)
{
return m_guilts.Find(guilt => guilt.id.text == id && guilt.GetState() != QuestState.Abandoned);
}
[Button]
public void RedeemGuilt(string id)
{
Quest guilt = GetGuilt(id);
if (guilt)
{
m_guiltsToBeForgiven.Add(guilt.id.value);
}
}
[Button]
public void RememberGuilt(string id)
{
Quest guilt = GetGuilt(id);
if (guilt)
{
m_guiltsNotForgiven.Add(guilt.id.value);
}
}
[Button]
public void SummarizeGuilts()
{
//total value of all guilts, used to calculate weighted avarage
// float totalBrightnessLost = 0f;
float totalBrightnessToForgive = 0f;
for (int i = 0; i < m_guiltsToBeForgiven.Count; i++)
{
var guilt = GetGuilt(m_guiltsToBeForgiven[i]);
if (guilt)
{
var bp = (float)GetBrightnessPoints(guilt);
// totalBrightnessLost += bp;
totalBrightnessToForgive += bp;
guilt.SetState(QuestState.Abandoned);
}
}
//for (int i = 0; i < m_guiltsNotForgiven.Count; i++)
//{
// var guilt = GetGuilt(m_guiltsNotForgiven[i]);
// if (guilt)
// {
// totalBrightnessLost += (float)GetBrightnessPoints(guilt);
// // guilt.SetState(QuestState.Failed);
// }
//}
double playerBP = Player.Instance.GetBrightness();
double bPToGain = 0;
double bPRest = 0;
//give halved bp over 50
if ((playerBP + totalBrightnessToForgive) > 50)
{
bPToGain = 50 - playerBP;
bPRest = totalBrightnessToForgive - bPToGain;
bPRest /= 2;
bPToGain += bPRest;
}
else
{
bPToGain = totalBrightnessToForgive;
}
// Debug.LogError("player bp: " + playerBP + " total bp to forgive " + totalBrightnessToForgive + " final gain " + bPToGain);
Player.Instance.SetBrightness(playerBP + bPToGain);
// Player.Instance.UpdateBrightnessCurrentValue((float)bPToGain);
m_guiltsToBeForgiven.Clear();
m_guiltsNotForgiven.Clear();
}
public void AddGuilt(Quest quest)
{
m_questJournal.AddQuest(quest);
}
private void AddGuiltInternal(Quest quest)
{
if (quest.isTrackable /*|| m_guilts.ContainsKey(quest.id.value)*/)
{
return;
}
quest.stateChanged += OnGuiltStateChanged;
quest.SetState(QuestState.Active);
}
[Button]
public void OnGuiltStateChanged(Quest guilt)
{
switch (guilt.GetState())
{
case QuestState.WaitingToStart:
break;
case QuestState.Active:
//remove brightness points for this guilt
var bp = GetBrightnessPoints(guilt);
if (bp != 0)
{
Player.Instance.UpdateBrightnessCurrentValue(-bp);
guilt.stateChanged -= OnGuiltStateChanged;
}
break;
case QuestState.Successful:
break;
case QuestState.Failed:
break;
case QuestState.Abandoned:
break;
case QuestState.Disabled:
break;
}
}
}
}