Files
parasitic-god/Scripts/Core/GameLogic.cs

85 lines
3.3 KiB
C#

using System;
using System.Linq;
using ParasiticGod.Scripts.Singletons;
namespace ParasiticGod.Scripts.Core;
public class GameLogic
{
public void UpdateGameState(GameState state, double delta)
{
var totalMultiplier = 1.0;
foreach (var buff in state.ActiveBuffs)
{
totalMultiplier *= buff.Multiplier;
}
var faithMultiplier = state.ActiveBuffs
.Where(b => b.TargetStat == Stat.FaithPerFollower)
.Aggregate(1.0f, (acc, buff) => acc * buff.Multiplier);
var productionFollowerMultiplier = state.ActiveBuffs
.Where(b => b.TargetStat == Stat.ProductionPerFollower)
.Aggregate(1.0f, (acc, buff) => acc * buff.Multiplier);
var productionFlatMultiplier = state.ActiveBuffs
.Where(b => b.TargetStat == Stat.ProductionPerSecond)
.Aggregate(1.0f, (acc, buff) => acc * buff.Multiplier);
var followerMultiplier = state.ActiveBuffs
.Where(b => b.TargetStat == Stat.FollowersPerSecond)
.Aggregate(1.0f, (acc, buff) => acc * buff.Multiplier);
var corruptionMultiplier = state.ActiveBuffs
.Where(b => b.TargetStat == Stat.CorruptionPerSecond)
.Aggregate(1.0f, (acc, buff) => acc * buff.Multiplier);
var faithPerSecond = state.Get(Stat.Followers) * state.Get(Stat.FaithPerFollower) * faithMultiplier;
var productionFromFollowers = state.Get(Stat.Followers) * state.Get(Stat.ProductionPerFollower) * productionFollowerMultiplier;
var productionFromIndustry = state.Get(Stat.ProductionPerSecond) * productionFlatMultiplier;
var totalProductionPerSecond = productionFromFollowers + productionFromIndustry;
var followersPerSecond = state.Get(Stat.FollowersPerSecond) * followerMultiplier;
var corruptionPerSecond = state.Get(Stat.CorruptionPerSecond) * corruptionMultiplier;
state.Modify(Stat.Faith, faithPerSecond * delta);
state.Modify(Stat.Production, totalProductionPerSecond * delta);
state.Modify(Stat.Corruption, corruptionPerSecond * delta);
state.Modify(Stat.Followers, followersPerSecond * delta);
for (var i = state.ActiveBuffs.Count - 1; i >= 0; i--)
{
var buff = state.ActiveBuffs[i];
buff.Duration -= delta;
if (buff.Duration <= 0)
{
GameBus.Instance.NotifyBuffRemoved(buff);
state.ActiveBuffs.RemoveAt(i);
state.RemoveActiveBuff(buff.BuffId);
}
}
}
public bool TryToPerformMiracle(GameState state, MiracleDefinition miracle)
{
if (state.Get(Stat.Faith) < miracle.FaithCost ||
state.Get(Stat.Followers) < miracle.FollowersRequired ||
state.Get(Stat.Production) < miracle.ProductionRequired)
{
return false;
}
state.Modify(Stat.Faith, -miracle.FaithCost);
state.Modify(Stat.Production, -miracle.ProductionRequired);
if (miracle.Effects != null)
{
foreach (var effect in miracle.Effects)
{
effect.Execute(state);
}
}
state.Set(Stat.Corruption, Math.Clamp(state.Get(Stat.Corruption), 0, 100));
return true;
}
}