添加动态扩展测试

This commit is contained in:
milimoe 2024-10-23 00:10:44 +08:00
parent 8cea6dfa3e
commit 775c90c594
Signed by: milimoe
GPG Key ID: 05D280912DA6C69E
16 changed files with 401 additions and 27 deletions

View File

@ -26,7 +26,7 @@ namespace Milimoe.FunGame.Testing.Effects
public (Skill skill, Character? source, Item? item, double exCdr) : base(skill) public (Skill skill, Character? source, Item? item, double exCdr) : base(skill)
{ {
ActionQueue = skill.ActionQueue; GamingQueue = skill.GamingQueue;
Source = source; Source = source;
Item = item; Item = item;
= exCdr; = exCdr;

View File

@ -43,7 +43,7 @@ namespace Milimoe.FunGame.Testing.Effects
public (Skill skill, Character? source, Item? item, double reduce) : base(skill) public (Skill skill, Character? source, Item? item, double reduce) : base(skill)
{ {
ActionQueue = skill.ActionQueue; GamingQueue = skill.GamingQueue;
Source = source; Source = source;
Item = item; Item = item;
= reduce; = reduce;

View File

@ -26,7 +26,7 @@ namespace Milimoe.FunGame.Testing.Effects
public (Skill skill, Character? source, Item? item, double exATK) : base(skill) public (Skill skill, Character? source, Item? item, double exATK) : base(skill)
{ {
ActionQueue = skill.ActionQueue; GamingQueue = skill.GamingQueue;
Source = source; Source = source;
Item = item; Item = item;
= exATK; = exATK;

View File

@ -27,7 +27,7 @@ namespace Milimoe.FunGame.Testing.Effects
public (Skill skill, Character? source, Item? item, double reduce) : base(skill) public (Skill skill, Character? source, Item? item, double reduce) : base(skill)
{ {
ActionQueue = skill.ActionQueue; GamingQueue = skill.GamingQueue;
Source = source; Source = source;
Item = item; Item = item;
= reduce; = reduce;

View File

@ -26,7 +26,7 @@ namespace Milimoe.FunGame.Testing.Effects
public (Skill skill, Character? source, Item? item, double exDef) : base(skill) public (Skill skill, Character? source, Item? item, double exDef) : base(skill)
{ {
ActionQueue = skill.ActionQueue; GamingQueue = skill.GamingQueue;
Source = source; Source = source;
Item = item; Item = item;
= exDef; = exDef;

View File

@ -0,0 +1,42 @@
using Milimoe.FunGame.Core.Entity;
using Milimoe.FunGame.Core.Library.Constant;
namespace Milimoe.FunGame.Testing.Effects
{
public class ExATK : Effect
{
public override long Id => 8001;
public override string Name => "攻击力加成";
public override string Description => $"增加角色 {实际攻击力加成} 点攻击力。" + (!TargetSelf ? $"来自:[ {Source} ]" + (Item != null ? $" 的 [ {Item.Name} ]" : "") : "");
public override EffectType EffectType => EffectType.Item;
public override bool TargetSelf => true;
public Item? Item { get; }
private readonly double = 0;
public override void OnEffectGained(Character character)
{
character.ExATK2 += ;
}
public override void OnEffectLost(Character character)
{
character.ExATK2 -= ;
}
public ExATK(Skill skill, Character? source, Item? item) : base(skill)
{
GamingQueue = skill.GamingQueue;
Source = source;
Item = item;
if (skill.OtherArgs.Count > 0)
{
IEnumerable<string> keys = skill.OtherArgs.Keys.Where(s => s.Equals("exatk", StringComparison.CurrentCultureIgnoreCase));
if (keys.Any() && double.TryParse(skill.OtherArgs[keys.First()].ToString(), out double exATK))
{
= exATK;
}
}
}
}
}

View File

@ -0,0 +1,42 @@
using Milimoe.FunGame.Core.Entity;
using Milimoe.FunGame.Core.Library.Constant;
namespace Milimoe.FunGame.Testing.Effects
{
public class ExDEF : Effect
{
public override long Id => 8002;
public override string Name => "物理护甲加成";
public override string Description => $"增加角色 {实际物理护甲加成} 点物理护甲。" + (!TargetSelf ? $"来自:[ {Source} ]" + (Item != null ? $" 的 [ {Item.Name} ]" : "") : "");
public override EffectType EffectType => EffectType.Item;
public override bool TargetSelf => true;
public Item? Item { get; }
private readonly double = 0;
public override void OnEffectGained(Character character)
{
character.ExDEF2 += ;
}
public override void OnEffectLost(Character character)
{
character.ExDEF2 -= ;
}
public ExDEF(Skill skill, Character? source, Item? item) : base(skill)
{
GamingQueue = skill.GamingQueue;
Source = source;
Item = item;
if (skill.OtherArgs.Count > 0)
{
IEnumerable<string> keys = skill.OtherArgs.Keys.Where(s => s.Equals("exdef", StringComparison.CurrentCultureIgnoreCase));
if (keys.Any() && double.TryParse(skill.OtherArgs[keys.First()].ToString(), out double exDEF))
{
= exDEF;
}
}
}
}
}

View File

@ -0,0 +1,42 @@
using Milimoe.FunGame.Core.Entity;
using Milimoe.FunGame.Core.Library.Constant;
namespace Milimoe.FunGame.Testing.Effects
{
public class ExSTR : Effect
{
public override long Id => 8003;
public override string Name => "力量加成";
public override string Description => $"增加角色 {实际力量加成} 点力量。" + (!TargetSelf ? $"来自:[ {Source} ]" + (Item != null ? $" 的 [ {Item.Name} ]" : "") : "");
public override EffectType EffectType => EffectType.Item;
public override bool TargetSelf => true;
public Item? Item { get; }
private readonly double = 0;
public override void OnEffectGained(Character character)
{
character.ExDEF2 += ;
}
public override void OnEffectLost(Character character)
{
character.ExDEF2 -= ;
}
public ExSTR(Skill skill, Character? source, Item? item) : base(skill)
{
GamingQueue = skill.GamingQueue;
Source = source;
Item = item;
if (skill.OtherArgs.Count > 0)
{
IEnumerable<string> keys = skill.OtherArgs.Keys.Where(s => s.Equals("exstr", StringComparison.CurrentCultureIgnoreCase));
if (keys.Any() && double.TryParse(skill.OtherArgs[keys.First()].ToString(), out double exSTR))
{
= exSTR;
}
}
}
}
}

View File

@ -22,7 +22,7 @@ namespace Milimoe.FunGame.Testing.Effects
public (Skill skill, Character sourceCharacter, bool durative = false, double duration = 0, int durationTurn = 1) : base(skill) public (Skill skill, Character sourceCharacter, bool durative = false, double duration = 0, int durationTurn = 1) : base(skill)
{ {
ActionQueue = skill.ActionQueue; GamingQueue = skill.GamingQueue;
_sourceCharacter = sourceCharacter; _sourceCharacter = sourceCharacter;
_durative = durative; _durative = durative;
_duration = duration; _duration = duration;

View File

@ -17,7 +17,7 @@ namespace Milimoe.FunGame.Testing.Effects
public (Skill skill, Character sourceCharacter) : base(skill) public (Skill skill, Character sourceCharacter) : base(skill)
{ {
ActionQueue = skill.ActionQueue; GamingQueue = skill.GamingQueue;
_sourceCharacter = sourceCharacter; _sourceCharacter = sourceCharacter;
} }
} }

View File

@ -9,6 +9,14 @@
<RootNamespace>Milimoe.$(MSBuildProjectName.Replace(" ", "_"))</RootNamespace> <RootNamespace>Milimoe.$(MSBuildProjectName.Replace(" ", "_"))</RootNamespace>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
<NoWarn>1701;1702;IDE0130</NoWarn>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|AnyCPU'">
<NoWarn>1701;1702;IDE0130</NoWarn>
</PropertyGroup>
<ItemGroup> <ItemGroup>
<Reference Include="FunGame.Core"> <Reference Include="FunGame.Core">
<HintPath>..\..\FunGame.Core\bin\Debug\net8.0\FunGame.Core.dll</HintPath> <HintPath>..\..\FunGame.Core\bin\Debug\net8.0\FunGame.Core.dll</HintPath>

View File

@ -1,3 +1,3 @@
using Milimoe.FunGame.Testing.Tests; using Milimoe.FunGame.Testing.Tests;
_ = new WebSocketTest(); _ = new SkillJSONTest();

View File

@ -35,12 +35,12 @@ namespace Milimoe.FunGame.Testing.Skills
public override void AfterDamageCalculation(Character character, Character enemy, double damage, bool isNormalAttack, bool isMagicDamage, MagicType magicType, DamageResult damageResult) public override void AfterDamageCalculation(Character character, Character enemy, double damage, bool isNormalAttack, bool isMagicDamage, MagicType magicType, DamageResult damageResult)
{ {
if (character == Skill.Character && isNormalAttack && == 0 && ! && ActionQueue != null) if (character == Skill.Character && isNormalAttack && == 0 && ! && GamingQueue != null)
{ {
WriteLine($"[ {character} ] 发动了心灵之火!额外进行一次普通攻击!"); WriteLine($"[ {character} ] 发动了心灵之火!额外进行一次普通攻击!");
= ; = ;
= true; = true;
character.NormalAttack.Attack(ActionQueue, character, enemy); character.NormalAttack.Attack(GamingQueue, character, enemy);
} }
if (character == Skill.Character && ) if (character == Skill.Character && )

View File

@ -20,7 +20,7 @@ namespace Addons
public override string Author => "FunGamer"; public override string Author => "FunGamer";
protected override bool BeforeLoad() protected override bool BeforeLoad(params object[] objs)
{ {
EntityModuleConfig<Character> config = new(ExampleGameModuleConstant.Example, ExampleGameModuleConstant.ExampleCharacter) EntityModuleConfig<Character> config = new(ExampleGameModuleConstant.Example, ExampleGameModuleConstant.ExampleCharacter)
{ {

View File

@ -1,9 +1,10 @@
using System.Text; using System.Text;
using Milimoe.FunGame.Testing.Items;
using Milimoe.FunGame.Core.Api.Utility; using Milimoe.FunGame.Core.Api.Utility;
using Milimoe.FunGame.Core.Entity; using Milimoe.FunGame.Core.Entity;
using Milimoe.FunGame.Core.Library.Common.Addon; using Milimoe.FunGame.Core.Library.Common.Addon;
using Milimoe.FunGame.Core.Library.Constant; using Milimoe.FunGame.Core.Library.Constant;
using Milimoe.FunGame.Core.Model;
using Milimoe.FunGame.Testing.Items;
using Milimoe.FunGame.Testing.Skills; using Milimoe.FunGame.Testing.Skills;
namespace Milimoe.FunGame.Testing.Tests namespace Milimoe.FunGame.Testing.Tests
@ -293,11 +294,11 @@ namespace Milimoe.FunGame.Testing.Tests
if (PrintOut) characters.ForEach(c => Console.WriteLine(c.GetInfo())); if (PrintOut) characters.ForEach(c => Console.WriteLine(c.GetInfo()));
// 创建顺序表并排序 // 创建顺序表并排序
ActionQueue actionQueue = new(characters, WriteLine); ActionQueue ActionQueue = new(characters, WriteLine);
if (PrintOut) Console.WriteLine(); if (PrintOut) Console.WriteLine();
// 显示初始顺序表 // 显示初始顺序表
actionQueue.DisplayQueue(); ActionQueue.DisplayQueue();
if (PrintOut) Console.WriteLine(); if (PrintOut) Console.WriteLine();
// 总游戏时长 // 总游戏时长
@ -305,7 +306,7 @@ namespace Milimoe.FunGame.Testing.Tests
// 开始空投 // 开始空投
Msg = ""; Msg = "";
(actionQueue, totalTime); (ActionQueue, totalTime);
if (isWeb) result.Add("=== 空投 ===\r\n" + Msg); if (isWeb) result.Add("=== 空投 ===\r\n" + Msg);
// 总回合数 // 总回合数
@ -327,15 +328,15 @@ namespace Milimoe.FunGame.Testing.Tests
foreach (Character c in characters.Where(c => c != winner && c.HP > 0)) foreach (Character c in characters.Where(c => c != winner && c.HP > 0))
{ {
WriteLine("[ " + winner + " ] 对 [ " + c + " ] 造成了 99999999999 点真实伤害。"); WriteLine("[ " + winner + " ] 对 [ " + c + " ] 造成了 99999999999 点真实伤害。");
actionQueue.DeathCalculation(winner, c); ActionQueue.DeathCalculation(winner, c);
} }
actionQueue.EndGameInfo(winner); ActionQueue.EndGameInfo(winner);
result.Add(Msg); result.Add(Msg);
break; break;
} }
// 检查是否有角色可以行动 // 检查是否有角色可以行动
Character? characterToAct = actionQueue.NextCharacter(); Character? characterToAct = ActionQueue.NextCharacter();
// 处理回合 // 处理回合
if (characterToAct != null) if (characterToAct != null)
@ -343,23 +344,23 @@ namespace Milimoe.FunGame.Testing.Tests
WriteLine($"=== Round {i++} ==="); WriteLine($"=== Round {i++} ===");
WriteLine("现在是 [ " + characterToAct + " ] 的回合!"); WriteLine("现在是 [ " + characterToAct + " ] 的回合!");
bool isGameEnd = actionQueue.ProcessTurn(characterToAct); bool isGameEnd = ActionQueue.ProcessTurn(characterToAct);
if (isGameEnd) if (isGameEnd)
{ {
result.Add(Msg); result.Add(Msg);
break; break;
} }
actionQueue.DisplayQueue(); ActionQueue.DisplayQueue();
WriteLine(""); WriteLine("");
} }
// 模拟时间流逝 // 模拟时间流逝
totalTime += actionQueue.TimeLapse(); totalTime += ActionQueue.TimeLapse();
if (actionQueue.Eliminated.Count > deaths) if (ActionQueue.Eliminated.Count > deaths)
{ {
deaths = actionQueue.Eliminated.Count; deaths = ActionQueue.Eliminated.Count;
if (!isWeb) if (!isWeb)
{ {
string roundMsg = Msg; string roundMsg = Msg;
@ -386,10 +387,10 @@ namespace Milimoe.FunGame.Testing.Tests
int top = isWeb ? 12 : 6; int top = isWeb ? 12 : 6;
Msg = $"=== 伤害排行榜 TOP{top} ===\r\n"; Msg = $"=== 伤害排行榜 TOP{top} ===\r\n";
int count = 1; int count = 1;
foreach (Character character in actionQueue.CharacterStatistics.OrderByDescending(d => d.Value.TotalDamage).Select(d => d.Key)) foreach (Character character in ActionQueue.CharacterStatistics.OrderByDescending(d => d.Value.TotalDamage).Select(d => d.Key))
{ {
StringBuilder builder = new(); StringBuilder builder = new();
CharacterStatistics stats = actionQueue.CharacterStatistics[character]; CharacterStatistics stats = ActionQueue.CharacterStatistics[character];
builder.AppendLine($"{count}. [ {character.ToStringWithLevel()} ] {stats.Kills} / {stats.Assists}"); builder.AppendLine($"{count}. [ {character.ToStringWithLevel()} ] {stats.Kills} / {stats.Assists}");
builder.AppendLine($"存活时长:{stats.LiveTime} / 存活回合数:{stats.LiveRound} / 行动回合数:{stats.ActionTurn}"); builder.AppendLine($"存活时长:{stats.LiveTime} / 存活回合数:{stats.LiveRound} / 行动回合数:{stats.ActionTurn}");
builder.AppendLine($"总计伤害:{stats.TotalDamage} / 总计物理伤害:{stats.TotalPhysicalDamage} / 总计魔法伤害:{stats.TotalMagicDamage}"); builder.AppendLine($"总计伤害:{stats.TotalDamage} / 总计物理伤害:{stats.TotalPhysicalDamage} / 总计魔法伤害:{stats.TotalMagicDamage}");
@ -457,9 +458,9 @@ namespace Milimoe.FunGame.Testing.Tests
// 显示每个角色的信息 // 显示每个角色的信息
if (isWeb) if (isWeb)
{ {
for (i = actionQueue.Eliminated.Count - 1; i >= 0; i--) for (i = ActionQueue.Eliminated.Count - 1; i >= 0; i--)
{ {
Character character = actionQueue.Eliminated[i]; Character character = ActionQueue.Eliminated[i];
result.Add($"=== 角色 [ {character} ] ===\r\n{character.GetInfo()}"); result.Add($"=== 角色 [ {character} ] ===\r\n{character.GetInfo()}");
} }
} }

View File

@ -0,0 +1,239 @@
using Milimoe.FunGame.Core.Api.Utility;
using Milimoe.FunGame.Core.Entity;
using Milimoe.FunGame.Core.Library.Constant;
using Milimoe.FunGame.Testing.Effects;
using Milimoe.FunGame.Testing.Items;
using Milimoe.FunGame.Testing.Skills;
using MilimoeFunGame.Testing.Characters;
namespace Milimoe.FunGame.Testing.Tests
{
internal class SkillJSONTest
{
public SkillJSONTest()
{
//EntityModuleConfig<Character> config = new(nameof(SkillJSONTest), nameof(Character))
//{
// { "Oshima", OshimaCharacters.Oshima },
// { "Xinyin", OshimaCharacters.Xinyin },
// { "Yang", OshimaCharacters.Yang },
// { "NanGanyu", OshimaCharacters.NanGanyu },
// { "NiuNan", OshimaCharacters.NiuNan },
// { "Mayor", OshimaCharacters.Mayor },
// { "马猴烧酒", OshimaCharacters.马猴烧酒 },
// { "QingXiang", OshimaCharacters.QingXiang },
// { "QWQAQW", OshimaCharacters.QWQAQW },
// { "ColdBlue", OshimaCharacters.ColdBlue },
// { "绿拱门", OshimaCharacters.绿拱门 },
// { "QuDuoduo", OshimaCharacters.QuDuoduo }
//};
//config.SaveConfig();
EntityModuleConfig<Skill> config2 = new(nameof(SkillJSONTest), nameof(Skill));
Character c = Factory.GetCharacter();
List<Skill> listSkill = [];
listSkill.Add(new (c));
foreach (Skill s in listSkill)
{
config2.Add(s.Name, s);
}
config2.SaveConfig();
config2.LoadConfig();
foreach (string key in config2.Keys)
{
Skill prev = config2[key];
Skill? next = GetSkill(prev.Id, prev.Name, prev.SkillType);
if (next != null)
{
config2[key] = next;
}
Skill skill = config2[key];
foreach (Effect effect in skill.Effects.ToList())
{
Effect? newEffect = GetEffect(effect.Id, effect.Name, skill);
if (newEffect != null)
{
skill.Effects.Remove(effect);
skill.Effects.Add(newEffect);
}
}
}
Console.WriteLine(string.Join("\r\n", config2.Values));
EntityModuleConfig<Item> config3 = new(nameof(SkillJSONTest), nameof(Item)); ;
//EntityModuleConfig<Item> config3 = new(nameof(SkillJSONTest), nameof(Item))
//{
// { "攻击之爪10", new 攻击之爪10() }
//};
//config3.SaveConfig();
config3.LoadConfig();
foreach (string key in config3.Keys)
{
Item prev = config3[key];
Item? next = GetItem(prev.Id, prev.Name, prev.ItemType);
if (next != null)
{
prev.SetPropertyToItemModuleNew(next);
config3[key] = next;
}
Item item = config3[key];
HashSet<Skill> skills = item.Skills.Passives;
if (item.Skills.Active != null) skills.Add(item.Skills.Active);
foreach (Skill skill in skills.ToList())
{
Skill? newSkill = GetSkill(skill.Id, skill.Name, skill.SkillType);
if (newSkill != null)
{
if (newSkill.IsActive)
{
item.Skills.Active = newSkill;
}
else
{
item.Skills.Passives.Remove(skill);
item.Skills.Passives.Add(newSkill);
}
}
Skill s = newSkill ?? skill;
foreach (Effect effect in s.Effects.ToList())
{
Effect? newEffect = GetEffect(effect.Id, effect.Name, skill);
if (newEffect != null)
{
skill.Effects.Remove(effect);
skill.Effects.Add(newEffect);
}
}
}
}
Console.WriteLine(string.Join("\r\n", config3.Values));
}
public static Item? GetItem(long id, string name, ItemType type)
{
if (type == ItemType.Accessory)
{
switch ((AccessoryID)id)
{
case AccessoryID.10:
return new 10();
case AccessoryID.30:
return new 30();
case AccessoryID.50:
return new 50();
}
}
return null;
}
public static Skill? GetSkill(long id, string name, SkillType type)
{
if (type == SkillType.Magic)
{
switch ((MagicID)id)
{
case MagicID.:
return new ();
}
}
if (type == SkillType.Skill)
{
switch ((SkillID)id)
{
case SkillID.:
return new ();
}
}
if (type == SkillType.SuperSkill)
{
switch ((SuperSkillID)id)
{
case SuperSkillID.:
return new ();
case SuperSkillID.:
return new ();
case SuperSkillID.:
return new ();
case SuperSkillID.:
return new ();
case SuperSkillID.:
return new ();
case SuperSkillID.:
return new ();
case SuperSkillID.:
return new ();
case SuperSkillID.:
return new ();
case SuperSkillID.:
return new ();
case SuperSkillID.:
return new ();
case SuperSkillID.:
return new ();
case SuperSkillID.:
return new ();
}
}
if (type == SkillType.Passive)
{
switch ((PassiveID)id)
{
case PassiveID.META马:
return new META马();
case PassiveID.:
return new ();
case PassiveID.:
return new ();
case PassiveID.:
return new ();
case PassiveID.:
return new ();
case PassiveID.:
return new ();
case PassiveID.:
return new ();
case PassiveID.:
return new ();
case PassiveID.:
return new ();
case PassiveID.:
return new ();
case PassiveID.:
return new ();
case PassiveID.:
return new ();
}
switch ((ItemPassiveID)id)
{
case ItemPassiveID.:
return new ();
}
}
return null;
}
public static Effect? GetEffect(long id, string name, Skill skill)
{
switch (id)
{
case 8001:
return new ExATK(skill, null, null);
case 8002:
return new ExDEF(skill, null, null);
case 8003:
return new ExSTR(skill, null, null);
default:
break;
}
return null;
}
}
}