2026-01-16 01:55:46 +08:00

166 lines
7.0 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using Milimoe.FunGame.Core.Entity;
using Milimoe.FunGame.Core.Interface.Entity;
using Milimoe.FunGame.Core.Library.Common.Addon;
using Milimoe.FunGame.Core.Library.Constant;
using Oshima.FunGame.OshimaModules.Models;
namespace Oshima.FunGame.OshimaModules.Skills
{
public class : Skill
{
public override long Id => (long)PassiveID.;
public override string Name => "雇佣兵团";
public override string Description => Effects.Count > 0 ? Effects.First().Description : "";
public (Character? character = null) : base(SkillType.Passive, character)
{
Effects.Add(new (this));
}
public override IEnumerable<Effect> AddPassiveEffectToCharacter()
{
return Effects;
}
}
public class (Skill skill) : Effect(skill)
{
public override long Id => Skill.Id;
public override string Name => Skill.Name;
public override string Description => $"{Skill.SkillOwner()}在场上时,会召唤数名雇佣兵协助战斗,初始数量为 {最小数量} 名,雇佣兵具有独立的回合,生命值为{Skill.SkillOwner()}的 {生命值比例 * 100:0.##}% [ {Skill.Character?.MaxHP * 生命值比例:0.##} ],攻击力为{Skill.SkillOwner()}的 {攻击力比例 * 100:0.##}% 基础攻击力 [ {Skill.Character?.BaseATK * 攻击力比例:0.##} ]" +
$"完整继承其他能力值(暴击率、闪避率等)。当{Skill.SkillOwner()}参与击杀时,便会临时产生一名额外的雇佣兵。场上最多可以存在 {最大数量} 名雇佣兵,达到数量后不再产生新的雇佣兵;当不足 {最小数量} 名雇佣兵时,{补充间隔} {GameplayEquilibriumConstant.InGameTime}后会重新补充一名雇佣兵。" +
(.Count < && Skill.CurrentCD > 0 ? $"(下次补充:{Skill.CurrentCD} {GameplayEquilibriumConstant.InGameTime}后)" : "");
public List<> { get; } = [];
public const int = 1;
public const int = 5;
public const int = 30;
public const double = 0.1;
public const double = 0.6;
public override void AfterDeathCalculation(Character death, bool hasMaster, Character? killer, Dictionary<Character, int> continuousKilling, Dictionary<Character, int> earnedMoney, Character[] assists)
{
if (death is gyb)
{
WriteLine($"[ {killer} ] 杀死了 [ {death} ]");
.Remove(gyb);
if (.Count < && Skill.CurrentCD == 0)
{
Skill.CurrentCD = ;
Skill.Enable = false;
}
}
if (death == Skill.Character)
{
OnEffectLost(death);
}
if (Skill.Character != null && death != Skill.Character && (killer == Skill.Character || assists.Contains(Skill.Character)) && .Count < )
{
(Skill.Character);
}
}
public override void OnTurnStart(Character character, List<Character> enemys, List<Character> teammates, List<Skill> skills, List<Item> items)
{
(character);
}
public override void OnTimeElapsed(Character character, double elapsed)
{
if (character == Skill.Character)
{
(character);
}
}
public override void OnEffectLost(Character character)
{
if (GamingQueue != null)
{
if (GamingQueue is Milimoe.FunGame.Core.Model.GamingQueue queue)
{
if (queue.Map != null) queue.RemoveCharacterFromMap();
else queue.RemoveCharacterFromQueue();
}
.Clear();
WriteLine($"[ {character} ] 的雇佣兵团已消散!");
}
}
public void (Character character)
{
int count = .Count;
if (count < && Skill.Enable)
{
do
{
count = (character);
}
while (count < );
}
if (GamingQueue != null)
{
foreach ( gyb in .Where(g => !GamingQueue.Queue.Contains(g)))
{
if (gyb.HP <= 0) gyb.HP = 1;
(character, gyb);
}
}
}
public int (Character character)
{
gyb = new(character, FunGameConstant.GenerateRandomChineseUserName())
{
Level = 1,
InitialHP = character.MaxHP * ,
InitialATK = character.BaseATK * ,
ExCritRate = character.CritRate - GameplayEquilibriumConstant.CritRate,
ExCritDMG = character.CritDMG - GameplayEquilibriumConstant.CritDMG,
ExEvadeRate = character.EvadeRate - GameplayEquilibriumConstant.EvadeRate,
InitialSPD = character.SPD,
InitialDEF = character.DEF,
InitialHR = character.HR,
InitialMR = character.MR,
Lifesteal = character.Lifesteal,
ExPDR = character.PDR,
PhysicalPenetration = character.PhysicalPenetration,
MagicalPenetration = character.MagicalPenetration
};
gyb.MDF.AddAllValue(character.MDF.Avg);
gyb.Recovery();
.Add(gyb);
(character, gyb);
WriteLine($"[ {character} ] 召唤了{gyb}");
return .Count;
}
public void (Character character, gyb)
{
// 添加到地图/队列
if (GamingQueue != null)
{
if (GamingQueue.Map is GameMap map)
{
Grid? current = map.GetCharacterCurrentGrid(character);
if (current != null)
{
List<Grid> nearbyGrids = map.GetGridsByRange(current, 5, false);
Grid? target = nearbyGrids.OrderBy(g => GameMap.CalculateManhattanDistance(g, current)).FirstOrDefault();
if (target != null)
{
map.SetCharacterCurrentGrid(gyb, target);
}
}
}
GamingQueue.Queue.Add(gyb);
GamingQueue.ChangeCharacterHardnessTime(gyb, 5, false, false);
}
}
}
}