86 lines
3.3 KiB
C#
86 lines
3.3 KiB
C#
using System;
|
|
using System.Linq;
|
|
using Godot;
|
|
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;
|
|
}
|
|
} |