implement subquests, some fixes

This commit is contained in:
Mikhail
2025-05-02 11:14:11 -04:00
parent 6298471c09
commit 98311f73d2
9 changed files with 101 additions and 12 deletions

View File

@@ -297,6 +297,7 @@ namespace EpinelPS.Database
public List<int> CompletedAchievements = [];
public List<NetMessage> MessengerData = [];
public ulong LastMessageId = 1;
public long LastBadgeSeq = 1;
// Event data
public Dictionary<int, EventData> EventInfo = new();
@@ -321,19 +322,13 @@ namespace EpinelPS.Database
public Badge AddBadge(BadgeContents type, string location)
{
// generate unique badge SEQ
var num = Rng.RandomId();
while (Badges.Any(x => x.Seq == num))
{
num = Rng.RandomId();
}
var badge = new Badge()
{
BadgeContent = type,
Location = location,
BadgeGuid = Guid.NewGuid().ToString(),
Seq = num
Seq = LastBadgeSeq++
};
Badges.Add(badge);

View File

@@ -215,6 +215,7 @@ namespace EpinelPS.LobbyServer.Gacha
// Add "New Character" Badge
user.AddBadge(BadgeContents.BadgeContentsNikkeNew, characterData.name_code.ToString());
user.AddTrigger(TriggerType.ObtainCharacter, 1, characterData.name_code);
user.AddTrigger(TriggerType.ObtainCharacterNew, 1);
if (characterData.original_rare == "SSR" || characterData.original_rare == "SR")
{

View File

@@ -0,0 +1,26 @@
using EpinelPS.Database;
using EpinelPS.StaticInfo;
using EpinelPS.Utils;
namespace EpinelPS.LobbyServer.Messenger
{
[PacketPath("/messenger/subquestfin/enter")]
public class EnterFinishSubquest : LobbyMsgHandler
{
protected override async Task HandleAsync()
{
var req = await ReadData<ReqEnterSubQuestFinMessengerDialog>();
var user = GetUser();
var response = new ResEnterSubQuestFinMessengerDialog();
var opener = GameData.Instance.Subquests.Where(x => x.Key == req.SubQuestId).First();
var conversation = GameData.Instance.Messages.Where(x => x.Value.conversation_id == opener.Value.end_messenger_conversation_id && x.Value.is_opener).First();
response.Message = user.CreateMessage(conversation.Value);
JsonDb.Save();
await WriteDataAsync(response);
}
}
}

View File

@@ -0,0 +1,33 @@
using EpinelPS.Database;
using EpinelPS.StaticInfo;
using EpinelPS.Utils;
namespace EpinelPS.LobbyServer.Messenger
{
[PacketPath("/messenger/finsubquest")]
public class FinishSubquest : LobbyMsgHandler
{
protected override async Task HandleAsync()
{
var req = await ReadData<ReqFinSubQuest>();
var user = GetUser();
var response = new ResFinSubQuest();
var opener = GameData.Instance.Subquests.Where(x => x.Key == req.SubQuestId).First();
var conversation = GameData.Instance.Messages.Where(x => x.Value.id == req.MessageId).First();
var rewardRecord = GameData.Instance.GetRewardTableEntry(conversation.Value.reward_id) ?? throw new Exception("unable to lookup reward");
user.SetSubQuest(req.SubQuestId, true);
var conversationRecordUser = user.MessengerData.Where(x => x.MessageId == req.MessageId).First();
conversationRecordUser.State = 2; // mark as claimed
response.Reward = RewardUtils.RegisterRewardsForUser(user, rewardRecord);
JsonDb.Save();
await WriteDataAsync(response);
}
}
}

View File

@@ -11,9 +11,6 @@ namespace EpinelPS.LobbyServer.Stage
var response = new ResCheckStageClear();
var user = GetUser();
Console.WriteLine("CheckClear len: " + req.StageIds.Count);
// TODO: is this correct
foreach (var fields in user.FieldInfoNew)
{
@@ -24,8 +21,6 @@ namespace EpinelPS.LobbyServer.Stage
}
}
await WriteDataAsync(response);
}
}

View File

@@ -191,6 +191,7 @@ namespace EpinelPS.LobbyServer.Stage
user.AddTrigger(TriggerType.ObtainCharacter, 1, 1015);
user.AddTrigger(TriggerType.ObtainCharacter, 1, 1014);
user.AddTrigger(TriggerType.ObtainCharacter, 1, 3005);
user.AddTrigger(TriggerType.ObtainCharacterNew, 1);
NetTeamData team1Sub = new()
{

View File

@@ -0,0 +1,35 @@
using EpinelPS.StaticInfo;
using EpinelPS.Utils;
using EpinelPS.Database;
namespace EpinelPS.LobbyServer.Subquest
{
[PacketPath("/subquest/enrollment")]
public class EnrollSubquest : LobbyMsgHandler
{
protected override async Task HandleAsync()
{
var req = await ReadData<ReqEnrollmentSubQuest>();
var user = GetUser();
var response = new ResEnrollmentSubQuest();
if (!GameData.Instance.Subquests.TryGetValue(req.SubquestId, out _))
throw new Exception("no such subquest: " + req.SubquestId);
if (!user.SubQuestData.ContainsKey(req.SubquestId))
user.SetSubQuest(req.SubquestId, false);
response.SubquestData = new NetSubQuestData()
{
CreatedAt = DateTime.UtcNow.Ticks,
IsReceived = false,
SubQuestId = req.SubquestId
};
JsonDb.Save();
await WriteDataAsync(response);
}
}
}

View File

@@ -17,7 +17,9 @@ namespace EpinelPS.LobbyServer.Subquest
if (!GameData.Instance.Subquests.TryGetValue(req.SubquestId, out SubquestRecord? record))
throw new Exception("no such subquest: " + req.SubquestId);
user.AddTrigger(TriggerType.CampaignGroupClear, record.clear_condition_value, record.clear_condition_id); // TODO this may need to go elsewhere
user.AddTrigger(TriggerType.FieldObjectCollection, record.clear_condition_value, record.clear_condition_id); // TODO this may need to go elsewhere
user.AddTrigger(TriggerType.SubQuestClear, 1, req.SubquestId);
JsonDb.Save();

View File

@@ -305,6 +305,7 @@ namespace EpinelPS
user.BondInfo.Add(new() { NameCode = character.name_code, Level = 1 });
user.AddTrigger(TriggerType.ObtainCharacter, 1, character.name_code);
user.AddTrigger(TriggerType.ObtainCharacterNew, 1);
}
}