修复BUG和添加地图展示

This commit is contained in:
milimoe 2026-01-23 01:25:48 +08:00
parent 6a25cf9b3f
commit 3e2f753499
Signed by: milimoe
GPG Key ID: 9554D37E4B8991D0
3 changed files with 77 additions and 11 deletions

View File

@ -28,7 +28,7 @@ namespace Oshima.FunGame.OshimaModules.Skills
public override string Name => Skill.Name; 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.##} ]" + public override string Description => $"{Skill.SkillOwner()}在场上时,会召唤数名雇佣兵协助战斗,初始数量为 {最小数量} 名,雇佣兵具有独立的回合,生命值为{Skill.SkillOwner()}的 {生命值比例 * 100:0.##}% [ {Skill.Character?.MaxHP * 生命值比例:0.##} ],攻击力为{Skill.SkillOwner()}的 {攻击力比例 * 100:0.##}% 基础攻击力 [ {Skill.Character?.BaseATK * 攻击力比例:0.##} ]" +
$"完整继承其他能力值(暴击率、闪避率等),雇佣兵每{GameplayEquilibriumConstant.InGameTime}流失 {生命流失 * 100:0.##}% 当前生命值。当{Skill.SkillOwner()}参与击杀时,便会临时产生一名额外的雇佣兵。场上最多可以存在 {最大数量} 名雇佣兵,达到数量后不再产生新的雇佣兵;当不足 {最小数量} 名雇佣兵时,{补充间隔} {GameplayEquilibriumConstant.InGameTime}后会重新补充一名雇佣兵。" + $"完整继承其他能力值(暴击率、闪避率等),雇佣兵每{GameplayEquilibriumConstant.InGameTime}流失 {生命流失 * 100:0.##}% 当前生命值。当{Skill.SkillOwner()}参与击杀时,便会临时产生一名额外的雇佣兵。场上最多可以存在 {最大数量} 名雇佣兵,达到数量后不再产生新的雇佣兵;当不足 {最小数量} 名雇佣兵时,{补充间隔} {GameplayEquilibriumConstant.InGameTime}后会重新补充一名雇佣兵。" +
(.Count < && Skill.CurrentCD > 0 ? $"(下次补充:{Skill.CurrentCD} {GameplayEquilibriumConstant.InGameTime}后)" : ""); (.Count < && Skill.CurrentCD > 0 ? $"(下次补充:{Skill.CurrentCD:0.##} {GameplayEquilibriumConstant.InGameTime}后)" : "");
public List<> { get; } = []; public List<> { get; } = [];
public const int = 1; public const int = 1;
@ -58,6 +58,11 @@ namespace Oshima.FunGame.OshimaModules.Skills
{ {
WriteLine($"[ {killer} ] 杀死了 [ {death} ]"); WriteLine($"[ {killer} ] 杀死了 [ {death} ]");
.Remove(gyb); .Remove(gyb);
if (GamingQueue is Milimoe.FunGame.Core.Model.GamingQueue queue)
{
if (queue.Map != null) queue.RemoveCharacterFromMap(gyb);
else queue.RemoveCharacterFromQueue(gyb);
}
if (.Count < && Skill.CurrentCD == 0) if (.Count < && Skill.CurrentCD == 0)
{ {
Skill.CurrentCD = ; Skill.CurrentCD = ;

View File

@ -10,6 +10,8 @@ namespace Oshima.FunGame.OshimaModules.Skills
public override string Description => Effects.Count > 0 ? Effects.First().Description : ""; public override string Description => Effects.Count > 0 ? Effects.First().Description : "";
public override string DispelDescription => Effects.Count > 0 ? Effects.First().DispelDescription : ""; public override string DispelDescription => Effects.Count > 0 ? Effects.First().DispelDescription : "";
public int { get; set; } = 0;
public (Character? character = null) : base(SkillType.Passive, character) public (Character? character = null) : base(SkillType.Passive, character)
{ {
Effects.Add(new (this)); Effects.Add(new (this));
@ -19,6 +21,14 @@ namespace Oshima.FunGame.OshimaModules.Skills
{ {
return Effects; return Effects;
} }
public override void OnCharacterRespawn(Skill newSkill)
{
if (newSkill is s)
{
s. = ;
}
}
} }
public class (Skill skill) : Effect(skill) public class (Skill skill) : Effect(skill)
@ -26,41 +36,41 @@ namespace Oshima.FunGame.OshimaModules.Skills
public override long Id => Skill.Id; public override long Id => Skill.Id;
public override string Name => Skill.Name; public override string Name => Skill.Name;
public override string Description => $"{Skill.SkillOwner()}对一半以下生命值的目标造成伤害时,将收集其灵魂以永久提升自身伤害,每个灵魂提供 {额外伤害提升 * 100:0.##}% 伤害加成。最多收集 {最多灵魂数量} 个灵魂。" + public override string Description => $"{Skill.SkillOwner()}对一半以下生命值的目标造成伤害时,将收集其灵魂以永久提升自身伤害,每个灵魂提供 {额外伤害提升 * 100:0.##}% 伤害加成。最多收集 {最多灵魂数量} 个灵魂。" +
$"若{Skill.SkillOwner()}死亡,灵魂将损失一半。(当前灵魂数量:{当前灵魂数量} 个;伤害提升:{当前灵魂数量 * 额外伤害提升 * 100:0.##}%"; $"若{Skill.SkillOwner()}死亡,灵魂将损失一半。(当前灵魂数量:{CSkill?.当前灵魂数量} 个;伤害提升:{CSkill?.当前灵魂数量 * 额外伤害提升 * 100:0.##}%";
public ? CSkill => Skill is s ? s : null;
private static double => 0.02; private static double => 0.02;
private int { get; set; } = 0;
private int => Skill.Character != null ? 10 + Skill.Character.Level / 10 * 5 : 10; private int => Skill.Character != null ? 10 + Skill.Character.Level / 10 * 5 : 10;
private bool { get; set; } = false; private bool { get; set; } = false;
public override double AlterExpectedDamageBeforeCalculation(Character character, Character enemy, double damage, bool isNormalAttack, DamageType damageType, MagicType magicType, Dictionary<Effect, double> totalDamageBonus) public override double AlterExpectedDamageBeforeCalculation(Character character, Character enemy, double damage, bool isNormalAttack, DamageType damageType, MagicType magicType, Dictionary<Effect, double> totalDamageBonus)
{ {
if (character == Skill.Character && (enemy.HP / enemy.MaxHP) < 0.5) if (Skill is skill && character == Skill.Character && (enemy.HP / enemy.MaxHP) < 0.5)
{ {
= true; = true;
return damage * * ; return damage * skill. * ;
} }
return 0; return 0;
} }
public override void AfterDamageCalculation(Character character, Character enemy, double damage, double actualDamage, bool isNormalAttack, DamageType damageType, MagicType magicType, DamageResult damageResult) public override void AfterDamageCalculation(Character character, Character enemy, double damage, double actualDamage, bool isNormalAttack, DamageType damageType, MagicType magicType, DamageResult damageResult)
{ {
if ( && character == Skill.Character && (damageResult == DamageResult.Normal || damageResult == DamageResult.Critical) && < ) if ( && character == Skill.Character && (damageResult == DamageResult.Normal || damageResult == DamageResult.Critical) && Skill is skill && skill. < )
{ {
= false; = false;
++; skill.++;
WriteLine($"[ {character} ] 通过黑暗收割收集了一个灵魂!当前灵魂数:{当前灵魂数量}"); WriteLine($"[ {character} ] 通过黑暗收割收集了一个灵魂!当前灵魂数:{skill.当前灵魂数量}");
} }
} }
public override void AfterDeathCalculation(Character death, bool hasMaster, Character? killer, Dictionary<Character, int> continuousKilling, Dictionary<Character, int> earnedMoney, Character[] assists) public override void AfterDeathCalculation(Character death, bool hasMaster, Character? killer, Dictionary<Character, int> continuousKilling, Dictionary<Character, int> earnedMoney, Character[] assists)
{ {
if (death == Skill.Character && > 0) if (death == Skill.Character && Skill is skill && skill. > 0)
{ {
int lost = / 2; int lost = skill. / 2;
if (lost > 0) if (lost > 0)
{ {
-= lost; skill. -= lost;
WriteLine($"[ {death} ] 因死亡损失了 [ {lost} ] 个灵魂!"); WriteLine($"[ {death} ] 因死亡损失了 [ {lost} ] 个灵魂!");
} }
} }

View File

@ -376,6 +376,11 @@ namespace Oshima.FunGame.OshimaServers.Service
if (isWeb) actionQueue.DisplayQueue(); if (isWeb) actionQueue.DisplayQueue();
WriteLine(""); WriteLine("");
if (actionQueue.Map != null)
{
WriteLine(DisplayMapInConsole(actionQueue.Map));
WriteLine("");
}
} }
string roundMsg = ""; string roundMsg = "";
@ -1294,5 +1299,51 @@ namespace Oshima.FunGame.OshimaServers.Service
availableGrids[Random.Shared.Next(availableGrids.Count)] : availableGrids[Random.Shared.Next(availableGrids.Count)] :
null; null;
} }
private static string DisplayMapInConsole(GameMap map)
{
StringBuilder sb = new();
// 打印列坐标
sb.Append(" ");
for (int x = 0; x < map.Length; x++)
{
sb.Append($" {x} ");
}
sb.AppendLine();
for (int y = 0; y < map.Width; y++)
{
// 打印行坐标
sb.Append($"{y} ");
for (int x = 0; x < map.Length; x++)
{
Grid? grid = map[x, y, 0];
if (grid is null)
{
sb.Append(" ");
continue;
}
// 检查格子上是否有角色
if (grid.Characters.Count > 0)
{
// 取第一个角色的昵称首字母
Character character = grid.Characters.First();
string displayChar = character.NickName.Length > 0 ? character.NickName[0].ToString().ToUpper() : "?";
sb.Append($"[{displayChar}] ");
}
else
{
sb.Append(" . ");
}
}
sb.AppendLine();
}
return sb.ToString();
}
} }
} }