Merge branch 'master' of github.com:EggLinks/DanhengServer

This commit is contained in:
StopWuyu
2024-10-13 13:48:24 +08:00
23 changed files with 785 additions and 13 deletions

View File

@@ -0,0 +1,126 @@
using EggLink.DanhengServer.Data.Config.Task;
using Newtonsoft.Json.Linq;
namespace EggLink.DanhengServer.Data.Config.AdventureAbility;
public class AdventureModifierConfig
{
public float LifeTime { get; set; }
public int Level { get; set; }
public int LevelMax { get; set; }
public bool IsCountDownAfterBattle { get; set; }
public bool ApplyBehaviorFlagBindEffects { get; set; }
//public AdventureModifierBehaviorFlag[] BehaviorFlagList{ get; set; }
public float TickInterval { get; set; }
public List<TaskConfigInfo> OnInterval { get; set; } = [];
public List<TaskConfigInfo> OnAdd { get; set; } = [];
public List<TaskConfigInfo> OnCreate { get; set; } = [];
public List<TaskConfigInfo> OnDestroy { get; set; } = [];
public List<TaskConfigInfo> OnStack { get; set; } = [];
public List<TaskConfigInfo> OnAttack { get; set; } = [];
public List<TaskConfigInfo> OnBeforeBattle { get; set; } = [];
public List<TaskConfigInfo> OnAfterBattle { get; set; } = [];
public List<TaskConfigInfo> OnStage { get; set; } = [];
public List<TaskConfigInfo> OnUnstage { get; set; } = [];
public List<TaskConfigInfo> OnForeGround { get; set; } = [];
public List<TaskConfigInfo> OnBackGround { get; set; } = [];
public List<TaskConfigInfo> OnStageByStory { get; set; } = [];
public List<TaskConfigInfo> OnNpcMonsterCreate { get; set; } = [];
public List<TaskConfigInfo> OnTeamLeaderChange { get; set; } = [];
public List<TaskConfigInfo> OnBeforeAttack { get; set; } = [];
public List<TaskConfigInfo> OnBeAttack { get; set; } = [];
public List<TaskConfigInfo> OnModifierAdd { get; set; } = [];
public List<TaskConfigInfo> OnModifierRemove { get; set; } = [];
public List<TaskConfigInfo> OnOwnerBeKilled { get; set; } = [];
public List<TaskConfigInfo> OnAfterLocalPlayerUseSkill { get; set; } = [];
public List<TaskConfigInfo> ModifierTaskList { get; set; } = [];
public List<TaskConfigInfo> OnCounterAttack { get; set; } = [];
//public MazeBuffType MazeBuffType { get; set; }
public int Priority { get; set; }
public int Count { get; set; }
//public ModifierStacking Stacking { get; set; }
public static AdventureModifierConfig LoadFromJObject(JObject obj)
{
var info = new AdventureModifierConfig();
if (obj.ContainsKey(nameof(Level)))
info.Level = obj[nameof(Level)]!.ToObject<int>();
if (obj.ContainsKey(nameof(LevelMax)))
info.LevelMax = obj[nameof(LevelMax)]!.ToObject<int>();
if (obj.ContainsKey(nameof(LifeTime)))
info.LifeTime = obj[nameof(LifeTime)]!.ToObject<float>();
if (obj.ContainsKey(nameof(Count)))
info.Count = obj[nameof(Count)]!.ToObject<int>();
if (obj.ContainsKey(nameof(TickInterval)))
info.TickInterval = obj[nameof(TickInterval)]!.ToObject<float>();
if (obj.ContainsKey(nameof(IsCountDownAfterBattle)))
info.IsCountDownAfterBattle = obj[nameof(IsCountDownAfterBattle)]!.ToObject<bool>();
if (obj.ContainsKey(nameof(ApplyBehaviorFlagBindEffects)))
info.ApplyBehaviorFlagBindEffects = obj[nameof(ApplyBehaviorFlagBindEffects)]!.ToObject<bool>();
if (obj.ContainsKey(nameof(OnInterval)))
info.OnInterval = obj[nameof(OnInterval)]?.Select(x => TaskConfigInfo.LoadFromJsonObject((x as JObject)!))
.ToList() ?? [];
if (obj.ContainsKey(nameof(OnAdd)))
info.OnAdd = obj[nameof(OnAdd)]?.Select(x => TaskConfigInfo.LoadFromJsonObject((x as JObject)!))
.ToList() ?? [];
if (obj.ContainsKey(nameof(OnCreate)))
info.OnCreate = obj[nameof(OnCreate)]?.Select(x => TaskConfigInfo.LoadFromJsonObject((x as JObject)!))
.ToList() ?? [];
if (obj.ContainsKey(nameof(OnDestroy)))
info.OnDestroy = obj[nameof(OnDestroy)]?.Select(x => TaskConfigInfo.LoadFromJsonObject((x as JObject)!))
.ToList() ?? [];
if (obj.ContainsKey(nameof(OnStack)))
info.OnStack = obj[nameof(OnStack)]?.Select(x => TaskConfigInfo.LoadFromJsonObject((x as JObject)!))
.ToList() ?? [];
if (obj.ContainsKey(nameof(OnAttack)))
info.OnAttack = obj[nameof(OnAttack)]?.Select(x => TaskConfigInfo.LoadFromJsonObject((x as JObject)!))
.ToList() ?? [];
if (obj.ContainsKey(nameof(OnBeforeBattle)))
info.OnBeforeBattle = obj[nameof(OnBeforeBattle)]?.Select(x => TaskConfigInfo.LoadFromJsonObject((x as JObject)!))
.ToList() ?? [];
if (obj.ContainsKey(nameof(OnAfterBattle)))
info.OnAfterBattle = obj[nameof(OnAfterBattle)]?.Select(x => TaskConfigInfo.LoadFromJsonObject((x as JObject)!))
.ToList() ?? [];
if (obj.ContainsKey(nameof(OnStage)))
info.OnStage = obj[nameof(OnStage)]?.Select(x => TaskConfigInfo.LoadFromJsonObject((x as JObject)!))
.ToList() ?? [];
if (obj.ContainsKey(nameof(OnUnstage)))
info.OnUnstage = obj[nameof(OnUnstage)]?.Select(x => TaskConfigInfo.LoadFromJsonObject((x as JObject)!))
.ToList() ?? [];
if (obj.ContainsKey(nameof(OnForeGround)))
info.OnForeGround = obj[nameof(OnForeGround)]?.Select(x => TaskConfigInfo.LoadFromJsonObject((x as JObject)!))
.ToList() ?? [];
if (obj.ContainsKey(nameof(OnBackGround)))
info.OnBackGround = obj[nameof(OnBackGround)]?.Select(x => TaskConfigInfo.LoadFromJsonObject((x as JObject)!))
.ToList() ?? [];
// TODO: others
return info;
}
}

View File

@@ -0,0 +1,23 @@
using EggLink.DanhengServer.Data.Config.Task;
using NetTaste;
using Newtonsoft.Json.Linq;
using System.Diagnostics;
namespace EggLink.DanhengServer.Data.Config.AdventureAbility;
public class AdventureModifierLookupTableConfig
{
public Dictionary<string, AdventureModifierConfig> ModifierMap { get; set; } = [];
public static AdventureModifierLookupTableConfig LoadFromJObject(JObject obj)
{
var info = new AdventureModifierLookupTableConfig();
if (!obj.ContainsKey(nameof(ModifierMap))) return info;
foreach (var jObject in obj[nameof(ModifierMap)]!.ToObject<Dictionary<string, JObject>>()!)
{
info.ModifierMap.Add(jObject.Key, AdventureModifierConfig.LoadFromJObject(jObject.Value));
}
return info;
}
}

View File

@@ -7,6 +7,7 @@ public class MazeBuffExcel : ExcelResource
{
public int ID { get; set; }
public int Lv { get; set; }
public string ModifierName { get; set; } = string.Empty;
public override int GetId()
{

View File

@@ -1,4 +1,5 @@
using System.Collections.Concurrent;
using EggLink.DanhengServer.Data.Config.AdventureAbility;
using EggLink.DanhengServer.Data.Config.Scene;
using EggLink.DanhengServer.Data.Custom;
using EggLink.DanhengServer.Data.Excel;
@@ -117,6 +118,8 @@ public static class GameData
public static Dictionary<int, MusicRhythmSoundEffectExcel> MusicRhythmSoundEffectData { get; private set; } = [];
public static Dictionary<int, MusicRhythmTrackExcel> MusicRhythmTrackData { get; private set; } = [];
public static Dictionary<string, AdventureModifierConfig> AdventureModifierData { get; set; } = [];
#endregion
#region Items

View File

@@ -1,5 +1,6 @@
using System.Reflection;
using EggLink.DanhengServer.Data.Config;
using EggLink.DanhengServer.Data.Config.AdventureAbility;
using EggLink.DanhengServer.Data.Config.Rogue;
using EggLink.DanhengServer.Data.Config.Scene;
using EggLink.DanhengServer.Data.Config.SummonUnit;
@@ -35,6 +36,7 @@ public class ResourceManager
var t5 = Task.Run(LoadPerformanceInfo);
var t6 = Task.Run(LoadDialogueInfo);
var t7 = Task.Run(LoadRogueChestMapInfo);
var t8 = Task.Run(LoadAdventureModifier);
GameData.ActivityConfig = LoadCustomFile<ActivityConfig>("Activity", "ActivityConfig") ?? new ActivityConfig();
GameData.BannersConfig = LoadCustomFile<BannersConfig>("Banner", "Banners") ?? new BannersConfig();
GameData.RogueMapGenData = LoadCustomFile<Dictionary<int, List<int>>>("Rogue Map", "RogueMapGen") ?? [];
@@ -48,7 +50,7 @@ public class ResourceManager
LoadChessRogueDiceSurfaceEffectData();
LoadRogueMagicRoomData();
Task.WaitAll(t1, t2, t3, t4, t5, t6, t7);
Task.WaitAll(t1, t2, t3, t4, t5, t6, t7, t8);
}
public static void LoadExcel()
@@ -659,6 +661,59 @@ public class ResourceManager
I18NManager.Translate("Word.RogueChestMapInfo")));
}
public static void LoadAdventureModifier()
{
Logger.Info(I18NManager.Translate("Server.ServerInfo.LoadingItem",
I18NManager.Translate("Word.AdventureModifierInfo")));
var count = 0;
// list the files in folder
var directory = new DirectoryInfo($"{ConfigManager.Config.Path.ResourcePath}/Config/ConfigAdventureModifier");
if (!directory.Exists)
{
Logger.Warn(I18NManager.Translate("Server.ServerInfo.ConfigMissing",
I18NManager.Translate("Word.AdventureModifierInfo"),
$"{ConfigManager.Config.Path.ResourcePath}/Config/ConfigAdventureModifier",
I18NManager.Translate("Word.Buff")));
return;
}
var files = directory.GetFiles();
foreach (var file in files)
{
try
{
using var reader = file.OpenRead();
using StreamReader reader2 = new(reader);
var text = reader2.ReadToEnd().Replace("$type", "Type");
var obj = JObject.Parse(text);
var info = AdventureModifierLookupTableConfig.LoadFromJObject(obj);
foreach (var config in info.ModifierMap)
{
GameData.AdventureModifierData.Add(config.Key, config.Value);
count++;
}
}
catch (Exception ex)
{
Logger.Error(
I18NManager.Translate("Server.ServerInfo.FailedToReadItem", file.Name,
I18NManager.Translate("Word.Error")), ex);
}
}
//if (count < boardList.Count)
// Logger.Warn(I18NManager.Translate("Server.ServerInfo.ConfigMissing",
// I18NManager.Translate("Word.AdventureModifierInfo"),
// $"{ConfigManager.Config.Path.ResourcePath}/Config/ConfigAdventureModifier",
// I18NManager.Translate("Word.Buff")));
Logger.Info(I18NManager.Translate("Server.ServerInfo.LoadedItems", count.ToString(),
I18NManager.Translate("Word.AdventureModifierInfo")));
}
public static void LoadChessRogueRoomData()
{
Logger.Info(I18NManager.Translate("Server.ServerInfo.LoadingItem",

View File

@@ -136,7 +136,7 @@
"EffectType": "SetBlockTypeToAround",
"Params": {
"SourceType": "3",
"TargetType": "3",
"TargetType": "0",
"Count": "1"
}
}
@@ -161,7 +161,7 @@
{
"EffectType": "SwapCellToCurAround",
"Params": {
"SourceType": "3,5"
"SourceType": "3;5"
}
}
]
@@ -172,6 +172,7 @@
{
"EffectType": "ReplicateCurCellToRandom",
"Params": {
"SourceType": "1;2;3;4;5;6;7;8;9;10;13;14;16;17",
"Count": 2
}
}
@@ -183,7 +184,7 @@
{
"EffectType": "SetColCanMove",
"Params": {
"Count": "~1;~2;~3"
"Column": "~1;~2;~3"
}
}
]
@@ -223,7 +224,7 @@
"SurfaceId": 2063,
"ContentEffects": [
{
"EffectType": "SetRandomCellToTargeType",
"EffectType": "TurnRandomCellBlockType",
"Params": {
"SourceType": "1;2;3;4;5;6;7;8;9;10;14;16;17",
"TargetType": "13",

View File

@@ -1,4 +1,5 @@
using EggLink.DanhengServer.Data;
using EggLink.DanhengServer.Data.Config.AdventureAbility;
using EggLink.DanhengServer.Data.Custom;
using EggLink.DanhengServer.Data.Excel;
using EggLink.DanhengServer.Enums.Rogue;
@@ -74,6 +75,7 @@ public class ChessRogueInstance : BaseRogueInstance
public Dictionary<int, ChessRogueCellInstance> RogueCells { get; set; } = [];
public ChessRogueCellInstance? CurCell { get; set; }
public List<int> CanMoveCellIdList { get; set; } = [];
public List<ChessRogueCellInstance> HistoryCell { get; set; } = [];
public int StartCell { get; set; }
@@ -209,6 +211,38 @@ public class ChessRogueInstance : BaseRogueInstance
#region Buff Management
public override void HandleMazeBuffModifier(AdventureModifierConfig config, MazeBuff buff)
{
var task = config.OnBeforeBattle;
foreach (var info in task)
{
if (!info.Type.Replace("RPG.GameCore.", "").StartsWith("SetDynamicValueBy")) continue;
var key = info.Type.Replace("RPG.GameCore.SetDynamicValueBy", "");
var value = key switch
{
"ItemNum" => CurMoney,
"RogueMiracleNum" => RogueMiracles.Count,
"RogueBuffNumWithType" => RogueBuffs.Count,
"RogueModifierCount" => DiceInstance.Modifier == null ? 0: 1,
"RogueLayer" => Layers.IndexOf(CurLayer) + 1,
_ => 0
};
key = key switch
{
"ItemNum" => "ItemNumber",
"RogueMiracleNum" => "RogueMiracleNumber",
"RogueBuffNumWithType" => "RogueBuffNumberWithType",
"RogueModifierCount" => "RogueModifierCount",
"RogueLayer" => "_RogueLayer",
_ => key
};
buff.DynamicValues.Add(key, value);
}
}
public override async ValueTask RollBuff(int amount)
{
if (CurCell!.BlockType == RogueDLCBlockTypeEnum.MonsterBoss)
@@ -691,6 +725,10 @@ public class ChessRogueInstance : BaseRogueInstance
canSelected.Add((uint)cell.Value.GetCellId());
}
canSelected.AddRange(CanMoveCellIdList.Select(i => (uint)i));
CanMoveCellIdList.Clear(); // clear
var proto = new ChessRogueLevelInfo
{
LevelStatus = (uint)CurLevelStatus,

View File

@@ -58,7 +58,7 @@ public class ChessRogueDiceModifierInstance(int modifierId, ChessRogueDiceSurfac
instance.ModifierEffectHandlers.TryGetValue(effect, out var handler);
if (handler != null)
handler.BeforeBattle(this, battle);
handler.BeforeBattle(this, battle, instance);
else
IsConfirmed = true;
}

View File

@@ -0,0 +1,58 @@
using EggLink.DanhengServer.Data;
using EggLink.DanhengServer.Data.Excel;
using EggLink.DanhengServer.Enums.Rogue;
using EggLink.DanhengServer.GameServer.Game.Battle;
namespace EggLink.DanhengServer.GameServer.Game.ChessRogue.Modifier.ModifierEffect.Effects;
[ModifierEffect(ModifierEffectTypeEnum.AddMazeBuff)]
public class ModifierEffectAddMazeBuff : ModifierEffectHandler
{
public override async ValueTask OnConfirmed(ChessRogueDiceModifierInstance modifierInstance, ChessRogueInstance chessRogueInstance)
{
modifierInstance.IsConfirmed = true;
await ValueTask.CompletedTask;
}
public override async ValueTask SelectModifierCell(ChessRogueDiceModifierInstance modifierInstance, ChessRogueInstance chessRogueInstance,
int selectCellId)
{
await ValueTask.CompletedTask;
}
public override async ValueTask SelectCell(ChessRogueDiceModifierInstance modifierInstance, ChessRogueInstance chessRogueInstance,
int selectCellId)
{
await ValueTask.CompletedTask;
}
public override void BeforeBattle(ChessRogueDiceModifierInstance modifierInstance, BattleInstance battle,
ChessRogueInstance instance)
{
modifierInstance.EffectConfig.Params.TryGetValue("BuffId", out var buffId);
if (buffId == null) return;
var buff = new MazeBuff(int.Parse(buffId), 1, -1)
{
WaveFlag = -1
};
GameData.MazeBuffData.TryGetValue(int.Parse(buffId) * 10 + 1, out var buffExcel);
if (buffExcel != null)
{
var modifier = GameData.AdventureModifierData.GetValueOrDefault(buffExcel.ModifierName);
if (modifier != null)
{
// handle modifier
instance.HandleMazeBuffModifier(modifier, buff);
}
}
battle.Buffs.Add(buff);
}
public override async ValueTask AfterBattle(ChessRogueDiceModifierInstance modifierInstance, BattleInstance battle)
{
await ValueTask.CompletedTask;
}
}

View File

@@ -46,7 +46,8 @@ public class ModifierEffectChangeSelectCellType : ModifierEffectHandler
await ValueTask.CompletedTask;
}
public override void BeforeBattle(ChessRogueDiceModifierInstance modifierInstance, BattleInstance battle)
public override void BeforeBattle(ChessRogueDiceModifierInstance modifierInstance, BattleInstance battle,
ChessRogueInstance instance)
{
}

View File

@@ -0,0 +1,72 @@
using EggLink.DanhengServer.Enums.Rogue;
using EggLink.DanhengServer.GameServer.Game.Battle;
using EggLink.DanhengServer.GameServer.Server.Packet.Send.ChessRogue;
using EggLink.DanhengServer.GameServer.Server.Packet.Send.RogueModifier;
using EggLink.DanhengServer.Proto;
using EggLink.DanhengServer.Util;
namespace EggLink.DanhengServer.GameServer.Game.ChessRogue.Modifier.ModifierEffect.Effects;
[ModifierEffect(ModifierEffectTypeEnum.ReRandomCellTypeGetMoney)]
public class ModifierEffectReRandomCellTypeGetMoney : ModifierEffectHandler
{
public override async ValueTask OnConfirmed(ChessRogueDiceModifierInstance modifierInstance, ChessRogueInstance chessRogueInstance)
{
var types = modifierInstance.EffectConfig.Params.GetValueOrDefault("SourceType", "3").Split(";");
foreach (var type in types)
{
var cells = chessRogueInstance.RogueCells.Where(x =>
x.Value.BlockType == (RogueDLCBlockTypeEnum)int.Parse(type) && !x.Value.IsCollapsed());
modifierInstance.SelectableCells.AddRange(cells.Select(x => x.Key));
}
await ValueTask.CompletedTask;
}
public override async ValueTask SelectModifierCell(ChessRogueDiceModifierInstance modifierInstance,
ChessRogueInstance chessRogueInstance,
int selectCellId)
{
await chessRogueInstance.Player.SendPacket(
new PacketRogueModifierStageStartNotify(modifierInstance.SourceType));
modifierInstance.SelectedCell = selectCellId;
modifierInstance.IsConfirmed = true;
var targetCell = chessRogueInstance.RogueCells[selectCellId];
var reRandomType = targetCell.BlockType;
var refreshCell = chessRogueInstance.RogueCells.Values.Where(x =>
x.BlockType == reRandomType && !x.IsCollapsed()).ToList();
var types = modifierInstance.EffectConfig.Params.GetValueOrDefault("TargetType", "3").Split(";");
var targetType = types.Select(x => (RogueDLCBlockTypeEnum)int.Parse(x)).ToList();
foreach (var cell in refreshCell)
{
cell.BlockType = targetType.RandomElement();
}
// get money
var money = int.Parse(modifierInstance.EffectConfig.Params.GetValueOrDefault("Count", "0"));
await chessRogueInstance.GainMoney(money);
await chessRogueInstance.Player.SendPacket(new PacketChessRogueCellUpdateNotify(refreshCell,
chessRogueInstance.CurBoardExcel?.ChessBoardID ?? 0, modifierInstance.SourceType,
ChessRogueCellUpdateReason.Modifier));
}
public override async ValueTask SelectCell(ChessRogueDiceModifierInstance modifierInstance, ChessRogueInstance chessRogueInstance,
int selectCellId)
{
await ValueTask.CompletedTask;
}
public override void BeforeBattle(ChessRogueDiceModifierInstance modifierInstance, BattleInstance battle,
ChessRogueInstance instance)
{
}
public override async ValueTask AfterBattle(ChessRogueDiceModifierInstance modifierInstance, BattleInstance battle)
{
await ValueTask.CompletedTask;
}
}

View File

@@ -0,0 +1,70 @@
using EggLink.DanhengServer.Enums.Rogue;
using EggLink.DanhengServer.GameServer.Game.Battle;
using EggLink.DanhengServer.GameServer.Game.ChessRogue.Cell;
using EggLink.DanhengServer.GameServer.Server.Packet.Send.ChessRogue;
using EggLink.DanhengServer.GameServer.Server.Packet.Send.RogueModifier;
using EggLink.DanhengServer.Proto;
using EggLink.DanhengServer.Util;
using System.Collections.Generic;
namespace EggLink.DanhengServer.GameServer.Game.ChessRogue.Modifier.ModifierEffect.Effects;
[ModifierEffect(ModifierEffectTypeEnum.ReplicateCurCellToRandom)]
public class ModifierEffectReplicateCurCellToRandom : ModifierEffectHandler
{
public override async ValueTask OnConfirmed(ChessRogueDiceModifierInstance modifierInstance, ChessRogueInstance chessRogueInstance)
{
await chessRogueInstance.Player.SendPacket(new PacketRogueModifierStageStartNotify(modifierInstance.SourceType));
List<ChessRogueCellInstance> targetCells = []; // list of cells can be changed
var types = modifierInstance.EffectConfig.Params.GetValueOrDefault("SourceType", "3").Split(";"); // get the target types
var count = int.Parse(modifierInstance.EffectConfig.Params.GetValueOrDefault("Count", "1")); // get the count of cells to change
var curCell = chessRogueInstance.CurCell;
foreach (var type in types)
{
var cells = chessRogueInstance.RogueCells.Where(x => // get all cells with the target type
x.Value.BlockType == (RogueDLCBlockTypeEnum)int.Parse(type) && !x.Value.IsCollapsed());
targetCells.AddRange(cells.Select(x => x.Value)); // add the cells to the list
}
List<ChessRogueCellInstance> updated = [];
for (var i = 0; i < count; i++)
{
if (targetCells.Count == 0) // if there are no more cells to change, quit the loop
break;
var targetCell = targetCells.RandomElement(); // get a random cell from the list
targetCell.BlockType = curCell?.BlockType ?? RogueDLCBlockTypeEnum.Empty; // set the cell type to the current cell type
targetCells.Remove(targetCell);
updated.Add(targetCell);
}
await chessRogueInstance.Player.SendPacket(new PacketChessRogueCellUpdateNotify(updated,
chessRogueInstance.CurBoardExcel?.ChessBoardID ?? 0, modifierInstance.SourceType,
ChessRogueCellUpdateReason.Modifier));
modifierInstance.IsConfirmed = true;
}
public override async ValueTask SelectModifierCell(ChessRogueDiceModifierInstance modifierInstance, ChessRogueInstance chessRogueInstance,
int selectCellId)
{
await ValueTask.CompletedTask;
}
public override async ValueTask SelectCell(ChessRogueDiceModifierInstance modifierInstance, ChessRogueInstance chessRogueInstance,
int selectCellId)
{
await ValueTask.CompletedTask;
}
public override void BeforeBattle(ChessRogueDiceModifierInstance modifierInstance, BattleInstance battle,
ChessRogueInstance instance)
{
}
public override async ValueTask AfterBattle(ChessRogueDiceModifierInstance modifierInstance, BattleInstance battle)
{
await ValueTask.CompletedTask;
}
}

View File

@@ -43,7 +43,8 @@ public class ModifierEffectReplicateCurCellToSelectCell : ModifierEffectHandler
await ValueTask.CompletedTask;
}
public override void BeforeBattle(ChessRogueDiceModifierInstance modifierInstance, BattleInstance battle)
public override void BeforeBattle(ChessRogueDiceModifierInstance modifierInstance, BattleInstance battle,
ChessRogueInstance instance)
{
}

View File

@@ -68,7 +68,8 @@ public class ModifierEffectReplicateSelectCellToAround : ModifierEffectHandler
await ValueTask.CompletedTask;
}
public override void BeforeBattle(ChessRogueDiceModifierInstance modifierInstance, BattleInstance battle)
public override void BeforeBattle(ChessRogueDiceModifierInstance modifierInstance, BattleInstance battle,
ChessRogueInstance instance)
{
}

View File

@@ -0,0 +1,78 @@
using EggLink.DanhengServer.Enums.Rogue;
using EggLink.DanhengServer.GameServer.Game.Battle;
using EggLink.DanhengServer.GameServer.Game.ChessRogue.Cell;
using EggLink.DanhengServer.GameServer.Server.Packet.Send.ChessRogue;
using EggLink.DanhengServer.GameServer.Server.Packet.Send.RogueModifier;
using EggLink.DanhengServer.Proto;
using EggLink.DanhengServer.Util;
namespace EggLink.DanhengServer.GameServer.Game.ChessRogue.Modifier.ModifierEffect.Effects;
[ModifierEffect(ModifierEffectTypeEnum.ReplicateSelectCellToRandom)]
public class ModifierEffectReplicateSelectCellToRandom : ModifierEffectHandler
{
public override async ValueTask OnConfirmed(ChessRogueDiceModifierInstance modifierInstance, ChessRogueInstance chessRogueInstance)
{
var types = modifierInstance.EffectConfig.Params.GetValueOrDefault("SourceType", "3").Split(";");
foreach (var type in types)
{
var cells = chessRogueInstance.RogueCells.Where(x =>
x.Value.BlockType == (RogueDLCBlockTypeEnum)int.Parse(type) && !x.Value.IsCollapsed());
modifierInstance.SelectableCells.AddRange(cells.Select(x => x.Key));
}
await ValueTask.CompletedTask;
}
public override async ValueTask SelectModifierCell(ChessRogueDiceModifierInstance modifierInstance, ChessRogueInstance chessRogueInstance,
int selectCellId)
{
await chessRogueInstance.Player.SendPacket(new PacketRogueModifierStageStartNotify(modifierInstance.SourceType));
modifierInstance.SelectedCell = selectCellId;
modifierInstance.IsConfirmed = true;
var targetCell = chessRogueInstance.RogueCells[selectCellId];
var count = int.Parse(modifierInstance.EffectConfig.Params.GetValueOrDefault("Count", "1"));
List<ChessRogueCellInstance> targetCells = [];
var types = modifierInstance.EffectConfig.Params.GetValueOrDefault("SourceType", "3").Split(";");
foreach (var type in types)
{
var cells = chessRogueInstance.RogueCells.Where(x =>
x.Value.BlockType == (RogueDLCBlockTypeEnum)int.Parse(type) && !x.Value.IsCollapsed()); // get all cells with the target type
targetCells.AddRange(cells.Select(x => x.Value));
}
targetCells.Remove(targetCell);
List<ChessRogueCellInstance> updated = [];
for (var i = 0; i < count; i++)
{
if (targetCells.Count == 0)
break;
var cell = targetCells.RandomElement();
cell.BlockType = targetCell.BlockType;
targetCells.Remove(cell);
updated.Add(cell);
}
// Send packet to update the cell
await chessRogueInstance.Player.SendPacket(new PacketChessRogueCellUpdateNotify(updated, chessRogueInstance.CurBoardExcel?.ChessBoardID ?? 0, modifierInstance.SourceType, ChessRogueCellUpdateReason.Modifier));
}
public override async ValueTask SelectCell(ChessRogueDiceModifierInstance modifierInstance, ChessRogueInstance chessRogueInstance,
int selectCellId)
{
await ValueTask.CompletedTask;
}
public override void BeforeBattle(ChessRogueDiceModifierInstance modifierInstance, BattleInstance battle,
ChessRogueInstance instance)
{
}
public override async ValueTask AfterBattle(ChessRogueDiceModifierInstance modifierInstance, BattleInstance battle)
{
await ValueTask.CompletedTask;
}
}

View File

@@ -0,0 +1,81 @@
using EggLink.DanhengServer.Enums.Rogue;
using EggLink.DanhengServer.GameServer.Game.Battle;
using EggLink.DanhengServer.GameServer.Game.ChessRogue.Cell;
using EggLink.DanhengServer.GameServer.Server.Packet.Send.ChessRogue;
using EggLink.DanhengServer.GameServer.Server.Packet.Send.RogueModifier;
using EggLink.DanhengServer.Proto;
using EggLink.DanhengServer.Util;
using System.Collections.Generic;
using System.Xml.Linq;
namespace EggLink.DanhengServer.GameServer.Game.ChessRogue.Modifier.ModifierEffect.Effects;
[ModifierEffect(ModifierEffectTypeEnum.SetBlockTypeToAround)]
public class ModifierEffectSetBlockTypeToAround : ModifierEffectHandler
{
public override async ValueTask OnConfirmed(ChessRogueDiceModifierInstance modifierInstance, ChessRogueInstance chessRogueInstance)
{
var types = modifierInstance.EffectConfig.Params.GetValueOrDefault("SourceType", "3").Split(";");
foreach (var type in types)
{
var cells = chessRogueInstance.RogueCells.Where(x =>
x.Value.BlockType == (RogueDLCBlockTypeEnum)int.Parse(type) && !x.Value.IsCollapsed());
modifierInstance.SelectableCells.AddRange(cells.Select(x => x.Key));
}
await ValueTask.CompletedTask;
}
public override async ValueTask SelectModifierCell(ChessRogueDiceModifierInstance modifierInstance, ChessRogueInstance chessRogueInstance,
int selectCellId)
{
await chessRogueInstance.Player.SendPacket(new PacketRogueModifierStageStartNotify(modifierInstance.SourceType));
modifierInstance.SelectedCell = selectCellId;
modifierInstance.IsConfirmed = true;
var targetCell = chessRogueInstance.RogueCells[selectCellId];
var count = int.Parse(modifierInstance.EffectConfig.Params.GetValueOrDefault("Count", "1"));
List<ChessRogueCellInstance> targetCells = [];
var types = modifierInstance.EffectConfig.Params.GetValueOrDefault("SourceType", "3").Split(";");
foreach (var type in types)
{
var cells = chessRogueInstance.RogueCells.Where(x =>
x.Value.BlockType == (RogueDLCBlockTypeEnum)int.Parse(type) && !x.Value.IsCollapsed() &&
Math.Abs(x.Value.PosX - targetCell.PosX) <= 1 && Math.Abs(x.Value.PosY - targetCell.PosY) <= 1);
targetCells.AddRange(cells.Select(x => x.Value));
}
targetCells.Remove(targetCell);
List<ChessRogueCellInstance> updated = [];
for (var i = 0; i < count; i++)
{
if (targetCells.Count == 0)
break;
var cell = targetCells.RandomElement();
cell.BlockType = targetCell.BlockType;
targetCells.Remove(cell);
updated.Add(cell);
}
// Send packet to update the cell
await chessRogueInstance.Player.SendPacket(new PacketChessRogueCellUpdateNotify(updated, chessRogueInstance.CurBoardExcel?.ChessBoardID ?? 0, modifierInstance.SourceType, ChessRogueCellUpdateReason.Modifier));
}
public override async ValueTask SelectCell(ChessRogueDiceModifierInstance modifierInstance, ChessRogueInstance chessRogueInstance,
int selectCellId)
{
await ValueTask.CompletedTask;
}
public override void BeforeBattle(ChessRogueDiceModifierInstance modifierInstance, BattleInstance battle,
ChessRogueInstance instance)
{
}
public override async ValueTask AfterBattle(ChessRogueDiceModifierInstance modifierInstance, BattleInstance battle)
{
await ValueTask.CompletedTask;
}
}

View File

@@ -89,7 +89,8 @@ public class ModifierEffectSetCellTypeAndTakeReward : ModifierEffectHandler
await ValueTask.CompletedTask;
}
public override void BeforeBattle(ChessRogueDiceModifierInstance modifierInstance, BattleInstance battle)
public override void BeforeBattle(ChessRogueDiceModifierInstance modifierInstance, BattleInstance battle,
ChessRogueInstance instance)
{
}

View File

@@ -0,0 +1,56 @@
using EggLink.DanhengServer.Enums.Rogue;
using EggLink.DanhengServer.GameServer.Game.Battle;
namespace EggLink.DanhengServer.GameServer.Game.ChessRogue.Modifier.ModifierEffect.Effects;
[ModifierEffect(ModifierEffectTypeEnum.SetColCanMove)]
public class ModifierEffectSetColCanMove : ModifierEffectHandler
{
public override async ValueTask OnConfirmed(ChessRogueDiceModifierInstance modifierInstance, ChessRogueInstance chessRogueInstance)
{
var curCol = chessRogueInstance.CurCell?.PosX ?? 0;
var col = modifierInstance.EffectConfig.Params.GetValueOrDefault("Col", "0").Split(";");
foreach (var c in col)
{
if (c.StartsWith("~")) // ~1 means cur + 1
{
var offset = int.Parse(c[1..]);
foreach (var cell in chessRogueInstance.RogueCells.Values.Where(cell => cell.PosX == curCol + offset && !cell.IsCollapsed()))
{
chessRogueInstance.CanMoveCellIdList.Add(cell.CellId);
}
}
else
{
foreach (var cell in chessRogueInstance.RogueCells.Values.Where(cell => cell.PosX == int.Parse(c) && !cell.IsCollapsed()))
{
chessRogueInstance.CanMoveCellIdList.Add(cell.CellId);
}
}
}
await ValueTask.CompletedTask;
}
public override async ValueTask SelectModifierCell(ChessRogueDiceModifierInstance modifierInstance, ChessRogueInstance chessRogueInstance,
int selectCellId)
{
await ValueTask.CompletedTask;
}
public override async ValueTask SelectCell(ChessRogueDiceModifierInstance modifierInstance, ChessRogueInstance chessRogueInstance,
int selectCellId)
{
await ValueTask.CompletedTask;
}
public override void BeforeBattle(ChessRogueDiceModifierInstance modifierInstance, BattleInstance battle,
ChessRogueInstance instance)
{
}
public override async ValueTask AfterBattle(ChessRogueDiceModifierInstance modifierInstance, BattleInstance battle)
{
await ValueTask.CompletedTask;
}
}

View File

@@ -0,0 +1,74 @@
using EggLink.DanhengServer.Enums.Rogue;
using EggLink.DanhengServer.GameServer.Game.Battle;
using EggLink.DanhengServer.GameServer.Game.ChessRogue.Cell;
using EggLink.DanhengServer.GameServer.Server.Packet.Send.ChessRogue;
using EggLink.DanhengServer.GameServer.Server.Packet.Send.RogueModifier;
using EggLink.DanhengServer.Proto;
using EggLink.DanhengServer.Util;
namespace EggLink.DanhengServer.GameServer.Game.ChessRogue.Modifier.ModifierEffect.Effects;
[ModifierEffect(ModifierEffectTypeEnum.SwapCellToCurAround)]
public class ModifierEffectSwapCellToCurAround : ModifierEffectHandler
{
public override async ValueTask OnConfirmed(ChessRogueDiceModifierInstance modifierInstance, ChessRogueInstance chessRogueInstance)
{
var types = modifierInstance.EffectConfig.Params.GetValueOrDefault("SourceType", "3").Split(";");
foreach (var type in types)
{
var cells = chessRogueInstance.RogueCells.Where(x =>
x.Value.BlockType == (RogueDLCBlockTypeEnum)int.Parse(type) && !x.Value.IsCollapsed());
modifierInstance.SelectableCells.AddRange(cells.Select(x => x.Key));
}
await ValueTask.CompletedTask;
}
public override async ValueTask SelectModifierCell(ChessRogueDiceModifierInstance modifierInstance,
ChessRogueInstance chessRogueInstance,
int selectCellId)
{
await chessRogueInstance.Player.SendPacket(
new PacketRogueModifierStageStartNotify(modifierInstance.SourceType));
modifierInstance.SelectedCell = selectCellId;
modifierInstance.IsConfirmed = true;
var targetCell = chessRogueInstance.RogueCells[selectCellId];
// get the cells around the current cell
var targetCells = chessRogueInstance.RogueCells.Values.Where(x =>
Math.Abs(x.PosX - targetCell.PosX) <= 1 && Math.Abs(x.PosY - targetCell.PosY) <= 1 &&
x.CellAdvanceInfo.Count == 0 && !x.IsCollapsed()).ToList(); // avoid to get boss cell
targetCells.Remove(targetCell);
List<ChessRogueCellInstance> updated = [];
// swap the cell type
if (targetCells.Count == 0) return; // no cell to swap
var cell = targetCells.RandomElement();
(cell.BlockType, targetCell.BlockType) = (targetCell.BlockType, cell.BlockType);
updated.Add(cell);
updated.Add(targetCell);
// Send packet to update the cell
await chessRogueInstance.Player.SendPacket(new PacketChessRogueCellUpdateNotify(updated,
chessRogueInstance.CurBoardExcel?.ChessBoardID ?? 0, modifierInstance.SourceType,
ChessRogueCellUpdateReason.Modifier));
}
public override async ValueTask SelectCell(ChessRogueDiceModifierInstance modifierInstance, ChessRogueInstance chessRogueInstance,
int selectCellId)
{
await ValueTask.CompletedTask;
}
public override void BeforeBattle(ChessRogueDiceModifierInstance modifierInstance, BattleInstance battle,
ChessRogueInstance instance)
{
}
public override async ValueTask AfterBattle(ChessRogueDiceModifierInstance modifierInstance, BattleInstance battle)
{
await ValueTask.CompletedTask;
}
}

View File

@@ -58,7 +58,8 @@ public class ModifierEffectTrunAroundToEmptyGetBuff : ModifierEffectHandler
}
}
public override void BeforeBattle(ChessRogueDiceModifierInstance modifierInstance, BattleInstance battle)
public override void BeforeBattle(ChessRogueDiceModifierInstance modifierInstance, BattleInstance battle,
ChessRogueInstance instance)
{
}

View File

@@ -57,7 +57,8 @@ public class ModifierEffectTurnRandomCellBlockType : ModifierEffectHandler
await ValueTask.CompletedTask;
}
public override void BeforeBattle(ChessRogueDiceModifierInstance modifierInstance, BattleInstance battle)
public override void BeforeBattle(ChessRogueDiceModifierInstance modifierInstance, BattleInstance battle,
ChessRogueInstance instance)
{
}

View File

@@ -7,7 +7,8 @@ namespace EggLink.DanhengServer.GameServer.Game.ChessRogue.Modifier.ModifierEffe
public abstract ValueTask OnConfirmed(ChessRogueDiceModifierInstance modifierInstance, ChessRogueInstance chessRogueInstance);
public abstract ValueTask SelectModifierCell(ChessRogueDiceModifierInstance modifierInstance, ChessRogueInstance chessRogueInstance, int selectCellId);
public abstract ValueTask SelectCell(ChessRogueDiceModifierInstance modifierInstance, ChessRogueInstance chessRogueInstance, int selectCellId);
public abstract void BeforeBattle(ChessRogueDiceModifierInstance modifierInstance, BattleInstance battle);
public abstract void BeforeBattle(ChessRogueDiceModifierInstance modifierInstance, BattleInstance battle,
ChessRogueInstance instance);
public abstract ValueTask AfterBattle(ChessRogueDiceModifierInstance modifierInstance, BattleInstance battle);
}
}

View File

@@ -1,4 +1,5 @@
using EggLink.DanhengServer.Data;
using EggLink.DanhengServer.Data.Config.AdventureAbility;
using EggLink.DanhengServer.Data.Custom;
using EggLink.DanhengServer.Data.Excel;
using EggLink.DanhengServer.Database.Inventory;
@@ -241,6 +242,34 @@ public abstract class BaseRogueInstance(PlayerInstance player, RogueSubModeEnum
}
}
public virtual void HandleMazeBuffModifier(AdventureModifierConfig config, MazeBuff buff)
{
var task = config.OnBeforeBattle;
foreach (var info in task)
{
if (!info.Type.Replace("RPG.GameCore.", "").StartsWith("SetDynamicValueBy")) continue;
var key = info.Type.Replace("RPG.GameCore.SetDynamicValueBy", "");
var value = key switch
{
"ItemNum" => CurMoney,
"RogueMiracleNum" => RogueMiracles.Count,
"RogueBuffNumWithType" => RogueBuffs.Count,
_ => 0
};
key = key switch
{
"ItemNum" => "ItemNumber",
"RogueMiracleNum" => "RogueMiracleNumber",
"RogueBuffNumWithType" => "RogueBuffNumberWithType",
_ => key
};
buff.DynamicValues.Add(key, value);
}
}
#endregion
#region Money