mirror of
https://github.com/project-redbud/FunGame-Core.git
synced 2025-12-05 00:06:02 +00:00
错别字更改;GameMap添加新的移动方法
This commit is contained in:
parent
29bf7e4c3d
commit
ccf09b478e
@ -1401,7 +1401,7 @@ namespace Milimoe.FunGame.Core.Entity
|
||||
double exHP = ExHP + ExHP2 + ExHP3;
|
||||
List<string> shield = [];
|
||||
if (Shield.TotalPhysical > 0) shield.Add($"物理:{Shield.TotalPhysical:0.##}");
|
||||
if (Shield.TotalMagicial > 0) shield.Add($"魔法:{Shield.TotalMagicial:0.##}");
|
||||
if (Shield.TotalMagical > 0) shield.Add($"魔法:{Shield.TotalMagical:0.##}");
|
||||
if (Shield.TotalMix > 0) shield.Add($"混合:{Shield.TotalMix:0.##}");
|
||||
builder.AppendLine($"生命值:{HP:0.##} / {MaxHP:0.##}" + (exHP != 0 ? $" [{BaseHP:0.##} {(exHP >= 0 ? "+" : "-")} {Math.Abs(exHP):0.##}]" : "") + (shield.Count > 0 ? $"({string.Join(",", shield)})" : ""));
|
||||
double exMP = ExMP + ExMP2 + ExMP3;
|
||||
@ -1488,7 +1488,7 @@ namespace Milimoe.FunGame.Core.Entity
|
||||
double exHP = ExHP + ExHP2 + ExHP3;
|
||||
List<string> shield = [];
|
||||
if (Shield.TotalPhysical > 0) shield.Add($"物理:{Shield.TotalPhysical:0.##}");
|
||||
if (Shield.TotalMagicial > 0) shield.Add($"魔法:{Shield.TotalMagicial:0.##}");
|
||||
if (Shield.TotalMagical > 0) shield.Add($"魔法:{Shield.TotalMagical:0.##}");
|
||||
if (Shield.TotalMix > 0) shield.Add($"混合:{Shield.TotalMix:0.##}");
|
||||
builder.AppendLine($"生命值:{HP:0.##} / {MaxHP:0.##}" + (exHP != 0 ? $" [{BaseHP:0.##} {(exHP >= 0 ? "+" : "-")} {Math.Abs(exHP):0.##}]" : "") + (shield.Count > 0 ? $"({string.Join(",", shield)})" : ""));
|
||||
double exMP = ExMP + ExMP2 + ExMP3;
|
||||
@ -1583,7 +1583,7 @@ namespace Milimoe.FunGame.Core.Entity
|
||||
double exHP = ExHP + ExHP2 + ExHP3;
|
||||
List<string> shield = [];
|
||||
if (Shield.TotalPhysical > 0) shield.Add($"物理:{Shield.TotalPhysical:0.##}");
|
||||
if (Shield.TotalMagicial > 0) shield.Add($"魔法:{Shield.TotalMagicial:0.##}");
|
||||
if (Shield.TotalMagical > 0) shield.Add($"魔法:{Shield.TotalMagical:0.##}");
|
||||
if (Shield.TotalMix > 0) shield.Add($"混合:{Shield.TotalMix:0.##}");
|
||||
builder.AppendLine($"生命值:{HP:0.##} / {MaxHP:0.##}" + (exHP != 0 ? $" [{BaseHP:0.##} {(exHP >= 0 ? "+" : "-")} {Math.Abs(exHP):0.##}]" : "") + (shield.Count > 0 ? $"({string.Join(",", shield)})" : ""));
|
||||
double exMP = ExMP + ExMP2 + ExMP3;
|
||||
@ -1623,7 +1623,7 @@ namespace Milimoe.FunGame.Core.Entity
|
||||
double exHP = ExHP + ExHP2 + ExHP3;
|
||||
List<string> shield = [];
|
||||
if (Shield.TotalPhysical > 0) shield.Add($"物理:{Shield.TotalPhysical:0.##}");
|
||||
if (Shield.TotalMagicial > 0) shield.Add($"魔法:{Shield.TotalMagicial:0.##}");
|
||||
if (Shield.TotalMagical > 0) shield.Add($"魔法:{Shield.TotalMagical:0.##}");
|
||||
if (Shield.TotalMix > 0) shield.Add($"混合:{Shield.TotalMix:0.##}");
|
||||
builder.AppendLine($"生命值:{HP:0.##} / {MaxHP:0.##}" + (exHP != 0 ? $" [{BaseHP:0.##} {(exHP >= 0 ? "+" : "-")} {Math.Abs(exHP):0.##}]" : "") + (shield.Count > 0 ? $"({string.Join(",", shield)})" : ""));
|
||||
double exMP = ExMP + ExMP2 + ExMP3;
|
||||
@ -1698,7 +1698,7 @@ namespace Milimoe.FunGame.Core.Entity
|
||||
double exHP = ExHP + ExHP2 + ExHP3;
|
||||
List<string> shield = [];
|
||||
if (Shield.TotalPhysical > 0) shield.Add($"物理:{Shield.TotalPhysical:0.##}");
|
||||
if (Shield.TotalMagicial > 0) shield.Add($"魔法:{Shield.TotalMagicial:0.##}");
|
||||
if (Shield.TotalMagical > 0) shield.Add($"魔法:{Shield.TotalMagical:0.##}");
|
||||
if (Shield.TotalMix > 0) shield.Add($"混合:{Shield.TotalMix:0.##}");
|
||||
builder.AppendLine($"生命值:{HP:0.##} / {MaxHP:0.##}" + (exHP != 0 ? $" [{BaseHP:0.##} {(exHP >= 0 ? "+" : "-")} {Math.Abs(exHP):0.##}]" : "") + (shield.Count > 0 ? $"({string.Join(",", shield)})" : ""));
|
||||
double exMP = ExMP + ExMP2 + ExMP3;
|
||||
|
||||
@ -80,7 +80,7 @@ namespace Milimoe.FunGame.Core.Entity
|
||||
/// <summary>
|
||||
/// 总计魔法护盾
|
||||
/// </summary>
|
||||
public double TotalMagicial => None + Starmark + PurityNatural + PurityContemporary + Bright + Shadow + Element + Aster + SpatioTemporal + ShieldOfEffects.Values.Where(soe => soe.ShieldType == ShieldType.Magical && soe.Shield > 0).Sum(soe => soe.Shield);
|
||||
public double TotalMagical => None + Starmark + PurityNatural + PurityContemporary + Bright + Shadow + Element + Aster + SpatioTemporal + ShieldOfEffects.Values.Where(soe => soe.ShieldType == ShieldType.Magical && soe.Shield > 0).Sum(soe => soe.Shield);
|
||||
|
||||
/// <summary>
|
||||
/// 获取或设置护盾值
|
||||
|
||||
@ -56,7 +56,7 @@ namespace Milimoe.FunGame.Core.Entity
|
||||
double exHP = ExHP + ExHP2 + ExHP3;
|
||||
List<string> shield = [];
|
||||
if (Shield.TotalPhysical > 0) shield.Add($"物理:{Shield.TotalPhysical:0.##}");
|
||||
if (Shield.TotalMagicial > 0) shield.Add($"魔法:{Shield.TotalMagicial:0.##}");
|
||||
if (Shield.TotalMagical > 0) shield.Add($"魔法:{Shield.TotalMagical:0.##}");
|
||||
if (Shield.Mix > 0) shield.Add($"混合:{Shield.Mix:0.##}");
|
||||
builder.AppendLine($"生命值:{HP:0.##} / {MaxHP:0.##}" + (exHP != 0 ? $" [{BaseHP:0.##} {(exHP >= 0 ? "+" : "-")} {Math.Abs(exHP):0.##}]" : "") + (shield.Count > 0 ? $"({string.Join(",", shield)})" : ""));
|
||||
double exMP = ExMP + ExMP2 + ExMP3;
|
||||
@ -183,7 +183,7 @@ namespace Milimoe.FunGame.Core.Entity
|
||||
double exHP = ExHP + ExHP2 + ExHP3;
|
||||
List<string> shield = [];
|
||||
if (Shield.TotalPhysical > 0) shield.Add($"物理:{Shield.TotalPhysical:0.##}");
|
||||
if (Shield.TotalMagicial > 0) shield.Add($"魔法:{Shield.TotalMagicial:0.##}");
|
||||
if (Shield.TotalMagical > 0) shield.Add($"魔法:{Shield.TotalMagical:0.##}");
|
||||
if (Shield.Mix > 0) shield.Add($"混合:{Shield.Mix:0.##}");
|
||||
builder.AppendLine($"生命值:{HP:0.##} / {MaxHP:0.##}" + (exHP != 0 ? $" [{BaseHP:0.##} {(exHP >= 0 ? "+" : "-")} {Math.Abs(exHP):0.##}]" : "") + (shield.Count > 0 ? $"({string.Join(",", shield)})" : ""));
|
||||
double exMP = ExMP + ExMP2 + ExMP3;
|
||||
@ -284,7 +284,7 @@ namespace Milimoe.FunGame.Core.Entity
|
||||
double exHP = ExHP + ExHP2 + ExHP3;
|
||||
List<string> shield = [];
|
||||
if (Shield.TotalPhysical > 0) shield.Add($"物理:{Shield.TotalPhysical:0.##}");
|
||||
if (Shield.TotalMagicial > 0) shield.Add($"魔法:{Shield.TotalMagicial:0.##}");
|
||||
if (Shield.TotalMagical > 0) shield.Add($"魔法:{Shield.TotalMagical:0.##}");
|
||||
if (Shield.Mix > 0) shield.Add($"混合:{Shield.Mix:0.##}");
|
||||
builder.AppendLine($"生命值:{HP:0.##} / {MaxHP:0.##}" + (exHP != 0 ? $" [{BaseHP:0.##} {(exHP >= 0 ? "+" : "-")} {Math.Abs(exHP):0.##}]" : "") + (shield.Count > 0 ? $"({string.Join(",", shield)})" : ""));
|
||||
double exMP = ExMP + ExMP2 + ExMP3;
|
||||
@ -335,7 +335,7 @@ namespace Milimoe.FunGame.Core.Entity
|
||||
double exHP = ExHP + ExHP2 + ExHP3;
|
||||
List<string> shield = [];
|
||||
if (Shield.TotalPhysical > 0) shield.Add($"物理:{Shield.TotalPhysical:0.##}");
|
||||
if (Shield.TotalMagicial > 0) shield.Add($"魔法:{Shield.TotalMagicial:0.##}");
|
||||
if (Shield.TotalMagical > 0) shield.Add($"魔法:{Shield.TotalMagical:0.##}");
|
||||
if (Shield.Mix > 0) shield.Add($"混合:{Shield.Mix:0.##}");
|
||||
builder.AppendLine($"生命值:{HP:0.##} / {MaxHP:0.##}" + (exHP != 0 ? $" [{BaseHP:0.##} {(exHP >= 0 ? "+" : "-")} {Math.Abs(exHP):0.##}]" : "") + (shield.Count > 0 ? $"({string.Join(",", shield)})" : ""));
|
||||
double exMP = ExMP + ExMP2 + ExMP3;
|
||||
@ -417,7 +417,7 @@ namespace Milimoe.FunGame.Core.Entity
|
||||
double exHP = ExHP + ExHP2 + ExHP3;
|
||||
List<string> shield = [];
|
||||
if (Shield.TotalPhysical > 0) shield.Add($"物理:{Shield.TotalPhysical:0.##}");
|
||||
if (Shield.TotalMagicial > 0) shield.Add($"魔法:{Shield.TotalMagicial:0.##}");
|
||||
if (Shield.TotalMagical > 0) shield.Add($"魔法:{Shield.TotalMagical:0.##}");
|
||||
if (Shield.Mix > 0) shield.Add($"混合:{Shield.Mix:0.##}");
|
||||
builder.AppendLine($"生命值:{HP:0.##} / {MaxHP:0.##}" + (exHP != 0 ? $" [{BaseHP:0.##} {(exHP >= 0 ? "+" : "-")} {Math.Abs(exHP):0.##}]" : "") + (shield.Count > 0 ? $"({string.Join(",", shield)})" : ""));
|
||||
double exMP = ExMP + ExMP2 + ExMP3;
|
||||
|
||||
@ -331,6 +331,7 @@ namespace Milimoe.FunGame.Core.Library.Common.Addon.Example
|
||||
{
|
||||
// 因为模组在模组管理器中都是单例的,所以每次游戏都需要返回一个新的地图对象给队列
|
||||
GameMap map = new ExampleGameMap();
|
||||
map.Load();
|
||||
|
||||
// 做一些绑定,以便介入游戏队列
|
||||
/// 但是,传入的 queue 可能不是 <see cref="GamingQueue"/>,要做类型检查
|
||||
|
||||
@ -153,6 +153,12 @@ namespace Milimoe.FunGame.Core.Library.Common.Addon
|
||||
return true;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 初始化游戏队列,要求返回一个新的地图实例,而不是 this
|
||||
/// </summary>
|
||||
/// <param name="queue"></param>
|
||||
public abstract GameMap InitGamingQueue(IGamingQueue queue);
|
||||
|
||||
/// <summary>
|
||||
/// 获取角色当前所在的格子
|
||||
/// </summary>
|
||||
@ -216,8 +222,8 @@ namespace Milimoe.FunGame.Core.Library.Common.Addon
|
||||
if (Math.Abs(dx) + Math.Abs(dy) <= range)
|
||||
{
|
||||
//检查是否在棋盘范围内
|
||||
int x = grid.X;
|
||||
int y = grid.Y;
|
||||
int x = grid.X + dx;
|
||||
int y = grid.Y + dy;
|
||||
int z = grid.Z;
|
||||
if (GridsByCoordinate.TryGetValue((x, y, z), out Grid? select) && select != null)
|
||||
{
|
||||
@ -231,6 +237,44 @@ namespace Milimoe.FunGame.Core.Library.Common.Addon
|
||||
return grids;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取以某个格子为中心,一定半径内的格子(圆形范围,欧几里得距离),只考虑同一平面的格子,不包含中心格子。
|
||||
/// </summary>
|
||||
/// <param name="grid"></param>
|
||||
/// <param name="range"></param>
|
||||
/// <returns></returns>
|
||||
public virtual List<Grid> GetGridsByCircleRange(Grid grid, int range)
|
||||
{
|
||||
List<Grid> grids = [];
|
||||
|
||||
// 预计算半径的平方
|
||||
int rangeSquared = range * range;
|
||||
|
||||
// 遍历以中心格子为中心的方形区域
|
||||
// 范围从 -range 到 +range,覆盖所有可能的圆形区域内的格子
|
||||
for (int dx = -range; dx <= range; ++dx)
|
||||
{
|
||||
for (int dy = -range; dy <= range; ++dy)
|
||||
{
|
||||
// 计算当前格子与中心格子的欧几里得距离的平方
|
||||
if ((dx * dx) + (dy * dy) <= rangeSquared)
|
||||
{
|
||||
int x = grid.X + dx;
|
||||
int y = grid.Y + dy;
|
||||
int z = grid.Z;
|
||||
|
||||
if (GridsByCoordinate.TryGetValue((x, y, z), out Grid? select) && select != null)
|
||||
{
|
||||
grids.Add(select);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
grids.RemoveAll(g => g.Id == grid.Id);
|
||||
|
||||
return grids;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 设置角色移动
|
||||
/// </summary>
|
||||
@ -305,12 +349,107 @@ namespace Milimoe.FunGame.Core.Library.Common.Addon
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 初始化游戏队列
|
||||
/// 设置角色移动。如果不能达到目标格子,则移动到离目标格子最近的一个可达格子上。
|
||||
/// </summary>
|
||||
/// <param name="queue"></param>
|
||||
public virtual GameMap InitGamingQueue(IGamingQueue queue)
|
||||
/// <param name="character"></param>
|
||||
/// <param name="current"></param>
|
||||
/// <param name="target"></param>
|
||||
/// <returns>移动的步数,只算平面移动步数</returns>
|
||||
public virtual int CharacterMoveToClosestReachable(Character character, Grid? current, Grid target)
|
||||
{
|
||||
return this;
|
||||
if (current is null || current.Id < 0 || target.Id < 0 || !Grids.ContainsValue(target))
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
|
||||
Grid? realGrid = GetCharacterCurrentGrid(character);
|
||||
|
||||
if (current.Id == target.Id)
|
||||
{
|
||||
SetCharacterCurrentGrid(character, current);
|
||||
return 0;
|
||||
}
|
||||
|
||||
// 使用 BFS 算法探索所有可达格子,并记录它们到起点的步数
|
||||
Queue<(Grid grid, int steps)> queue = new();
|
||||
|
||||
// 记录已访问的格子ID
|
||||
HashSet<long> visited = [];
|
||||
|
||||
// 初始化 BFS 队列,将起始格子加入,步数为0
|
||||
queue.Enqueue((current, 0));
|
||||
visited.Add(current.Id);
|
||||
|
||||
Grid? bestReachableGrid = current;
|
||||
int minDistanceToTarget = CalculateManhattanDistance(current, target);
|
||||
int stepsToBestReachable = 0;
|
||||
|
||||
// 定义平面移动的四个方向
|
||||
(int dx, int dy)[] directions = [
|
||||
(0, 1), (0, -1), (1, 0), (-1, 0)
|
||||
];
|
||||
|
||||
while (queue.Count > 0)
|
||||
{
|
||||
var (currentGrid, currentSteps) = queue.Dequeue();
|
||||
|
||||
// 计算当前可达格子到目标格子的曼哈顿距离
|
||||
int distToTarget = CalculateManhattanDistance(currentGrid, target);
|
||||
|
||||
// 如果当前格子比之前找到的 bestReachableGrid 更接近目标
|
||||
if (distToTarget < minDistanceToTarget)
|
||||
{
|
||||
minDistanceToTarget = distToTarget;
|
||||
bestReachableGrid = currentGrid;
|
||||
stepsToBestReachable = currentSteps;
|
||||
}
|
||||
// 如果距离相同,优先选择到达步数更少的格子(作为一种 tie-breaking 规则)
|
||||
else if (distToTarget == minDistanceToTarget && currentSteps < stepsToBestReachable)
|
||||
{
|
||||
bestReachableGrid = currentGrid;
|
||||
stepsToBestReachable = currentSteps;
|
||||
}
|
||||
|
||||
// 探索相邻格子
|
||||
foreach (var (dx, dy) in directions)
|
||||
{
|
||||
int nextX = currentGrid.X + dx;
|
||||
int nextY = currentGrid.Y + dy;
|
||||
int nextZ = currentGrid.Z;
|
||||
|
||||
Grid? neighborGrid = this[nextX, nextY, nextZ];
|
||||
|
||||
// 如果相邻格子存在且未被访问过
|
||||
if (neighborGrid != null && !visited.Contains(neighborGrid.Id))
|
||||
{
|
||||
visited.Add(neighborGrid.Id);
|
||||
queue.Enqueue((neighborGrid, currentSteps + 1));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 理论上 bestReachableGrid 不会是 null,因为 current 至少是可达的
|
||||
if (bestReachableGrid == null)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
|
||||
// 更新角色的实际位置
|
||||
realGrid?.Characters.Remove(character);
|
||||
SetCharacterCurrentGrid(character, bestReachableGrid);
|
||||
|
||||
return stepsToBestReachable;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 计算两个格子之间的曼哈顿距离
|
||||
/// </summary>
|
||||
/// <param name="g1"></param>
|
||||
/// <param name="g2"></param>
|
||||
/// <returns>两个格子之间的曼哈顿距离</returns>
|
||||
public static int CalculateManhattanDistance(Grid g1, Grid g2)
|
||||
{
|
||||
return Math.Abs(g1.X - g2.X) + Math.Abs(g1.Y - g2.Y) + Math.Abs(g1.Z - g2.Z);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
||||
@ -1699,7 +1699,7 @@ namespace Milimoe.FunGame.Core.Model
|
||||
WriteLine($"[ {enemy} ] 的{shieldTypeString}护盾抵消了 {enemy.Shield[isMagicDamage, magicType]:0.##} 点{damageTypeString}并破碎!");
|
||||
remain -= enemy.Shield[isMagicDamage, magicType];
|
||||
enemy.Shield[isMagicDamage, magicType] = 0;
|
||||
if (isMagicDamage && enemy.Shield.TotalMagicial <= 0 || !isMagicDamage && enemy.Shield.TotalPhysical <= 0)
|
||||
if (isMagicDamage && enemy.Shield.TotalMagical <= 0 || !isMagicDamage && enemy.Shield.TotalPhysical <= 0)
|
||||
{
|
||||
effects = [.. characters.SelectMany(c => c.Effects.Where(e => e.IsInEffect)).Distinct()];
|
||||
foreach (Effect effect in effects)
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user