feat: rogue tourn division(difficulty)

This commit is contained in:
StopWuyu
2025-08-29 22:55:20 +08:00
parent eecdcef99f
commit 5fae447480
13 changed files with 200 additions and 28 deletions

View File

@@ -67,6 +67,7 @@ public class BattleInstance(PlayerInstance player, LineupInfo lineup, List<Stage
public Dictionary<int, BattleTargetList> BattleTargets { get; set; } = [];
public BattleCollegeConfigExcel? CollegeConfigExcel { get; set; }
public PVEBattleResultCsReq? BattleResult { get; set; }
public bool IsTournRogue { get; set; }
public ItemList GetDropItemList()
{
@@ -220,6 +221,7 @@ public class BattleInstance(PlayerInstance player, LineupInfo lineup, List<Stage
if (CustomLevel > 0)
foreach (var item in protoWave)
item.MonsterParam.Level = (uint)CustomLevel;
proto.MonsterWaveList.AddRange(protoWave);
}
@@ -302,6 +304,9 @@ public class BattleInstance(PlayerInstance player, LineupInfo lineup, List<Stage
}
}
if (IsTournRogue)
proto.AJGPJGLPMIO = new();
proto.BuffList.AddRange(Buffs.Select(buff => buff.ToProto(this)));
return proto;
}

View File

@@ -1,4 +1,5 @@
using EggLink.DanhengServer.Data;
using EggLink.DanhengServer.Data.Custom;
using EggLink.DanhengServer.Data.Excel;
using EggLink.DanhengServer.Enums.Rogue;
using EggLink.DanhengServer.Enums.Scene;
@@ -69,11 +70,9 @@ public class RogueTournInstance : BaseRogueInstance
public Dictionary<RogueTournRoomTypeEnum, int> RoomTypeWeight { get; set; } = new()
{
{ RogueTournRoomTypeEnum.Battle, 15 },
{ RogueTournRoomTypeEnum.Coin, 4 },
{ RogueTournRoomTypeEnum.Shop, 4 },
{ RogueTournRoomTypeEnum.Event, 7 },
{ RogueTournRoomTypeEnum.Reward, 5 },
{ RogueTournRoomTypeEnum.Hidden, 1 }
{ RogueTournRoomTypeEnum.Encounter, 5 },
};
public RogueTournLevelInstance? CurLevel => Levels.GetValueOrDefault(CurLayerId);
@@ -84,7 +83,12 @@ public class RogueTournInstance : BaseRogueInstance
public async ValueTask EnterNextLayer(int roomIndex, RogueTournRoomTypeEnum type)
{
CurLayerId += 100;
var curInd = Levels.Keys.ToList().IndexOf(CurLayerId);
var nextLayerId = Levels.Keys.ToList()[curInd + 1];
var nextLayer = Levels[nextLayerId];
CurLevel!.LevelStatus = RogueTournLayerStatus.Finish;
CurLayerId = nextLayer.LayerId;
await EnterRoom(1, type);
}
@@ -311,6 +315,13 @@ public class RogueTournInstance : BaseRogueInstance
return res;
}
public override async ValueTask AddBuffList(List<BaseRogueBuffExcel> excel)
{
await base.AddBuffList(excel);
await ExpandFormula();
}
public async ValueTask ExpandFormula()
{
// expand formula
@@ -375,6 +386,7 @@ public class RogueTournInstance : BaseRogueInstance
RogueActions.Remove(action.QueuePosition);
}
await ExpandFormula();
await UpdateMenu();
await Player.SendPacket(
@@ -426,11 +438,36 @@ public class RogueTournInstance : BaseRogueInstance
}
};
Dictionary<int, int> divisionBuffs =
new() {
{ 1, 651031 },
{ 2, 651032 },
{ 3, 651033 },
{ 4, 651034 },
{ 5, 651035 },
{ 6, 651036 },
};
var divisionLevel = AreaExcel.DivisionLevel;
foreach (var buff in divisionBuffs.Where(x => divisionLevel >= x.Key))
{
battle.Buffs.Add(new MazeBuff(buff.Value, 1, -1)
{
WaveFlag = -1,
DynamicValues =
{
{ "_RogueLayer", CurLevel?.LevelIndex ?? 1 }
}
});
}
battle.IsTournRogue = true;
if (DifficultyExcels.Count > 0)
{
var diff = DifficultyExcels.RandomElement();
var diff = DifficultyExcels[Math.Min(DifficultyExcels.Count, CurLevel!.LevelIndex) - 1];
if (diff.LevelList.Count > 0)
battle.CustomLevel = diff.LevelList.RandomElement();
battle.CustomLevel = diff.LevelList.First();
}
foreach (var formula in RogueFormulas.Where(formula =>
@@ -442,6 +479,11 @@ public class RogueTournInstance : BaseRogueInstance
WaveFlag = -1
});
battle.Buffs.Add(new MazeBuff(634000, 1, -1) // day and night
{
WaveFlag = -1
});
RogueTitanBlessInstance.OnBattleStart(battle);
}

View File

@@ -46,6 +46,8 @@ public class RogueTournManager(PlayerInstance player) : BasePlayerManager(player
public RogueTournInfo ToProto()
{
var maxDivision = GameData.RogueTournDivisionData.Values.MaxBy(x => x.DivisionLevel) ?? new RogueTournDivisionExcel();
var proto = new RogueTournInfo
{
ExtraScoreInfo = ToExtraScoreProto(),
@@ -60,7 +62,11 @@ public class RogueTournManager(PlayerInstance player) : BasePlayerManager(player
Capacity = 0
},
SeasonTalentInfo = ToSeasonTalentProto(),
LKCEFCLJCBM = new KCLCHJMNPGL()
RogueDivisionInfo = new RogueTournDivisionInfo
{
DivisionLevel = (uint)maxDivision.DivisionLevel,
DivisionProgress = (uint)maxDivision.DivisionProgress
}
};
return proto;
@@ -166,11 +172,11 @@ public class RogueTournManager(PlayerInstance player) : BasePlayerManager(player
foreach (var formulaId in GameData.RogueTournFormulaData.Keys) proto.HandbookFormulaList.Add((uint)formulaId);
foreach (var miracleId in GameData.RogueTournHandbookMiracleData.Keys)
proto.HandbookMiracleList.Add((uint)miracleId);
proto.HandbookTournMiracleList.Add((uint)miracleId);
foreach (var blessId in GameData.RogueTournTitanBlessData.Keys) proto.HandbookTitanBlessList.Add((uint)blessId);
//foreach (var eventId in GameData.RogueTournHandBookEventData.Keys) proto.HandbookEventList.Add((uint)eventId);
foreach (var eventId in GameData.RogueTournHandBookEventData.Keys) proto.HandbookMiracleList.Add((uint)eventId); // TODO edit field name
return proto;
}

View File

@@ -8,14 +8,16 @@ using EggLink.DanhengServer.GameServer.Game.Rogue.Scene.Entity;
using EggLink.DanhengServer.GameServer.Game.Scene;
using EggLink.DanhengServer.GameServer.Game.Scene.Entity;
using EggLink.DanhengServer.Util;
using EggLink.DanhengServer.Util.Security;
namespace EggLink.DanhengServer.GameServer.Game.RogueTourn.Scene;
public class RogueTournEntityLoader(SceneInstance scene, PlayerInstance player) : SceneEntityLoader(scene)
{
public List<RogueTournRoomTypeEnum> ExistTypes = [];
public List<int> FinalRoomBossIds = [3007091, 3007101, 3007111, 3007121, 3007131, 3007141];
public List<int> LayerNormalBossIds = [3007011, 3007021, 3007031, 3007041, 3007051, 3007061, 3007071, 3007081];
public List<int> FinalRoomBossIds = [5004141, 3004171, 3004161, 3004151];
public List<int> Layer1NormalBossIds { get; set; } = [3013081, 3013161, 3013041, 3013241, 3013131, 3013201, 3013231, 3013181, 3013191, 3013251, 3013121];
public List<int> Layer2NormalBossIds { get; set; } = [5004071, 5004051, 5004021, 5004081];
public PlayerInstance Player = player;
public List<int> RogueDoorPropIds = [1033, 1034, 1035, 1036, 1037, 1000];
@@ -43,7 +45,7 @@ public class RogueTournEntityLoader(SceneInstance scene, PlayerInstance player)
foreach (var npc in info.NPCList)
try
{
if (await LoadNpc(npc, info) is EntityNpc entity) entityList.Add(entity);
if (await LoadNpc(npc, info) is { } entity) entityList.Add(entity);
}
catch
{
@@ -52,7 +54,7 @@ public class RogueTournEntityLoader(SceneInstance scene, PlayerInstance player)
foreach (var monster in info.MonsterList)
try
{
if (await LoadMonster(monster, info) is EntityMonster entity) entityList.Add(entity);
if (await LoadMonster(monster, info) is { } entity) entityList.Add(entity);
}
catch
{
@@ -61,7 +63,7 @@ public class RogueTournEntityLoader(SceneInstance scene, PlayerInstance player)
foreach (var prop in info.PropList)
try
{
if (await LoadProp(prop, info) is EntityProp entity) entityList.Add(entity);
if (await LoadProp(prop, info) is { } entity) entityList.Add(entity);
}
catch
{
@@ -120,28 +122,52 @@ public class RogueTournEntityLoader(SceneInstance scene, PlayerInstance player)
{
if (rogueInstance.CurLevel?.LevelIndex == 3)
rogueMonster = GameData.RogueMonsterData[FinalRoomBossIds.RandomElement()];
else if (rogueInstance.CurLevel?.LevelIndex == 2)
rogueMonster = GameData.RogueMonsterData[Layer2NormalBossIds.RandomElement()];
else
rogueMonster = GameData.RogueMonsterData[LayerNormalBossIds.RandomElement()];
rogueMonster = GameData.RogueMonsterData[Layer1NormalBossIds.RandomElement()];
}
else
{
NPCMonsterDataExcel? data;
MonsterTemplateConfigExcel? templateConfigExcel;
do
{
rogueMonster = GameData.RogueMonsterData.Values.ToList().RandomElement();
GameData.NpcMonsterDataData.TryGetValue(rogueMonster.NpcMonsterID, out data);
} while (data == null || !allowedRank.Contains(data.Rank));
templateConfigExcel = GameData.MonsterTemplateConfigData.Values.FirstOrDefault(x =>
x.NPCMonsterList.Contains(rogueMonster.NpcMonsterID));
} while (data == null || !allowedRank.Contains(data.Rank) || templateConfigExcel == null ||
templateConfigExcel.MonsterCampID < 12 || templateConfigExcel.MonsterCampID > 15);
}
GameData.NpcMonsterDataData.TryGetValue(rogueMonster.NpcMonsterID, out var excel);
var template = GameData.MonsterTemplateConfigData.Values.FirstOrDefault(x =>
x.NPCMonsterList.Contains(rogueMonster.NpcMonsterID));
if (excel == null) return null;
var level = 10;
if (rogueInstance.DifficultyExcels.Count > 0)
{
var diff = rogueInstance.DifficultyExcels[
Math.Min(rogueInstance.DifficultyExcels.Count, rogueInstance.CurLevel!.LevelIndex) - 1];
if (diff.LevelList.Count > 0)
level = diff.LevelList.First();
}
var monsterConf =
GameData.MonsterConfigData.Values.FirstOrDefault(x => x.MonsterTemplateID == template?.MonsterTemplateID);
EntityMonster entity =
new(Scene, info.ToPositionProto(), info.ToRotationProto(), group.Id, info.ID, excel, info)
{
EventId = rogueMonster.EventID,
CustomStageId = rogueMonster.EventID,
RogueMonsterId = rogueMonster.RogueMonsterID
RogueMonsterId = rogueMonster.RogueMonsterID,
CustomLevel = level,
HardLevelGroup = monsterConf?.HardLevelGroup ?? 1
};
await Scene.AddEntity(entity, sendPacket);
@@ -151,8 +177,9 @@ public class RogueTournEntityLoader(SceneInstance scene, PlayerInstance player)
public override async ValueTask<EntityProp?> LoadProp(PropInfo info, GroupInfo group, bool sendPacket = false)
{
var rogue = Player.RogueTournManager?.RogueTournInstance;
var room = Player.RogueTournManager?.RogueTournInstance?.CurLevel?.CurRoom;
if (room == null) return null;
if (room == null || rogue == null) return null;
GameData.MazePropData.TryGetValue(info.PropID, out var propExcel);
if (propExcel == null) return null;
@@ -163,9 +190,12 @@ public class RogueTournEntityLoader(SceneInstance scene, PlayerInstance player)
if (RogueDoorPropIds.Contains(prop.PropInfo.PropID))
{
if (room is { RoomIndex: 4, LevelInstance.LevelIndex: 3 }) // last room
if (rogue.CurLevel?.LayerId == rogue.Levels.Last().Key &&
rogue.CurLevel?.Rooms.Last().RoomIndex == room.RoomIndex) // last room
{
// exit
prop.CustomPropId = 1033;
}
else
do // find next room
{
@@ -200,13 +230,13 @@ public class RogueTournEntityLoader(SceneInstance scene, PlayerInstance player)
RogueTournRoomTypeEnum.Reward => 1035,
RogueTournRoomTypeEnum.Adventure => 1035,
RogueTournRoomTypeEnum.Hidden => 1037,
RogueTournRoomTypeEnum.Respite => 1034,
RogueTournRoomTypeEnum.Respite => 1036,
_ => 1034
};
if (room.LevelInstance.Rooms.Last() == room) // last room
prop.EnterNextLayer = true;
prop.RoomType = nextRoom;
prop.IsTournRogue = true;

View File

@@ -14,12 +14,26 @@ public class RogueTournLevelInstance
EntranceId = GameData.RogueTournRoomGenData.Where(x => x.RoomType != RogueTournRoomTypeEnum.Adventure)
.Select(x => x.EntranceId).ToHashSet().ToList()
.RandomElement();
if (levelIndex == 2)
foreach (var index in Enumerable.Range(1, 5))
Rooms.Add(new RogueTournRoomInstance(index, this));
if (levelIndex == 3)
EntranceId = 8060101;
var roomExcel = GameData.RogueTournLayerRoomData.GetValueOrDefault(layerId);
if (roomExcel == null)
{
if (levelIndex == 2)
foreach (var index in Enumerable.Range(1, 5))
Rooms.Add(new RogueTournRoomInstance(index, this));
else
foreach (var index in Enumerable.Range(1, 4))
Rooms.Add(new RogueTournRoomInstance(index, this));
}
else
foreach (var index in Enumerable.Range(1, 4))
{
foreach (var index in Enumerable.Range(1, roomExcel.Count))
Rooms.Add(new RogueTournRoomInstance(index, this));
}
}
public List<RogueTournRoomInstance> Rooms { get; set; } = [];

View File

@@ -34,6 +34,7 @@ public class EntityMonster(
public int RogueMonsterId { get; set; } = 0;
public int CustomLevel { get; set; } = 0;
public int HardLevelGroup { get; set; } = 0;
public override int EntityId { get; set; } = 0;
public override int GroupId { get; set; } = groupId;
@@ -125,7 +126,8 @@ public class EntityMonster(
RogueGameInfo = new NpcMonsterRogueInfo
{
RogueMonsterId = (uint)RogueMonsterId,
Level = (uint)CustomLevel
Level = (uint)CustomLevel,
HardLevelGroup = (uint)HardLevelGroup
}
};

View File

@@ -1,4 +1,6 @@
using EggLink.DanhengServer.GameServer.Game.RogueTourn;
using EggLink.DanhengServer.Data;
using EggLink.DanhengServer.Data.Excel;
using EggLink.DanhengServer.GameServer.Game.RogueTourn;
using EggLink.DanhengServer.Kcp;
using EggLink.DanhengServer.Proto;
@@ -8,6 +10,8 @@ public class PacketRogueTournSettleScRsp : BasePacket
{
public PacketRogueTournSettleScRsp(RogueTournInstance instance) : base(CmdIds.RogueTournSettleScRsp)
{
var maxDivision = GameData.RogueTournDivisionData.Values.MaxBy(x => x.DivisionLevel) ?? new RogueTournDivisionExcel();
var proto = new RogueTournSettleScRsp
{
RogueTournCurSceneInfo = instance.ToCurSceneInfo(),
@@ -16,7 +20,11 @@ public class PacketRogueTournSettleScRsp : BasePacket
RogueTournCurInfo = instance.ToProto(),
RogueLineupInfo = instance.Player.LineupManager!.GetCurLineup()!.ToProto(),
CJCOJAMLEEL = new(),
CLKHPONDDDO = new(),
NewDivisionInfo = new RogueTournDivisionInfo
{
DivisionLevel = (uint)maxDivision.DivisionLevel,
DivisionProgress = (uint)maxDivision.DivisionProgress
},
GCGLNKFDKKN = new(),
KGCIAIAFIBE = new(),
PFOEPFPHFNJ = new()