添加团队模式

This commit is contained in:
milimoe 2024-10-30 01:24:58 +08:00
parent cce98072d4
commit fd2bf430c3
Signed by: milimoe
GPG Key ID: 05D280912DA6C69E
6 changed files with 953 additions and 100 deletions

View File

@ -17,16 +17,11 @@ namespace Oshima.Core.Controllers
private readonly ILogger<UserDailyController> _logger = logger;
[HttpGet("test")]
public List<string> GetTest([FromQuery] bool? isweb = null)
public List<string> GetTest([FromQuery] bool? isweb = null, [FromQuery] bool? isteam = null)
{
if (isweb ?? true)
{
return FunGameSimulation.StartGame(false, true);
}
else
{
return FunGameSimulation.StartGame(false, false);
}
bool web = isweb ?? true;
bool team = isteam ?? false;
return FunGameSimulation.StartGame(false, web, team);
}
[HttpGet("stats")]
@ -58,6 +53,53 @@ namespace Oshima.Core.Controllers
builder.AppendLine($"总计击杀数:{stats.Kills}" + (stats.Plays != 0 ? $" / 场均:{(double)stats.Kills / stats.Plays:0.##}" : ""));
builder.AppendLine($"总计死亡数:{stats.Deaths}" + (stats.Plays != 0 ? $" / 场均:{(double)stats.Deaths / stats.Plays:0.##}" : ""));
builder.AppendLine($"总计助攻数:{stats.Assists}" + (stats.Plays != 0 ? $" / 场均:{(double)stats.Assists / stats.Plays:0.##}" : ""));
builder.AppendLine($"总计首杀数:{stats.FirstKills}" + (stats.Plays != 0 ? $" / 首杀率:{(double)stats.FirstKills / stats.Plays * 100:0.##}%" : ""));
builder.AppendLine($"总计首死数:{stats.FirstDeaths}" + (stats.Plays != 0 ? $" / 首死率:{(double)stats.FirstDeaths / stats.Plays * 100:0.##}%" : ""));
builder.AppendLine($"总计参赛数:{stats.Plays}");
builder.AppendLine($"总计冠军数:{stats.Wins}");
builder.AppendLine($"总计前三数:{stats.Top3s}");
builder.AppendLine($"总计败场数:{stats.Loses}");
builder.AppendLine($"胜率:{stats.Winrates * 100:0.##}%");
builder.AppendLine($"前三率:{stats.Top3rates * 100:0.##}%");
builder.AppendLine($"上次排名:{stats.LastRank} / 场均名次:{stats.AvgRank}");
return NetworkUtility.JsonSerialize(builder.ToString());
}
}
return NetworkUtility.JsonSerialize("");
}
[HttpGet("teamstats")]
public string GetTeamStats([FromQuery] int? id = null)
{
if (id != null && id > 0 && id <= FunGameSimulation.Characters.Count)
{
Character character = FunGameSimulation.Characters[Convert.ToInt32(id) - 1];
if (FunGameSimulation.TeamCharacterStatistics.TryGetValue(character, out CharacterStatistics? stats) && stats != null)
{
StringBuilder builder = new();
builder.AppendLine(character.ToString());
builder.AppendLine($"总计造成伤害:{stats.TotalDamage:0.##} / 场均:{stats.AvgDamage:0.##}");
builder.AppendLine($"总计造成物理伤害:{stats.TotalPhysicalDamage:0.##} / 场均:{stats.AvgPhysicalDamage:0.##}");
builder.AppendLine($"总计造成魔法伤害:{stats.TotalMagicDamage:0.##} / 场均:{stats.AvgMagicDamage:0.##}");
builder.AppendLine($"总计造成真实伤害:{stats.TotalRealDamage:0.##} / 场均:{stats.AvgRealDamage:0.##}");
builder.AppendLine($"总计承受伤害:{stats.TotalTakenDamage:0.##} / 场均:{stats.AvgTakenDamage:0.##}");
builder.AppendLine($"总计承受物理伤害:{stats.TotalTakenPhysicalDamage:0.##} / 场均:{stats.AvgTakenPhysicalDamage:0.##}");
builder.AppendLine($"总计承受魔法伤害:{stats.TotalTakenMagicDamage:0.##} / 场均:{stats.AvgTakenMagicDamage:0.##}");
builder.AppendLine($"总计承受真实伤害:{stats.TotalTakenRealDamage:0.##} / 场均:{stats.AvgTakenRealDamage:0.##}");
builder.AppendLine($"总计存活回合数:{stats.LiveRound} / 场均:{stats.AvgLiveRound}");
builder.AppendLine($"总计行动回合数:{stats.ActionTurn} / 场均:{stats.AvgActionTurn}");
builder.AppendLine($"总计存活时长:{stats.LiveTime:0.##} / 场均:{stats.AvgLiveTime:0.##}");
builder.AppendLine($"总计赚取金钱:{stats.TotalEarnedMoney} / 场均:{stats.AvgEarnedMoney}");
builder.AppendLine($"每回合伤害:{stats.DamagePerRound:0.##}");
builder.AppendLine($"每行动回合伤害:{stats.DamagePerTurn:0.##}");
builder.AppendLine($"每秒伤害:{stats.DamagePerSecond:0.##}");
builder.AppendLine($"总计击杀数:{stats.Kills}" + (stats.Plays != 0 ? $" / 场均:{(double)stats.Kills / stats.Plays:0.##}" : ""));
builder.AppendLine($"总计死亡数:{stats.Deaths}" + (stats.Plays != 0 ? $" / 场均:{(double)stats.Deaths / stats.Plays:0.##}" : ""));
builder.AppendLine($"总计助攻数:{stats.Assists}" + (stats.Plays != 0 ? $" / 场均:{(double)stats.Assists / stats.Plays:0.##}" : ""));
builder.AppendLine($"总计首杀数:{stats.FirstKills}" + (stats.Plays != 0 ? $" / 首杀率:{(double)stats.FirstKills / stats.Plays * 100:0.##}%" : ""));
builder.AppendLine($"总计首死数:{stats.FirstDeaths}" + (stats.Plays != 0 ? $" / 首死率:{(double)stats.FirstDeaths / stats.Plays * 100:0.##}%" : ""));
builder.AppendLine($"总计参赛数:{stats.Plays}");
builder.AppendLine($"总计冠军数:{stats.Wins}");
builder.AppendLine($"总计前三数:{stats.Top3s}");

View File

@ -1,6 +1,7 @@
using System.Text;
using Milimoe.FunGame.Core.Api.Utility;
using Milimoe.FunGame.Core.Entity;
using Milimoe.FunGame.Core.Library.Constant;
using Milimoe.FunGame.Core.Model;
using Oshima.FunGame.OshimaModules;
using Oshima.FunGame.OshimaModules.Characters;
@ -31,13 +32,15 @@ namespace Oshima.Core.Utils
public static List<Character> Characters { get; } = [];
public static List<Item> Items { get; } = [];
public static Dictionary<Character, CharacterStatistics> CharacterStatistics { get; } = [];
public static Dictionary<Character, CharacterStatistics> TeamCharacterStatistics { get; } = [];
public static PluginConfig StatsConfig { get; } = new(nameof(FunGameSimulation), nameof(CharacterStatistics));
public static PluginConfig TeamStatsConfig { get; } = new(nameof(FunGameSimulation), nameof(TeamCharacterStatistics));
public static bool IsRuning { get; set; } = false;
public static bool IsWeb { get; set; } = false;
public static bool PrintOut { get; set; } = false;
public static string Msg { get; set; } = "";
public static List<string> StartGame(bool printout, bool isWeb = false)
public static List<string> StartGame(bool printout, bool isWeb = false, bool isTeam = false)
{
PrintOut = printout;
IsWeb = isWeb;
@ -291,15 +294,8 @@ namespace Oshima.Core.Utils
}
}
// 显示角色信息
if (PrintOut) characters.ForEach(c => Console.WriteLine(c.GetInfo()));
// 创建顺序表并排序
ActionQueue actionQueue = new(characters, WriteLine);
if (PrintOut) Console.WriteLine();
// 显示初始顺序表
actionQueue.DisplayQueue();
ActionQueue actionQueue = new(characters, isTeam, WriteLine);
if (PrintOut) Console.WriteLine();
// 总游戏时长
@ -307,9 +303,41 @@ namespace Oshima.Core.Utils
// 开始空投
Msg = "";
(actionQueue);
int = 0;
int = 0;
int = 0;
int = 0;
(actionQueue, ref , ref , ref , ref );
if (isWeb) result.Add("=== 空投 ===\r\n" + Msg);
double = 80;
double = 40;
// 显示角色信息
if (PrintOut) characters.ForEach(c => Console.WriteLine(c.GetInfo()));
// 因赋予了装备,所以清除排序重新排
actionQueue.ClearQueue();
actionQueue.InitCharacterQueue(characters);
if (PrintOut) Console.WriteLine();
// 团队模式
if (isTeam)
{
// 打乱原始数组的顺序
IEnumerable<Character> shuffledCharacters = characters.OrderBy(c => Random.Shared.Next());
// 计算分割点
int splitIndex = shuffledCharacters.Count() / 2;
// 分成两个数组
List<Character> group1 = shuffledCharacters.Take(splitIndex).ToList();
List<Character> group2 = shuffledCharacters.Skip(splitIndex).ToList();
actionQueue.Teams.Add("队伍一", group1);
actionQueue.Teams.Add("队伍二", group2);
}
// 显示初始顺序表
actionQueue.DisplayQueue();
if (PrintOut) Console.WriteLine();
// 总回合数
int i = 1;
@ -366,9 +394,9 @@ namespace Oshima.Core.Utils
{
// 空投
Msg = "";
(actionQueue);
(actionQueue, ref , ref , ref , ref );
if (isWeb) result.Add("=== 空投 ===\r\n" + Msg);
= 100;
= 40;
}
if (actionQueue.Eliminated.Count > deaths)
@ -400,72 +428,150 @@ namespace Oshima.Core.Utils
int top = isWeb ? 12 : 6;
Msg = $"=== 伤害排行榜 TOP{top} ===\r\n";
int count = 1;
foreach (Character character in actionQueue.CharacterStatistics.OrderByDescending(d => d.Value.TotalDamage).Select(d => d.Key))
{
StringBuilder builder = new();
CharacterStatistics stats = actionQueue.CharacterStatistics[character];
builder.AppendLine($"{count}. [ {character.ToStringWithLevel()} ] {stats.Kills} / {stats.Assists}");
builder.AppendLine($"存活时长:{stats.LiveTime} / 存活回合数:{stats.LiveRound} / 行动回合数:{stats.ActionTurn}");
builder.AppendLine($"总计伤害:{stats.TotalDamage} / 总计物理伤害:{stats.TotalPhysicalDamage} / 总计魔法伤害:{stats.TotalMagicDamage}");
builder.AppendLine($"总承受伤害:{stats.TotalTakenDamage} / 总承受物理伤害:{stats.TotalTakenPhysicalDamage} / 总承受魔法伤害:{stats.TotalTakenMagicDamage}");
builder.Append($"每秒伤害:{stats.DamagePerSecond} / 每回合伤害:{stats.DamagePerTurn}");
if (count++ <= top)
{
WriteLine(builder.ToString());
}
else
{
if (PrintOut) Console.WriteLine(builder.ToString());
}
CharacterStatistics? totalStats = CharacterStatistics.Where(kv => kv.Key.GetName() == character.GetName()).Select(kv => kv.Value).FirstOrDefault();
if (totalStats != null)
if (isTeam)
{
foreach (Character character in actionQueue.CharacterStatistics.OrderByDescending(d => d.Value.TotalDamage).Select(d => d.Key))
{
// 统计此角色的所有数据
totalStats.TotalDamage = Calculation.Round2Digits(totalStats.TotalDamage + stats.TotalDamage);
totalStats.TotalPhysicalDamage = Calculation.Round2Digits(totalStats.TotalPhysicalDamage + stats.TotalPhysicalDamage);
totalStats.TotalMagicDamage = Calculation.Round2Digits(totalStats.TotalMagicDamage + stats.TotalMagicDamage);
totalStats.TotalRealDamage = Calculation.Round2Digits(totalStats.TotalRealDamage + stats.TotalRealDamage);
totalStats.TotalTakenDamage = Calculation.Round2Digits(totalStats.TotalTakenDamage + stats.TotalTakenDamage);
totalStats.TotalTakenPhysicalDamage = Calculation.Round2Digits(totalStats.TotalTakenPhysicalDamage + stats.TotalTakenPhysicalDamage);
totalStats.TotalTakenMagicDamage = Calculation.Round2Digits(totalStats.TotalTakenMagicDamage + stats.TotalTakenMagicDamage);
totalStats.TotalTakenRealDamage = Calculation.Round2Digits(totalStats.TotalTakenRealDamage + stats.TotalTakenRealDamage);
totalStats.LiveRound += stats.LiveRound;
totalStats.ActionTurn += stats.ActionTurn;
totalStats.LiveTime = Calculation.Round2Digits(totalStats.LiveTime + stats.LiveTime);
totalStats.TotalEarnedMoney += stats.TotalEarnedMoney;
totalStats.Kills += stats.Kills;
totalStats.Deaths += stats.Deaths;
totalStats.Assists += stats.Assists;
totalStats.LastRank = stats.LastRank;
double totalRank = totalStats.AvgRank * totalStats.Plays + totalStats.LastRank;
totalStats.Plays += stats.Plays;
if (totalStats.Plays != 0) totalStats.AvgRank = Calculation.Round2Digits(totalRank / totalStats.Plays);
totalStats.Wins += stats.Wins;
totalStats.Top3s += stats.Top3s;
totalStats.Loses += stats.Loses;
if (totalStats.Plays != 0)
StringBuilder builder = new();
CharacterStatistics stats = actionQueue.CharacterStatistics[character];
builder.AppendLine($"{count}. [ {character.ToStringWithLevel()} ] {stats.Kills} / {stats.Assists}");
builder.AppendLine($"存活时长:{stats.LiveTime} / 存活回合数:{stats.LiveRound} / 行动回合数:{stats.ActionTurn}");
builder.AppendLine($"总计伤害:{stats.TotalDamage} / 总计物理伤害:{stats.TotalPhysicalDamage} / 总计魔法伤害:{stats.TotalMagicDamage}");
builder.AppendLine($"总承受伤害:{stats.TotalTakenDamage} / 总承受物理伤害:{stats.TotalTakenPhysicalDamage} / 总承受魔法伤害:{stats.TotalTakenMagicDamage}");
builder.Append($"每秒伤害:{stats.DamagePerSecond} / 每回合伤害:{stats.DamagePerTurn}");
if (count++ <= top)
{
totalStats.AvgDamage = Calculation.Round2Digits(totalStats.TotalDamage / totalStats.Plays);
totalStats.AvgPhysicalDamage = Calculation.Round2Digits(totalStats.TotalPhysicalDamage / totalStats.Plays);
totalStats.AvgMagicDamage = Calculation.Round2Digits(totalStats.TotalMagicDamage / totalStats.Plays);
totalStats.AvgRealDamage = Calculation.Round2Digits(totalStats.TotalRealDamage / totalStats.Plays);
totalStats.AvgTakenDamage = Calculation.Round2Digits(totalStats.TotalTakenDamage / totalStats.Plays);
totalStats.AvgTakenPhysicalDamage = Calculation.Round2Digits(totalStats.TotalTakenPhysicalDamage / totalStats.Plays);
totalStats.AvgTakenMagicDamage = Calculation.Round2Digits(totalStats.TotalTakenMagicDamage / totalStats.Plays);
totalStats.AvgTakenRealDamage = Calculation.Round2Digits(totalStats.TotalTakenRealDamage / totalStats.Plays);
totalStats.AvgLiveRound = totalStats.LiveRound / totalStats.Plays;
totalStats.AvgActionTurn = totalStats.ActionTurn / totalStats.Plays;
totalStats.AvgLiveTime = Calculation.Round2Digits(totalStats.LiveTime / totalStats.Plays);
totalStats.AvgEarnedMoney = totalStats.TotalEarnedMoney / totalStats.Plays;
totalStats.Winrates = Calculation.Round4Digits(Convert.ToDouble(totalStats.Wins) / Convert.ToDouble(totalStats.Plays));
totalStats.Top3rates = Calculation.Round4Digits(Convert.ToDouble(totalStats.Top3s) / Convert.ToDouble(totalStats.Plays));
WriteLine(builder.ToString());
}
else
{
if (PrintOut) Console.WriteLine(builder.ToString());
}
CharacterStatistics? totalStats = TeamCharacterStatistics.Where(kv => kv.Key.GetName() == character.GetName()).Select(kv => kv.Value).FirstOrDefault();
if (totalStats != null)
{
// 统计此角色的所有数据
totalStats.TotalDamage = Calculation.Round2Digits(totalStats.TotalDamage + stats.TotalDamage);
totalStats.TotalPhysicalDamage = Calculation.Round2Digits(totalStats.TotalPhysicalDamage + stats.TotalPhysicalDamage);
totalStats.TotalMagicDamage = Calculation.Round2Digits(totalStats.TotalMagicDamage + stats.TotalMagicDamage);
totalStats.TotalRealDamage = Calculation.Round2Digits(totalStats.TotalRealDamage + stats.TotalRealDamage);
totalStats.TotalTakenDamage = Calculation.Round2Digits(totalStats.TotalTakenDamage + stats.TotalTakenDamage);
totalStats.TotalTakenPhysicalDamage = Calculation.Round2Digits(totalStats.TotalTakenPhysicalDamage + stats.TotalTakenPhysicalDamage);
totalStats.TotalTakenMagicDamage = Calculation.Round2Digits(totalStats.TotalTakenMagicDamage + stats.TotalTakenMagicDamage);
totalStats.TotalTakenRealDamage = Calculation.Round2Digits(totalStats.TotalTakenRealDamage + stats.TotalTakenRealDamage);
totalStats.LiveRound += stats.LiveRound;
totalStats.ActionTurn += stats.ActionTurn;
totalStats.LiveTime = Calculation.Round2Digits(totalStats.LiveTime + stats.LiveTime);
totalStats.TotalEarnedMoney += stats.TotalEarnedMoney;
totalStats.Kills += stats.Kills;
totalStats.Deaths += stats.Deaths;
totalStats.Assists += stats.Assists;
totalStats.FirstKills += stats.FirstKills;
totalStats.FirstDeaths += stats.FirstDeaths;
totalStats.LastRank = stats.LastRank;
double totalRank = totalStats.AvgRank * totalStats.Plays + totalStats.LastRank;
totalStats.Plays += stats.Plays;
if (totalStats.Plays != 0) totalStats.AvgRank = Calculation.Round2Digits(totalRank / totalStats.Plays);
totalStats.Wins += stats.Wins;
totalStats.Top3s += stats.Top3s;
totalStats.Loses += stats.Loses;
if (totalStats.Plays != 0)
{
totalStats.AvgDamage = Calculation.Round2Digits(totalStats.TotalDamage / totalStats.Plays);
totalStats.AvgPhysicalDamage = Calculation.Round2Digits(totalStats.TotalPhysicalDamage / totalStats.Plays);
totalStats.AvgMagicDamage = Calculation.Round2Digits(totalStats.TotalMagicDamage / totalStats.Plays);
totalStats.AvgRealDamage = Calculation.Round2Digits(totalStats.TotalRealDamage / totalStats.Plays);
totalStats.AvgTakenDamage = Calculation.Round2Digits(totalStats.TotalTakenDamage / totalStats.Plays);
totalStats.AvgTakenPhysicalDamage = Calculation.Round2Digits(totalStats.TotalTakenPhysicalDamage / totalStats.Plays);
totalStats.AvgTakenMagicDamage = Calculation.Round2Digits(totalStats.TotalTakenMagicDamage / totalStats.Plays);
totalStats.AvgTakenRealDamage = Calculation.Round2Digits(totalStats.TotalTakenRealDamage / totalStats.Plays);
totalStats.AvgLiveRound = totalStats.LiveRound / totalStats.Plays;
totalStats.AvgActionTurn = totalStats.ActionTurn / totalStats.Plays;
totalStats.AvgLiveTime = Calculation.Round2Digits(totalStats.LiveTime / totalStats.Plays);
totalStats.AvgEarnedMoney = totalStats.TotalEarnedMoney / totalStats.Plays;
totalStats.Winrates = Calculation.Round4Digits(Convert.ToDouble(totalStats.Wins) / Convert.ToDouble(totalStats.Plays));
totalStats.Top3rates = Calculation.Round4Digits(Convert.ToDouble(totalStats.Top3s) / Convert.ToDouble(totalStats.Plays));
}
if (totalStats.LiveRound != 0) totalStats.DamagePerRound = Calculation.Round2Digits(totalStats.TotalDamage / totalStats.LiveRound);
if (totalStats.ActionTurn != 0) totalStats.DamagePerTurn = Calculation.Round2Digits(totalStats.TotalDamage / totalStats.ActionTurn);
if (totalStats.LiveTime != 0) totalStats.DamagePerSecond = Calculation.Round2Digits(totalStats.TotalDamage / totalStats.LiveTime);
}
if (totalStats.LiveRound != 0) totalStats.DamagePerRound = Calculation.Round2Digits(totalStats.TotalDamage / totalStats.LiveRound);
if (totalStats.ActionTurn != 0) totalStats.DamagePerTurn = Calculation.Round2Digits(totalStats.TotalDamage / totalStats.ActionTurn);
if (totalStats.LiveTime != 0) totalStats.DamagePerSecond = Calculation.Round2Digits(totalStats.TotalDamage / totalStats.LiveTime);
}
}
else
{
foreach (Character character in actionQueue.CharacterStatistics.OrderByDescending(d => d.Value.TotalDamage).Select(d => d.Key))
{
StringBuilder builder = new();
CharacterStatistics stats = actionQueue.CharacterStatistics[character];
builder.AppendLine($"{count}. [ {character.ToStringWithLevel()} ] {stats.Kills} / {stats.Assists}");
builder.AppendLine($"存活时长:{stats.LiveTime} / 存活回合数:{stats.LiveRound} / 行动回合数:{stats.ActionTurn}");
builder.AppendLine($"总计伤害:{stats.TotalDamage} / 总计物理伤害:{stats.TotalPhysicalDamage} / 总计魔法伤害:{stats.TotalMagicDamage}");
builder.AppendLine($"总承受伤害:{stats.TotalTakenDamage} / 总承受物理伤害:{stats.TotalTakenPhysicalDamage} / 总承受魔法伤害:{stats.TotalTakenMagicDamage}");
builder.Append($"每秒伤害:{stats.DamagePerSecond} / 每回合伤害:{stats.DamagePerTurn}");
if (count++ <= top)
{
WriteLine(builder.ToString());
}
else
{
if (PrintOut) Console.WriteLine(builder.ToString());
}
CharacterStatistics? totalStats = CharacterStatistics.Where(kv => kv.Key.GetName() == character.GetName()).Select(kv => kv.Value).FirstOrDefault();
if (totalStats != null)
{
// 统计此角色的所有数据
totalStats.TotalDamage = Calculation.Round2Digits(totalStats.TotalDamage + stats.TotalDamage);
totalStats.TotalPhysicalDamage = Calculation.Round2Digits(totalStats.TotalPhysicalDamage + stats.TotalPhysicalDamage);
totalStats.TotalMagicDamage = Calculation.Round2Digits(totalStats.TotalMagicDamage + stats.TotalMagicDamage);
totalStats.TotalRealDamage = Calculation.Round2Digits(totalStats.TotalRealDamage + stats.TotalRealDamage);
totalStats.TotalTakenDamage = Calculation.Round2Digits(totalStats.TotalTakenDamage + stats.TotalTakenDamage);
totalStats.TotalTakenPhysicalDamage = Calculation.Round2Digits(totalStats.TotalTakenPhysicalDamage + stats.TotalTakenPhysicalDamage);
totalStats.TotalTakenMagicDamage = Calculation.Round2Digits(totalStats.TotalTakenMagicDamage + stats.TotalTakenMagicDamage);
totalStats.TotalTakenRealDamage = Calculation.Round2Digits(totalStats.TotalTakenRealDamage + stats.TotalTakenRealDamage);
totalStats.LiveRound += stats.LiveRound;
totalStats.ActionTurn += stats.ActionTurn;
totalStats.LiveTime = Calculation.Round2Digits(totalStats.LiveTime + stats.LiveTime);
totalStats.TotalEarnedMoney += stats.TotalEarnedMoney;
totalStats.Kills += stats.Kills;
totalStats.Deaths += stats.Deaths;
totalStats.Assists += stats.Assists;
totalStats.FirstKills += stats.FirstKills;
totalStats.FirstDeaths += stats.FirstDeaths;
totalStats.LastRank = stats.LastRank;
double totalRank = totalStats.AvgRank * totalStats.Plays + totalStats.LastRank;
totalStats.Plays += stats.Plays;
if (totalStats.Plays != 0) totalStats.AvgRank = Calculation.Round2Digits(totalRank / totalStats.Plays);
totalStats.Wins += stats.Wins;
totalStats.Top3s += stats.Top3s;
totalStats.Loses += stats.Loses;
if (totalStats.Plays != 0)
{
totalStats.AvgDamage = Calculation.Round2Digits(totalStats.TotalDamage / totalStats.Plays);
totalStats.AvgPhysicalDamage = Calculation.Round2Digits(totalStats.TotalPhysicalDamage / totalStats.Plays);
totalStats.AvgMagicDamage = Calculation.Round2Digits(totalStats.TotalMagicDamage / totalStats.Plays);
totalStats.AvgRealDamage = Calculation.Round2Digits(totalStats.TotalRealDamage / totalStats.Plays);
totalStats.AvgTakenDamage = Calculation.Round2Digits(totalStats.TotalTakenDamage / totalStats.Plays);
totalStats.AvgTakenPhysicalDamage = Calculation.Round2Digits(totalStats.TotalTakenPhysicalDamage / totalStats.Plays);
totalStats.AvgTakenMagicDamage = Calculation.Round2Digits(totalStats.TotalTakenMagicDamage / totalStats.Plays);
totalStats.AvgTakenRealDamage = Calculation.Round2Digits(totalStats.TotalTakenRealDamage / totalStats.Plays);
totalStats.AvgLiveRound = totalStats.LiveRound / totalStats.Plays;
totalStats.AvgActionTurn = totalStats.ActionTurn / totalStats.Plays;
totalStats.AvgLiveTime = Calculation.Round2Digits(totalStats.LiveTime / totalStats.Plays);
totalStats.AvgEarnedMoney = totalStats.TotalEarnedMoney / totalStats.Plays;
totalStats.Winrates = Calculation.Round4Digits(Convert.ToDouble(totalStats.Wins) / Convert.ToDouble(totalStats.Plays));
totalStats.Top3rates = Calculation.Round4Digits(Convert.ToDouble(totalStats.Top3s) / Convert.ToDouble(totalStats.Plays));
}
if (totalStats.LiveRound != 0) totalStats.DamagePerRound = Calculation.Round2Digits(totalStats.TotalDamage / totalStats.LiveRound);
if (totalStats.ActionTurn != 0) totalStats.DamagePerTurn = Calculation.Round2Digits(totalStats.TotalDamage / totalStats.ActionTurn);
if (totalStats.LiveTime != 0) totalStats.DamagePerSecond = Calculation.Round2Digits(totalStats.TotalDamage / totalStats.LiveTime);
}
}
}
result.Add(Msg);
// 显示每个角色的信息
@ -478,13 +584,27 @@ namespace Oshima.Core.Utils
}
}
lock (StatsConfig)
if (isTeam)
{
foreach (Character c in CharacterStatistics.Keys)
lock (TeamStatsConfig)
{
StatsConfig.Add(c.ToStringWithOutUser(), CharacterStatistics[c]);
foreach (Character c in TeamCharacterStatistics.Keys)
{
TeamStatsConfig.Add(c.ToStringWithOutUser(), TeamCharacterStatistics[c]);
}
TeamStatsConfig.SaveConfig();
}
}
else
{
lock (StatsConfig)
{
foreach (Character c in CharacterStatistics.Keys)
{
StatsConfig.Add(c.ToStringWithOutUser(), CharacterStatistics[c]);
}
StatsConfig.SaveConfig();
}
StatsConfig.SaveConfig();
}
IsRuning = false;
@ -506,13 +626,57 @@ namespace Oshima.Core.Utils
if (PrintOut) Console.WriteLine(str);
}
public static void (ActionQueue queue)
public static void (ActionQueue queue, ref int wQuality, ref int aQuality, ref int sQuality, ref int acQuality)
{
Item a = Items[Random.Shared.Next(Items.Count)];
Item[] = [a];
WriteLine($"社区送温暖了,现在向所有人发放 [ {a.Name} ]");
WriteLine($"社区送温暖了,现在随机发放空投!!");
foreach (Character character in queue.Queue)
{
int t1 = wQuality;
int t2 = aQuality;
int t3 = sQuality;
int t4 = acQuality;
Item[] = Items.Where(i => i.Id.ToString().StartsWith("11") && (int)i.QualityType == t1).ToArray();
if (wQuality < 4)
{
wQuality++;
}
Item[] = Items.Where(i => i.Id.ToString().StartsWith("12") && (int)i.QualityType == t2).ToArray();
if (aQuality < 1)
{
aQuality++;
}
Item[] = Items.Where(i => i.Id.ToString().StartsWith("13") && (int)i.QualityType == t3).ToArray();
if (sQuality < 1)
{
sQuality++;
}
Item[] = Items.Where(i => i.Id.ToString().StartsWith("14") && (int)i.QualityType == t4).ToArray();
if (acQuality < 3)
{
acQuality++;
}
Item? a = null, b = null, c = null, d = null;
if (.Length > 0)
{
a = [Random.Shared.Next(.Length)];
}
if (.Length > 0)
{
b = [Random.Shared.Next(.Length)];
}
if (.Length > 0)
{
c = [Random.Shared.Next(.Length)];
}
if (.Length > 0)
{
d = [Random.Shared.Next(.Length)];
}
List<Item> = [];
if (a != null) .Add(a);
if (b != null) .Add(b);
if (c != null) .Add(c);
if (d != null) .Add(d);
foreach (Item item in )
{
Item realItem = item.Copy(1);
@ -551,6 +715,20 @@ namespace Oshima.Core.Utils
CharacterStatistics[character] = StatsConfig.Get<CharacterStatistics>(character.ToStringWithOutUser()) ?? CharacterStatistics[character];
}
}
foreach (Character c in Characters)
{
TeamCharacterStatistics.Add(c, new());
}
TeamStatsConfig.LoadConfig();
foreach (Character character in TeamCharacterStatistics.Keys)
{
if (TeamStatsConfig.ContainsKey(character.ToStringWithOutUser()))
{
TeamCharacterStatistics[character] = TeamStatsConfig.Get<CharacterStatistics>(character.ToStringWithOutUser()) ?? TeamCharacterStatistics[character];
}
}
Dictionary<string, Item> exItems = Factory.GetGameModuleInstances<Item>(OshimaGameModuleConstant.General, OshimaGameModuleConstant.Item);
Items.AddRange(exItems.Values);

View File

@ -10,6 +10,7 @@ namespace Oshima.FunGame.OshimaModules.Items
public override long Id => (long)AccessoryID.10;
public override string Name => "攻击之爪 +10";
public override string Description => Skills.Passives.Count > 0 ? Skills.Passives.First().Description : "";
public override QualityType QualityType => QualityType.White;
public 10(Character? character = null) : base(ItemType.Accessory)
{
@ -22,6 +23,7 @@ namespace Oshima.FunGame.OshimaModules.Items
public override long Id => (long)AccessoryID.30;
public override string Name => "攻击之爪 +30";
public override string Description => Skills.Passives.Count > 0 ? Skills.Passives.First().Description : "";
public override QualityType QualityType => QualityType.Green;
public 30(Character? character = null) : base(ItemType.Accessory)
{
@ -34,6 +36,7 @@ namespace Oshima.FunGame.OshimaModules.Items
public override long Id => (long)AccessoryID.50;
public override string Name => "攻击之爪 +50";
public override string Description => Skills.Passives.Count > 0 ? Skills.Passives.First().Description : "";
public override QualityType QualityType => QualityType.Blue;
public 50(Character? character = null) : base(ItemType.Accessory)
{

View File

@ -100,6 +100,15 @@ namespace Oshima.FunGame.OshimaModules
EffectID.ExMDF => new ExMDF(skill, dict),
EffectID.ExHR => new ExHR(skill, dict),
EffectID.ExMR => new ExMR(skill, dict),
EffectID.ExATK2 => new ExATK2(skill, dict),
EffectID.ExDEF2 => new ExDEF2(skill, dict),
EffectID.ExSTR2 => new ExSTR2(skill, dict),
EffectID.ExAGI2 => new ExAGI2(skill, dict),
EffectID.ExINT2 => new ExINT2(skill, dict),
EffectID.SkillHardTimeReduce2 => new SkillHardTimeReduce2(skill, dict),
EffectID.NormalAttackHardTimeReduce2 => new NormalAttackHardTimeReduce2(skill, dict),
EffectID.ExMaxHP2 => new ExMaxHP2(skill, dict),
EffectID.ExMaxMP2 => new ExMaxMP2(skill, dict),
_ => null
};
}

View File

@ -339,7 +339,7 @@ namespace Oshima.FunGame.OshimaServers
SendAllGamingMessage(data, c.GetInfo());
}
ActionQueue actionQueue = new(inGameCharacters, (str) =>
ActionQueue actionQueue = new(inGameCharacters, false, (str) =>
{
SendAllGamingMessage(data, str);
});

View File

@ -6,6 +6,7 @@
"BackgroundStory": "传说中的黑暗之刃,蕴含邪恶力量。",
"ItemType": 1,
"WeaponType": 1,
"QualityType": 0,
"Price": 0,
"Skills": {
"Active": null,
@ -31,6 +32,7 @@
"BackgroundStory": "火焰中锻造的长剑,散发着炙热气息。",
"ItemType": 1,
"WeaponType": 2,
"QualityType": 0,
"Price": 0,
"Skills": {
"Active": null,
@ -56,6 +58,7 @@
"BackgroundStory": "由稀有银月材料制成,精准无比。",
"ItemType": 1,
"WeaponType": 3,
"QualityType": 0,
"Price": 0,
"Skills": {
"Active": null,
@ -81,6 +84,7 @@
"BackgroundStory": "捕捉风暴之力的武器,射速惊人。",
"ItemType": 1,
"WeaponType": 5,
"QualityType": 0,
"Price": 0,
"Skills": {
"Active": null,
@ -106,6 +110,7 @@
"BackgroundStory": "无形的力量增强拳套,适合迅捷攻击。",
"ItemType": 1,
"WeaponType": 11,
"QualityType": 0,
"Price": 0,
"Skills": {
"Active": null,
@ -131,6 +136,7 @@
"BackgroundStory": "蕴含雷霆之力的神秘之剑,斩击时带有雷电。",
"ItemType": 1,
"WeaponType": 1,
"QualityType": 1,
"Price": 0,
"Skills": {
"Active": null,
@ -156,6 +162,7 @@
"BackgroundStory": "由远古龙骨锻造而成的巨剑,威力无比。",
"ItemType": 1,
"WeaponType": 2,
"QualityType": 1,
"Price": 0,
"Skills": {
"Active": null,
@ -181,6 +188,7 @@
"BackgroundStory": "能够穿透黑暗的弓,适合隐匿射击。",
"ItemType": 1,
"WeaponType": 3,
"QualityType": 1,
"Price": 0,
"Skills": {
"Active": null,
@ -206,6 +214,7 @@
"BackgroundStory": "能够发射赤焰的手枪,近距离威力极大。",
"ItemType": 1,
"WeaponType": 4,
"QualityType": 1,
"Price": 0,
"Skills": {
"Active": null,
@ -231,6 +240,7 @@
"BackgroundStory": "据说能够召唤天空之力的法杖,拥有强大魔力。",
"ItemType": 1,
"WeaponType": 8,
"QualityType": 1,
"Price": 0,
"Skills": {
"Active": null,
@ -256,6 +266,7 @@
"BackgroundStory": "这把剑燃烧着永恒的火焰,传说可以焚尽一切。",
"ItemType": 1,
"WeaponType": 1,
"QualityType": 2,
"Skills": {
"Active": null,
"Passives": [
@ -280,6 +291,7 @@
"BackgroundStory": "每次射击都能引发狂风,传说它由风神亲手打造。",
"ItemType": 1,
"WeaponType": 3,
"QualityType": 2,
"Skills": {
"Active": null,
"Passives": [
@ -304,6 +316,7 @@
"BackgroundStory": "在破晓时分,这把长枪能够穿透任何黑暗。",
"ItemType": 1,
"WeaponType": 9,
"QualityType": 2,
"Skills": {
"Active": null,
"Passives": [
@ -328,6 +341,7 @@
"BackgroundStory": "这对匕首闪烁着死亡的光芒,专为刺客所用。",
"ItemType": 1,
"WeaponType": 6,
"QualityType": 2,
"Skills": {
"Active": null,
"Passives": [
@ -352,6 +366,7 @@
"BackgroundStory": "召唤天雷的法杖,拥有毁天灭地的力量。",
"ItemType": 1,
"WeaponType": 8,
"QualityType": 2,
"Skills": {
"Active": null,
"Passives": [
@ -376,6 +391,7 @@
"BackgroundStory": "此剑驾驭飞雷之力,能引发猛烈的雷击。",
"ItemType": 1,
"WeaponType": 1,
"QualityType": 3,
"Skills": {
"Active": null,
"Passives": [
@ -400,6 +416,7 @@
"BackgroundStory": "法杖中燃烧着不灭的火焰,象征着无尽的力量。",
"ItemType": 1,
"WeaponType": 8,
"QualityType": 3,
"Skills": {
"Active": null,
"Passives": [
@ -424,6 +441,7 @@
"BackgroundStory": "由远古龙骨制成的长柄武器,坚不可摧。",
"ItemType": 1,
"WeaponType": 9,
"QualityType": 3,
"Skills": {
"Active": null,
"Passives": [
@ -448,6 +466,7 @@
"BackgroundStory": "双持短刀,速度如疾风般迅捷。",
"ItemType": 1,
"WeaponType": 6,
"QualityType": 3,
"Skills": {
"Active": null,
"Passives": [
@ -472,6 +491,7 @@
"BackgroundStory": "由冰晶打造的手枪,子弹带有极寒之力。",
"ItemType": 1,
"WeaponType": 4,
"QualityType": 3,
"Skills": {
"Active": null,
"Passives": [
@ -496,6 +516,7 @@
"BackgroundStory": "藏于黑暗中的锋利刀刃,只在敌人未察觉时现身。",
"ItemType": 1,
"WeaponType": 11,
"QualityType": 4,
"Skills": {
"Active": null,
"Passives": [
@ -520,6 +541,7 @@
"BackgroundStory": "弓弦上凝聚寒霜,箭矢能冻结一切。",
"ItemType": 1,
"WeaponType": 3,
"QualityType": 4,
"Skills": {
"Active": null,
"Passives": [
@ -544,6 +566,7 @@
"BackgroundStory": "携带雷电之力的巨斧,一击之下,雷声轰鸣。",
"ItemType": 1,
"WeaponType": 2,
"QualityType": 4,
"Skills": {
"Active": null,
"Passives": [
@ -568,6 +591,7 @@
"BackgroundStory": "拳套内的力量能激发佩戴者的狂怒,造成大量伤害。",
"ItemType": 1,
"WeaponType": 10,
"QualityType": 4,
"Skills": {
"Active": null,
"Passives": [
@ -592,6 +616,7 @@
"BackgroundStory": "法器中蕴含着星辰之力,每一次攻击都如天外陨石降临。",
"ItemType": 1,
"WeaponType": 7,
"QualityType": 4,
"Skills": {
"Active": null,
"Passives": [
@ -609,24 +634,76 @@
]
}
},
"圣洁之盾": {
"Id": 20001,
"Name": "圣洁之盾",
"Description": "受到的物理伤害减少 25%。",
"BackgroundStory": "传说中由圣光祝福的盾牌,能够抵挡邪恶的力量。",
"初级法袍": {
"Id": 12501,
"Name": "初级法袍",
"Description": "增加 20 点物理护甲。",
"BackgroundStory": "可以不穿,不能没有。",
"ItemType": 2,
"WeaponType": 0,
"QualityType": 0,
"Skills": {
"Active": null,
"Passives": [
{
"Id": 7100,
"Id": 7101,
"Name": "初级法袍",
"SkillType": 3,
"Effects": [
{
"Id": 8002,
"exdef": 20
}
]
}
]
}
},
"高中校服": {
"Id": 12502,
"Name": "初级法袍",
"Description": "增加 10% 魔法抗性。",
"BackgroundStory": "珍藏的回忆。",
"ItemType": 2,
"WeaponType": 0,
"QualityType": 0,
"Skills": {
"Active": null,
"Passives": [
{
"Id": 7102,
"Name": "高中校服",
"SkillType": 3,
"Effects": [
{
"Id": 8020,
"mdftype": 0,
"mdfvalue": 0.2
}
]
}
]
}
},
"圣洁之盾": {
"Id": 12503,
"Name": "圣洁之盾",
"Description": "受到的物理伤害减少 20%。",
"BackgroundStory": "传说中由圣光祝福的盾牌,能够抵挡邪恶的力量。",
"ItemType": 2,
"WeaponType": 0,
"QualityType": 1,
"Skills": {
"Active": null,
"Passives": [
{
"Id": 7103,
"Name": "圣光护佑",
"SkillType": 3,
"Effects": [
{
"Id": 8019,
"expdr": 0.25
"expdr": 0.20
}
]
}
@ -634,12 +711,13 @@
}
},
"魔能法袍": {
"Id": 20005,
"Id": 12504,
"Name": "魔能法袍",
"Description": "提高 20% 魔抗,增加 15 点智力。",
"Description": "增加 15 点智力和 20% 魔法抗性。",
"BackgroundStory": "法袍蕴含着神秘的魔力,穿戴者能增强魔法威力。",
"ItemType": 2,
"WeaponType": 0,
"QualityType": 1,
"Skills": {
"Active": null,
"Passives": [
@ -661,5 +739,548 @@
}
]
}
},
"炼狱战铠": {
"Id": 12505,
"Name": "炼狱战铠",
"Description": "增加 40 点物理护甲,增加 10 点每时间生命回复。",
"BackgroundStory": "在无尽战火中锻造而成,具有极高的防御力。",
"ItemType": 2,
"WeaponType": 0,
"QualityType": 1,
"Skills": {
"Active": null,
"Passives": [
{
"Id": 7105,
"Name": "战火庇护",
"SkillType": 3,
"Effects": [
{
"Id": 8002,
"exdef": 40
},
{
"Id": 8021,
"exhr": 10
}
]
}
]
}
},
"幽影斗篷": {
"Id": 12506,
"Name": "幽影斗篷",
"Description": "增加 30 点物理护甲和 8% 闪避率。",
"BackgroundStory": "黑暗中编织而成的斗篷,能让穿戴者更加敏捷。",
"ItemType": 2,
"WeaponType": 0,
"QualityType": 1,
"Skills": {
"Active": null,
"Passives": [
{
"Id": 7106,
"Name": "幽影闪避",
"SkillType": 3,
"Effects": [
{
"Id": 8002,
"exdef": 30
},
{
"Id": 8016,
"exer": 0.08
}
]
}
]
}
},
"帆布鞋": {
"Id": 13501,
"Name": "帆布鞋",
"Description": "增加 30 点行动速度。",
"BackgroundStory": "一如年少模样。",
"ItemType": 3,
"WeaponType": 0,
"QualityType": 0,
"Skills": {
"Active": null,
"Passives": [
{
"Id": 7701,
"Name": "帆布鞋",
"SkillType": 3,
"Effects": [
{
"Id": 8009,
"exspd": 30
}
]
}
]
}
},
"疾风靴": {
"Id": 13502,
"Name": "疾风靴",
"Description": "增加 65 点行动速度,使穿戴者行动更加敏捷。",
"BackgroundStory": "这双靴子由风元素加持,步伐轻盈如风。",
"ItemType": 3,
"WeaponType": 0,
"QualityType": 1,
"Skills": {
"Active": null,
"Passives": [
{
"Id": 7702,
"Name": "疾风靴",
"SkillType": 3,
"Effects": [
{
"Id": 8009,
"exspd": 65
}
]
}
]
}
},
"轻灵之鞋": {
"Id": 13503,
"Name": "轻灵之鞋",
"Description": "增加 45 点行动速度,并提高 10% 闪避率。",
"BackgroundStory": "传说这双鞋能让穿戴者的步伐鬼魅般飘忽不定。",
"ItemType": 3,
"WeaponType": 0,
"QualityType": 1,
"Skills": {
"Active": null,
"Passives": [
{
"Id": 7703,
"Name": "轻灵之步",
"SkillType": 3,
"Effects": [
{
"Id": 8009,
"exspd": 45
},
{
"Id": 8016,
"exer": 0.1
}
]
}
]
}
},
"雷电靴": {
"Id": 13504,
"Name": "雷电靴",
"Description": "增加 45 点行动速度,并提高 10% 冷却缩减。",
"BackgroundStory": "这双靴子蕴含雷电之力,使穿戴者快速出击。",
"ItemType": 3,
"WeaponType": 0,
"QualityType": 1,
"Skills": {
"Active": null,
"Passives": [
{
"Id": 7704,
"Name": "雷霆之速",
"SkillType": 3,
"Effects": [
{
"Id": 8009,
"exspd": 45
},
{
"Id": 8011,
"excdr": 0.1
}
]
}
]
}
},
"暗影之靴": {
"Id": 13505,
"Name": "暗影之靴",
"Description": "增加 38 点行动速度,并提高 8% 暴击率。",
"BackgroundStory": "这双鞋在黑暗中隐藏,赋予穿戴者暗影的力量。",
"ItemType": 3,
"WeaponType": 0,
"QualityType": 1,
"Skills": {
"Active": null,
"Passives": [
{
"Id": 7705,
"Name": "暗影疾行",
"SkillType": 3,
"Effects": [
{
"Id": 8009,
"exspd": 38
},
{
"Id": 8014,
"excr": 0.08
}
]
}
]
}
},
"守护吊坠": {
"Id": 14501,
"Name": "守护吊坠",
"Description": "增加 3 点所有力量、敏捷、智力。",
"BackgroundStory": "带着一丝丝念想。",
"ItemType": 4,
"WeaponType": 0,
"QualityType": 0,
"Skills": {
"Active": null,
"Passives": [
{
"Id": 7301,
"Name": "守护吊坠",
"SkillType": 3,
"Effects": [
{
"Id": 8003,
"exstr": 3
},
{
"Id": 8004,
"exagi": 3
},
{
"Id": 8005,
"exint": 3
}
]
}
]
}
},
"富贵头冠": {
"Id": 14502,
"Name": "富贵头冠",
"Description": "增加 170 点最大生命值和 80 点最大魔法值。",
"BackgroundStory": "辉煌华贵的头冠。",
"ItemType": 4,
"WeaponType": 0,
"QualityType": 0,
"Skills": {
"Active": null,
"Passives": [
{
"Id": 7302,
"Name": "守护吊坠",
"SkillType": 3,
"Effects": [
{
"Id": 8012,
"exhp": 170
},
{
"Id": 8013,
"exmp": 80
}
]
}
]
}
},
"黄金挂坠": {
"Id": 14503,
"Name": "黄金挂坠",
"Description": "增加 300 点最大生命值。",
"BackgroundStory": "珍贵稀有的黄金挂件,象征财富与荣耀的护身符。",
"ItemType": 4,
"WeaponType": 0,
"QualityType": 1,
"Skills": {
"Active": null,
"Passives": [
{
"Id": 7303,
"Name": "守护吊坠",
"SkillType": 3,
"Effects": [
{
"Id": 8012,
"exhp": 300
}
]
}
]
}
},
"辉煌光环": {
"Id": 14504,
"Name": "辉煌光环",
"Description": "增加 170 点最大魔法值和 6 点每时间魔法回复。",
"BackgroundStory": "流光溢彩的光环。",
"ItemType": 4,
"WeaponType": 0,
"QualityType": 1,
"Skills": {
"Active": null,
"Passives": [
{
"Id": 7304,
"Name": "辉煌光环",
"SkillType": 3,
"Effects": [
{
"Id": 8013,
"exmp": 170
},
{
"Id": 8022,
"exmr": 6
}
]
}
]
}
},
"银质手环": {
"Id": 14505,
"Name": "银质手环",
"Description": "提升 6 点所有力量、敏捷、智力。",
"BackgroundStory": "素雅精致的银质手环。",
"ItemType": 4,
"WeaponType": 0,
"QualityType": 1,
"Skills": {
"Active": null,
"Passives": [
{
"Id": 7305,
"Name": "银质手环",
"SkillType": 3,
"Effects": [
{
"Id": 8003,
"exstr": 6
},
{
"Id": 8004,
"exagi": 6
},
{
"Id": 8005,
"exint": 6
}
]
}
]
}
},
"星辉护符": {
"Id": 14506,
"Name": "星辉护符",
"Description": "提升 15 点智力,提升暴击伤害 12%。",
"BackgroundStory": "护符上镶嵌着神秘的星辉宝石,传说能提升佩戴者的法术威力。",
"ItemType": 4,
"WeaponType": 0,
"QualityType": 2,
"Skills": {
"Active": null,
"Passives": [
{
"Id": 7306,
"Name": "星辉启示",
"SkillType": 3,
"Effects": [
{
"Id": 8005,
"exint": 15
},
{
"Id": 8015,
"excrd": 0.12
}
]
}
]
}
},
"雷鸣之戒": {
"Id": 14507,
"Name": "雷鸣之戒",
"Description": "增加 12 点力量和 8% 暴击率。",
"BackgroundStory": "戒指中流淌着雷电的力量,增强佩戴者的战斗威力。",
"ItemType": 4,
"WeaponType": 0,
"QualityType": 2,
"Skills": {
"Active": null,
"Passives": [
{
"Id": 7307,
"Name": "雷电之力",
"SkillType": 3,
"Effects": [
{
"Id": 8003,
"exstr": 12
},
{
"Id": 8014,
"excr": 0.08
}
]
}
]
}
},
"精灵之戒": {
"Id": 14508,
"Name": "精灵之戒",
"Description": "提升 10 每时间魔法回复,并增加 8 点智力。",
"BackgroundStory": "这枚戒指由精灵制成,能够帮助法师更快地恢复法力。",
"ItemType": 4,
"WeaponType": 0,
"QualityType": 2,
"Skills": {
"Active": null,
"Passives": [
{
"Id": 7308,
"Name": "法力复苏",
"SkillType": 3,
"Effects": [
{
"Id": 8022,
"exmr": 10
},
{
"Id": 8005,
"exint": 8
}
]
}
]
}
},
"暗影项链": {
"Id": 14509,
"Name": "暗影项链",
"Description": "增加 20 点敏捷和 20 点行动速度。",
"BackgroundStory": "项链蕴含着黑暗的力量,让佩戴者更具敏捷性。",
"ItemType": 4,
"WeaponType": 0,
"QualityType": 2,
"Skills": {
"Active": null,
"Passives": [
{
"Id": 7309,
"Name": "黑暗敏捷",
"SkillType": 3,
"Effects": [
{
"Id": 8015,
"excrd": 0.15
},
{
"Id": 8009,
"exspd": 20
}
]
}
]
}
},
"YukiのCalfSocks": {
"Id": 14510,
"Name": "YukiのCalfSocks",
"Description": "增加 15% 暴击率和 30% 暴击伤害。",
"BackgroundStory": "小雪的小腿袜,拥有神秘的力量,令人神往。",
"ItemType": 4,
"WeaponType": 0,
"QualityType": 3,
"Skills": {
"Active": null,
"Passives": [
{
"Id": 7310,
"Name": "YukiのCalfSocks",
"SkillType": 3,
"Effects": [
{
"Id": 8014,
"excr": 0.15
},
{
"Id": 8015,
"excrd": 0.3
}
]
}
]
}
},
"诺尔希的现代汉语字典": {
"Id": 14511,
"Name": "诺尔希的现代汉语字典",
"Description": "增加 15% 攻击力和 8% 物理护甲。",
"BackgroundStory": "懂又不懂。",
"ItemType": 4,
"WeaponType": 0,
"QualityType": 3,
"Skills": {
"Active": null,
"Passives": [
{
"Id": 7311,
"Name": "诺尔希的现代汉语字典",
"SkillType": 3,
"Effects": [
{
"Id": 8024,
"exdef": 0.08
},
{
"Id": 8023,
"exatk": 0.15
}
]
}
]
}
},
"金刚石": {
"Id": 14512,
"Name": "金刚石",
"Description": "增加 10% 最大生命值。",
"BackgroundStory": "罕见宝石,蕴含不可动摇的坚韧之力。",
"ItemType": 4,
"WeaponType": 0,
"QualityType": 3,
"Skills": {
"Active": null,
"Passives": [
{
"Id": 7312,
"Name": "金刚石",
"SkillType": 3,
"Effects": [
{
"Id": 8030,
"exhp": 0.10
}
]
}
]
}
}
}