177 lines
No EOL
6 KiB
C#
177 lines
No EOL
6 KiB
C#
using System;
|
|
using WingsEmu.Game.Items;
|
|
|
|
namespace WingsEmu.Game.SnackFood;
|
|
|
|
public class FoodSnackComponent : IFoodSnackComponent
|
|
{
|
|
private readonly SnackFoodConfiguration _configuration;
|
|
|
|
public FoodSnackComponent(SnackFoodConfiguration configuration) => _configuration = configuration;
|
|
|
|
public FoodProgress GetFoodProgress { get; private set; } = new();
|
|
|
|
public SnackProgress GetSnackProgress { get; private set; } = new();
|
|
|
|
public AdditionalSnackProgress GetAdditionalSnackProgress { get; private set; } = new();
|
|
|
|
public AdditionalFoodProgress GetAdditionalFoodProgress { get; private set; } = new();
|
|
|
|
public bool AddSnack(IGameItem gameItem)
|
|
{
|
|
SnackProgress progress = GetSnackProgress ??= new SnackProgress();
|
|
|
|
if (progress.SnackHpBuffer >= _configuration.SnackSoftCap || progress.SnackMpBuffer >= _configuration.SnackSoftCap || progress.SnackSpBuffer >= _configuration.SnackSoftCap)
|
|
{
|
|
return true;
|
|
}
|
|
|
|
progress.SnackHpBuffer += gameItem.Hp;
|
|
progress.SnackHpBufferSize = progress.SnackHpBuffer;
|
|
progress.SnackMpBuffer += gameItem.Mp;
|
|
progress.SnackMpBufferSize = progress.SnackMpBuffer;
|
|
progress.SnackSpBuffer += gameItem.Data[4];
|
|
progress.SnackSpBufferSize = progress.SnackSpBuffer;
|
|
|
|
if (progress.SnackHpBuffer >= _configuration.SnackHardCap)
|
|
{
|
|
progress.SnackHpBuffer = _configuration.SnackHardCap;
|
|
progress.SnackHpBufferSize = _configuration.SnackHardCap;
|
|
}
|
|
|
|
if (progress.SnackMpBuffer >= _configuration.SnackHardCap)
|
|
{
|
|
progress.SnackMpBuffer = _configuration.SnackHardCap;
|
|
progress.SnackMpBufferSize = _configuration.SnackHardCap;
|
|
}
|
|
|
|
if (progress.SnackSpBuffer >= _configuration.SnackHardCap)
|
|
{
|
|
progress.SnackSpBuffer = _configuration.SnackHardCap;
|
|
progress.SnackSpBufferSize = _configuration.SnackHardCap;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
public void AddAdditionalSnack(int max, int amount, bool isHp, int cap = 100)
|
|
{
|
|
AdditionalSnackProgress additionalProgress = GetAdditionalSnackProgress ??= new AdditionalSnackProgress();
|
|
|
|
if (isHp)
|
|
{
|
|
int hpCap = (int)Math.Round(max * cap / 100.0);
|
|
|
|
if (additionalProgress.HpCap != 0 && additionalProgress.HpCap > cap)
|
|
{
|
|
return;
|
|
}
|
|
|
|
additionalProgress.SnackAdditionalHpBuffer += amount;
|
|
additionalProgress.SnackAdditionalHpBufferSize = additionalProgress.SnackAdditionalHpBuffer;
|
|
additionalProgress.HpCap = (int)Math.Round(hpCap * 100.0 / max);
|
|
|
|
return;
|
|
}
|
|
|
|
int mpCap = (int)Math.Round(max * cap / 100.0);
|
|
|
|
if (additionalProgress.MpCap != 0 && additionalProgress.MpCap > cap)
|
|
{
|
|
return;
|
|
}
|
|
|
|
additionalProgress.SnackAdditionalMpBuffer += amount;
|
|
additionalProgress.SnackAdditionalMpBufferSize = additionalProgress.SnackAdditionalMpBuffer;
|
|
additionalProgress.MpCap = (int)Math.Round(mpCap * 100.0 / max);
|
|
}
|
|
|
|
public bool AddFood(IGameItem gameItem)
|
|
{
|
|
FoodProgress progress = GetFoodProgress ??= new FoodProgress();
|
|
|
|
if (progress.FoodHpBuffer >= _configuration.FoodSoftCap || progress.FoodMpBuffer >= _configuration.FoodSoftCap || progress.FoodSpBuffer >= _configuration.FoodSoftCap)
|
|
{
|
|
return true;
|
|
}
|
|
|
|
progress.FoodHpBuffer += gameItem.Hp;
|
|
progress.FoodHpBufferSize = progress.FoodHpBuffer;
|
|
progress.FoodMpBuffer += gameItem.Mp;
|
|
progress.FoodMpBufferSize = progress.FoodMpBuffer;
|
|
progress.FoodSpBuffer += gameItem.Data[4];
|
|
progress.FoodSpBufferSize = progress.FoodSpBuffer;
|
|
|
|
if (progress.FoodHpBuffer >= _configuration.FoodHardCap)
|
|
{
|
|
progress.FoodHpBuffer = _configuration.FoodHardCap;
|
|
progress.FoodHpBufferSize = _configuration.FoodHardCap;
|
|
}
|
|
|
|
if (progress.FoodMpBuffer >= _configuration.FoodHardCap)
|
|
{
|
|
progress.FoodMpBuffer = _configuration.FoodHardCap;
|
|
progress.FoodMpBufferSize = _configuration.FoodHardCap;
|
|
}
|
|
|
|
if (progress.FoodSpBuffer >= _configuration.FoodHardCap)
|
|
{
|
|
progress.FoodSpBuffer = _configuration.FoodHardCap;
|
|
progress.FoodSpBufferSize = _configuration.FoodHardCap;
|
|
}
|
|
|
|
int mateProgress = gameItem.Data[5];
|
|
if (mateProgress != 0)
|
|
{
|
|
progress.IncreaseTick += mateProgress;
|
|
progress.FoodMateMaxHpBuffer = 100;
|
|
progress.FoodMateMaxHpBufferSize = 100;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
public void AddAdditionalFood(int max, int amount, bool isHp, int cap = 100)
|
|
{
|
|
AdditionalFoodProgress additionalProgress = GetAdditionalFoodProgress ??= new AdditionalFoodProgress();
|
|
|
|
if (isHp)
|
|
{
|
|
int hpCap = (int)Math.Round(max * cap / 100.0);
|
|
|
|
if (additionalProgress.HpCap != 0 && additionalProgress.HpCap > cap)
|
|
{
|
|
return;
|
|
}
|
|
|
|
additionalProgress.FoodAdditionalHpBuffer += amount;
|
|
additionalProgress.FoodAdditionalHpBufferSize = additionalProgress.FoodAdditionalHpBuffer;
|
|
additionalProgress.HpCap = (int)Math.Round(hpCap * 100.0 / max);
|
|
|
|
return;
|
|
}
|
|
|
|
int mpCap = (int)Math.Round(max * cap / 100.0);
|
|
|
|
if (additionalProgress.MpCap != 0 && additionalProgress.MpCap > cap)
|
|
{
|
|
return;
|
|
}
|
|
|
|
additionalProgress.FoodAdditionalMpBuffer += amount;
|
|
additionalProgress.FoodAdditionalMpBufferSize = additionalProgress.FoodAdditionalMpBuffer;
|
|
additionalProgress.MpCap = (int)Math.Round(mpCap * 100.0 / max);
|
|
}
|
|
|
|
public void ClearFoodBuffer()
|
|
{
|
|
GetFoodProgress = null;
|
|
GetAdditionalFoodProgress = null;
|
|
}
|
|
|
|
public void ClearSnackBuffer()
|
|
{
|
|
GetSnackProgress = null;
|
|
GetAdditionalSnackProgress = null;
|
|
}
|
|
} |