This commit is contained in:
milimoe 2026-01-22 01:38:24 +08:00
parent b76b263913
commit 6a25cf9b3f
Signed by: milimoe
GPG Key ID: 9554D37E4B8991D0
7 changed files with 72 additions and 11 deletions

View File

@ -26,7 +26,7 @@ namespace Oshima.FunGame.OshimaModules.Skills
public override string Name => Skill.Name;
public override string Description => $"{Skill.SkillOwner()}处于正常态和吟唱态时,每秒回复 {回复系数 * 100:0.##}% 最大生命值 [ {Skill.Character?.MaxHP * 回复系数:0.##} ] 并获得 {能量获取:0.##} 点能量。";
public double { get; set; } = 0.02;
public double { get; set; } = 0.01;
public double { get; set; } = 1;
public override void OnTimeElapsed(Character character, double elapsed)

View File

@ -39,15 +39,15 @@ namespace Oshima.FunGame.OshimaModules.Skills
public string => $"{Skill.SkillOwner()}可以选择获得哪一种力量:\r\n{熵核描述}\r\n{守护描述}";
private string => $"【熵核】加速生命回复,每{GameplayEquilibriumConstant.InGameTime}额外回复 {熵核额外回复 * 100:0.##}% 当前生命值 [ {Skill.Character?.HP * 熵核额外回复:0.##} ],攻击力提升 {熵核攻击力提升 * 100:0.##}% [ {Skill.Character?.BaseATK * 熵核攻击力提升:0.##} ],但是受到的伤害提升 {熵核受到伤害提升 * 100:0.##}%。" +
$"对敌人造成伤害会使其在 {熵核影响敌人时间:0.##} {GameplayEquilibriumConstant.InGameTime}内无法获得自然的生命和魔法回复的禁止治疗效果,施加该状态时,只有目标的敏捷高于{Skill.SkillOwner()}的角色才能进行豁免检定。持续 {熵核持续时间:0.##} {GameplayEquilibriumConstant.InGameTime}。";
private static double => 0.04;
private static double => 0.02;
private double => 0.2 + 0.1 * (Skill.Level - 1);
private double => 0.15 + 0.05 * (Skill.Level - 1);
private static double => 10;
private double => 15 + 2 * (Skill.Level - 1);
private string => $"【守护】极致地加速生命回复,每{GameplayEquilibriumConstant.InGameTime}额外回复 {守护额外回复 * 100:0.##}% 当前生命值 [ {Skill.Character?.HP * 守护额外回复:0.##} ],为全体友方角色提供每{GameplayEquilibriumConstant.InGameTime}额外 {守护友方回复 * 100:0.##}% 当前生命值的生命回复,并嘲讽全体敌方角色,被嘲讽的角色仅能将{Skill.SkillOwner()}作为攻击目标。" +
$"施加嘲讽状态时,只有目标的敏捷高于{Skill.SkillOwner()}的角色才能进行豁免检定。持续 {守护持续时间:0.##} {GameplayEquilibriumConstant.InGameTime}。";
private double => 0.06 + 0.005 * (Skill.Level - 1);
private double => 0.01 + 0.01 * (Skill.Level - 1);
private double => 0.01 + 0.003 * (Skill.Level - 1);
private double => 0.01 + 0.002 * (Skill.Level - 1);
private double => 15 + 1 * (Skill.Level - 1);
private bool { get; set; } = false;

View File

@ -1,6 +1,8 @@
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 Milimoe.FunGame.Core.Model;
namespace Oshima.FunGame.OshimaModules.Skills
{
@ -26,17 +28,19 @@ namespace Oshima.FunGame.OshimaModules.Skills
{
public override long Id => Skill.Id;
public override string Name => "咒怨洪流";
public override string Description => $"{Skill.SkillOwner()}将「熵核」的污染之力附着在武器之上。{Duration:0.##} {GameplayEquilibriumConstant.InGameTime}内,增加自身所有伤害的 {减伤比例 * 100:0.##}% 伤害减免;[ 蚀魂震击 ] 的冷却时间降低至 5 {GameplayEquilibriumConstant.InGameTime},并将普通攻击转为魔法伤害,允许普通攻击时选择至多 3 个目标。";
public override string Description => $"{Skill.SkillOwner()}将「熵核」的污染之力附着在武器之上。{Duration:0.##} {GameplayEquilibriumConstant.InGameTime}内,增加自身所有伤害的 {减伤比例 * 100:0.##}% 伤害减免;[ 蚀魂震击 ] 的冷却时间降低至 5 {GameplayEquilibriumConstant.InGameTime},并将普通攻击转为魔法伤害;在一个回合里首次使用普通攻击后,附赠 {额外攻击次数} 次普通攻击决策点配额,但后续普通攻击必须选取不重复的目标。";
public override bool Durative => true;
public override double Duration => 30;
public override DispelledType DispelledType => DispelledType.CannotBeDispelled;
private double => 0.15 + 0.02 * (Level - 1);
private double = 0;
private readonly List<Character> = [];
private bool = true;
private readonly int = 2;
public override void OnEffectGained(Character character)
{
character.NormalAttack.CanSelectTargetCount += 2;
= ;
character.NormalAttack.SetMagicType(new(this, true, MagicType.None, 999), GamingQueue);
if (character.Effects.Where(e => e is ).FirstOrDefault() is e)
@ -49,7 +53,6 @@ namespace Oshima.FunGame.OshimaModules.Skills
public override void OnEffectLost(Character character)
{
= 0;
character.NormalAttack.CanSelectTargetCount -= 2;
character.NormalAttack.UnsetMagicType(this, GamingQueue);
if (character.Effects.Where(e => e is ).FirstOrDefault() is e)
{
@ -57,6 +60,31 @@ namespace Oshima.FunGame.OshimaModules.Skills
}
}
public override void OnTurnStart(Character character, List<Character> enemys, List<Character> teammates, List<Skill> skills, List<Item> items)
{
.Clear();
= true;
}
public override void AfterCharacterNormalAttack(Character character, NormalAttack normalAttack, List<Character> targets)
{
.AddRange(targets);
if ( && GamingQueue != null && GamingQueue.CharacterDecisionPoints.TryGetValue(character, out DecisionPoints? dp) && dp != null)
{
= false;
dp.AddTempActionQuota(CharacterActionType.NormalAttack, );
WriteLine($"[ {character} ] 发动了{nameof(咒怨洪流)}!本回合可额外发动 {额外攻击次数} 次普通攻击!");
}
}
public override void AlterSelectListBeforeSelection(Character character, ISkill skill, List<Character> enemys, List<Character> teammates)
{
if (skill is NormalAttack && !)
{
enemys.RemoveAll(.Contains);
}
}
public override double AlterActualDamageAfterCalculation(Character character, Character enemy, double damage, bool isNormalAttack, DamageType damageType, MagicType magicType, DamageResult damageResult, ref bool isEvaded, Dictionary<Effect, double> totalDamageBonus)
{
if (enemy == Skill.Character)

View File

@ -34,12 +34,15 @@ namespace Oshima.FunGame.OshimaModules.Skills
public override void AfterDamageCalculation(Character character, Character enemy, double damage, double actualDamage, bool isNormalAttack, DamageType damageType, MagicType magicType, DamageResult damageResult)
{
if (character == Skill.Character && isNormalAttack && (damageResult == DamageResult.Normal || damageResult == DamageResult.Critical) && ! && enemy.HP > 0)
if (Skill.CurrentCD == 0 && character == Skill.Character && isNormalAttack && (damageResult == DamageResult.Normal || damageResult == DamageResult.Critical) && ! && enemy.HP > 0)
{
Skill.CurrentCD = Skill.CD;
WriteLine($"[ {character} ] 发动了银隼之赐!将造成额外伤害!");
= true;
DamageToEnemy(character, enemy, DamageType.Magical, magicType, );
DamageToEnemy(character, enemy, DamageType.Magical, magicType, , new(character)
{
TriggerEffects = false
});
}
if (character == Skill.Character && )

View File

@ -63,7 +63,7 @@ namespace Oshima.FunGame.OshimaServers.Service
}
}
public static async Task<List<string>> StartSimulationGame(bool printout, bool isWeb = false, bool isTeam = false, bool deathMatchRoundDetail = false, int maxRespawnTimesMix = 1, bool useStore = false, bool hasMap = false)
public static async Task<List<string>> StartSimulationGame(bool printout, bool isWeb = false, bool isTeam = false, bool deathMatchRoundDetail = false, int maxRespawnTimesMix = 1, bool useStore = false, bool hasMap = false, bool isDebug = false)
{
PrintOut = printout;
IsWeb = isWeb;
@ -205,7 +205,7 @@ namespace Oshima.FunGame.OshimaServers.Service
if (PrintOut) characters.ForEach(c => Console.WriteLine(c.GetInfo()));
// 初始化队列,准备开始游戏
actionQueue.IsDebug = IsDebug;
actionQueue.IsDebug = IsDebug || isDebug;
actionQueue.InitActionQueue();
actionQueue.SetCharactersToAIControl(false, characters);
if (PrintOut) Console.WriteLine();

View File

@ -38,6 +38,13 @@ namespace Oshima.FunGame.WebAPI.Controllers
return await FunGameSimulation.StartSimulationGame(false, isweb ?? true, isteam ?? false, showall ?? false, maxRespawnTimesMix ?? 1, false, hasMap ?? false);
}
[AllowAnonymous]
[HttpGet("testdebug")]
public async Task<List<string>> GetTestDebug([FromQuery] bool? isweb = null, [FromQuery] bool? isteam = null, [FromQuery] bool? showall = null, [FromQuery] int? maxRespawnTimesMix = null, [FromQuery] bool? hasMap = null)
{
return await FunGameSimulation.StartSimulationGame(false, isweb ?? true, isteam ?? false, showall ?? false, maxRespawnTimesMix ?? 1, false, hasMap ?? false, true);
}
[AllowAnonymous]
[HttpGet("last")]
public List<string> GetLast([FromQuery] bool full = false)

View File

@ -502,6 +502,29 @@ namespace Oshima.FunGame.WebAPI.Services
return result;
}
if (e.Detail.StartsWith("团队调试模拟", StringComparison.CurrentCultureIgnoreCase))
{
e.UseNotice = false;
if (!FunGameSimulation)
{
FunGameSimulation = true;
List<string> msgs = await Controller.GetTestDebug(false, true, hasMap: true);
List<string> real = MergeMessages(msgs);
int count = 1;
foreach (string msg in real)
{
await SendAsync(e, "筽祀牻", msg.Trim(), msgSeq: count++);
if (count != real.Count) await Task.Delay(5500);
}
FunGameSimulation = false;
}
else
{
await SendAsync(e, "筽祀牻", "游戏正在模拟中,请勿重复请求!");
}
return result;
}
if (e.Detail.StartsWith("查数据", StringComparison.CurrentCultureIgnoreCase))
{
e.UseNotice = false;