Implement daily, weekly, and challenge missions

This commit is contained in:
Mikhail
2024-12-26 15:16:37 -05:00
parent 9d8c47972a
commit ec4ddc46b8
20 changed files with 258 additions and 18 deletions

View File

@@ -87,6 +87,13 @@ namespace EpinelPS.Database
public int WipeoutCount = 0;
public bool ClearedSimulationRoom = false;
public int InterceptionTickets = 3;
public List<int> CompletedDailyMissions = [];
public int DailyMissionPoints;
}
public class WeeklyResetableData
{
public List<int> CompletedWeeklyMissions = [];
public int WeeklyMissionPoints;
}
public class OutpostBuffs
{
@@ -229,6 +236,7 @@ namespace EpinelPS.Database
public int SynchroDeviceLevel = 200;
public ResetableData ResetableData = new();
public WeeklyResetableData WeeklyResetableData = new();
public List<ItemData> Items = new();
public List<Character> Characters = [];
public NetWholeUserTeamData RepresentationTeamData = new();
@@ -272,6 +280,7 @@ namespace EpinelPS.Database
public List<NetUserAttractiveData> BondInfo = [];
public List<Trigger> Triggers = [];
public int LastTriggerId = 1;
public List<int> CompletedAchievements = [];
// Event data
public Dictionary<int, EventData> EventInfo = new();
@@ -284,7 +293,7 @@ namespace EpinelPS.Database
Id = LastTriggerId++,
Type = type,
ConditionId = conditionId,
CreatedAt = DateTime.Now.Ticks,
CreatedAt = DateTime.UtcNow.AddHours(9).Ticks,
Value = value
};
@@ -319,15 +328,11 @@ namespace EpinelPS.Database
public void SetQuest(int tid, bool recievedReward)
{
if (MainQuestData.ContainsKey(tid))
if (!MainQuestData.TryAdd(tid, recievedReward))
{
MainQuestData[tid] = recievedReward;
return;
}
else
{
MainQuestData.Add(tid, recievedReward);
}
}
public int GenerateUniqueItemId()

View File

@@ -65,7 +65,7 @@ namespace EpinelPS.StaticInfo
public readonly Dictionary<int, CostRecord> costTable = [];
public readonly Dictionary<string, MidasProductRecord> mediasProductTable = [];
public readonly Dictionary<int, TowerRecord> towerTable = [];
public readonly Dictionary<int, TriggerRecord> TriggerTable = [];
public byte[] Sha256Hash;
@@ -501,6 +501,12 @@ namespace EpinelPS.StaticInfo
{
this.towerTable.Add(obj.id, obj);
}
var triggerTable = await LoadZip<TriggerTable>("TriggerTable.json", progress);
foreach (var obj in triggerTable.records)
{
this.TriggerTable.Add(obj.id, obj);
}
}
public MainQuestCompletionRecord? GetMainQuestForStageClearCondition(int stage)

View File

@@ -658,4 +658,19 @@
{
public List<SideStoryStageRecord> records = [];
}
public class TriggerRecord
{
public int id;
public int condition_id;
public int condition_value;
public int reward_id;
public int point_value;
public bool print_value;
public int before_trigger_id;
}
public class TriggerTable
{
public List<TriggerRecord> records = [];
}
}

View File

@@ -73,6 +73,8 @@ namespace EpinelPS.LobbyServer.Character
break;
}
}
user.AddTrigger(TriggerType.CharacterLevelUpCount, 1);
JsonDb.Save();
await WriteDataAsync(response);

View File

@@ -79,6 +79,11 @@ namespace EpinelPS.LobbyServer.Character
newChar.Skill2Lv++;
}
if (character.UltimateLevel == 10 && character.Skill1Lvl == 10 && character.Skill2Lvl == 10)
{
user.AddTrigger(TriggerType.CharacterSkillLevelMax, 1);
}
response.Character = newChar;
JsonDb.Save();

View File

@@ -47,6 +47,8 @@ namespace EpinelPS.LobbyServer.Character
}
response.SynchroLv = user.SynchroDeviceLevel;
user.AddTrigger(TriggerType.CharacterLevelUpCount, 1);
JsonDb.Save();
await WriteDataAsync(response);
}

View File

@@ -81,6 +81,11 @@ namespace EpinelPS.LobbyServer.Character
}
}
if (newCharacter.grade_core_id == 103 || newCharacter.grade_core_id == 11 || newCharacter.grade_core_id == 201)
{
user.AddTrigger(TriggerType.CharacterGradeMax, 1);
}
JsonDb.Save();
}
}

View File

@@ -201,10 +201,19 @@ namespace EpinelPS.LobbyServer.Gacha
user.AddBadge(BadgeContents.BadgeContentsNikkeNew, characterData.name_code.ToString());
if (characterData.original_rare == "SSR" || characterData.original_rare == "SR")
{
user.BondInfo.Add(new() { NameCode = characterData.name_code, Level = 1 });
if (characterData.original_rare == "SSR")
{
user.AddTrigger(TriggerType.ObtainCharacterSSR, 1);
}
}
}
response.Gacha.Add(gacha);
user.AddTrigger(TriggerType.GachaCharacter, 1);
}
response.Reward.Currency.Add(new NetCurrencyData() { Type = (int)CurrencyType.SilverMileageTicket, Value = numberOfPulls });
@@ -212,6 +221,7 @@ namespace EpinelPS.LobbyServer.Gacha
user.AddCurrency(CurrencyType.SilverMileageTicket, numberOfPulls);
user.GachaTutorialPlayCount++;
JsonDb.Save();
await WriteDataAsync(response);

View File

@@ -7,11 +7,12 @@ namespace EpinelPS.LobbyServer.Mission
{
protected override async Task HandleAsync()
{
var req = await ReadData<ReqGetAchievementRewardedData>();
await ReadData<ReqGetAchievementRewardedData>();
var user = GetUser();
var response = new ResGetAchievementRewardedData();
// TODO
response.Ids.AddRange(user.CompletedAchievements);
await WriteDataAsync(response);
}
}

View File

@@ -0,0 +1,36 @@
using EpinelPS.StaticInfo;
using EpinelPS.Utils;
namespace EpinelPS.LobbyServer.Mission
{
[PacketPath("/mission/obtain/achievement")]
public class ObtainAchievement : LobbyMsgHandler
{
protected override async Task HandleAsync()
{
var req = await ReadData<ReqObtainAchievementReward>();
var user = GetUser();
var response = new ResObtainAchievementReward();
List<NetRewardData> rewards = new();
foreach (var item in req.TidList)
{
if (user.CompletedAchievements.Contains(item)) continue;
if (!GameData.Instance.TriggerTable.TryGetValue(item, out TriggerRecord? key)) throw new Exception("unknown TID");
var rewardRecord = GameData.Instance.GetRewardTableEntry(key.reward_id) ?? throw new Exception("unable to lookup reward");
rewards.Add(RewardUtils.RegisterRewardsForUser(user, rewardRecord));
user.CompletedAchievements.Add(item);
}
response.Reward = NetUtils.MergeRewards(rewards, user);
await WriteDataAsync(response);
}
}
}

View File

@@ -1,3 +1,5 @@
using EpinelPS.Database;
using EpinelPS.StaticInfo;
using EpinelPS.Utils;
namespace EpinelPS.LobbyServer.Mission
@@ -8,10 +10,49 @@ namespace EpinelPS.LobbyServer.Mission
protected override async Task HandleAsync()
{
var req = await ReadData<ReqObtainDailyMissionReward>();
var user = GetUser();
var response = new ResObtainDailyMissionReward();
// TODO
List<NetRewardData> rewards = new();
int total_points = 0;
foreach (var item in req.TidList)
{
if (user.ResetableData.CompletedDailyMissions.Contains(item)) continue;
if (!GameData.Instance.TriggerTable.TryGetValue(item, out TriggerRecord? key)) throw new Exception("unknown TID");
user.ResetableData.CompletedDailyMissions.Add(item);
if (key.reward_id != 0)
{
// Actual reward
var rewardRecord = GameData.Instance.GetRewardTableEntry(key.reward_id) ?? throw new Exception("unable to lookup reward");
rewards.Add(RewardUtils.RegisterRewardsForUser(user, rewardRecord));
}
else
{
// Point reward
var reward = new NetRewardData();
rewards.Add(reward);
total_points += key.point_value;
}
}
user.AddTrigger(TriggerType.PointRewardDaily, total_points);
user.ResetableData.DailyMissionPoints += total_points;
response.Reward = NetUtils.MergeRewards(rewards, user);
response.EventBonusReward = new() { PassPoint = new() };
response.Reward.PassPoint = new();
JsonDb.Save();
await WriteDataAsync(response);
}
}

View File

@@ -0,0 +1,59 @@
using EpinelPS.Database;
using EpinelPS.StaticInfo;
using EpinelPS.Utils;
namespace EpinelPS.LobbyServer.Mission
{
[PacketPath("/mission/obtain/weekly")]
public class ObtainWeekly : LobbyMsgHandler
{
protected override async Task HandleAsync()
{
var req = await ReadData<ReqObtainWeeklyMissionReward>();
var user = GetUser();
var response = new ResObtainWeeklyMissionReward();
List<NetRewardData> rewards = new();
int total_points = 0;
foreach (var item in req.TidList)
{
if (user.WeeklyResetableData.CompletedWeeklyMissions.Contains(item)) continue;
if (!GameData.Instance.TriggerTable.TryGetValue(item, out TriggerRecord? key)) throw new Exception("unknown TID");
user.WeeklyResetableData.CompletedWeeklyMissions.Add(item);
if (key.reward_id != 0)
{
// Actual reward
var rewardRecord = GameData.Instance.GetRewardTableEntry(key.reward_id) ?? throw new Exception("unable to lookup reward");
rewards.Add(RewardUtils.RegisterRewardsForUser(user, rewardRecord));
}
else
{
// Point reward
var reward = new NetRewardData();
rewards.Add(reward);
total_points += key.point_value;
}
}
user.AddTrigger(TriggerType.PointRewardWeekly, total_points);
user.WeeklyResetableData.WeeklyMissionPoints += total_points;
response.Reward = NetUtils.MergeRewards(rewards, user);
response.EventBonusReward = new() { PassPoint = new() };
response.Reward.PassPoint = new();
JsonDb.Save();
await WriteDataAsync(response);
}
}
}

View File

@@ -7,10 +7,11 @@ namespace EpinelPS.LobbyServer.Mission.Rewards
{
protected override async Task HandleAsync()
{
var req = await ReadData<ReqGetDailyRewardedData>();
await ReadData<ReqGetDailyRewardedData>();
var user = GetUser();
// TODO: implement
var response = new ResGetDailyRewardedData();
response.Ids.Add(user.ResetableData.CompletedDailyMissions);
await WriteDataAsync(response);
}

View File

@@ -7,10 +7,11 @@ namespace EpinelPS.LobbyServer.Mission.Rewards
{
protected override async Task HandleAsync()
{
var req = await ReadData<ReqGetWeeklyRewardedData>();
await ReadData<ReqGetWeeklyRewardedData>();
var user = GetUser();
// TODO: implement
var response = new ResGetWeeklyRewardedData();
response.Ids.Add(user.WeeklyResetableData.CompletedWeeklyMissions);
await WriteDataAsync(response);
}

View File

@@ -1,4 +1,5 @@
using EpinelPS.Utils;
using EpinelPS.Database;
using EpinelPS.Utils;
namespace EpinelPS.LobbyServer.Outpost
{
@@ -28,6 +29,10 @@ namespace EpinelPS.LobbyServer.Outpost
response.Currencies.Add(new NetUserCurrencyData() { Type = (int)item.Key, Value = item.Value});
}
user.AddTrigger(StaticInfo.TriggerType.OutpostFastBattleReward, 1);
JsonDb.Save();
await WriteDataAsync(response);
}
}

View File

@@ -27,6 +27,8 @@ namespace EpinelPS.LobbyServer.Msgs.Outpost
user.BattleTime = DateTime.UtcNow;
user.AddTrigger(StaticInfo.TriggerType.OutpostBattleReward, 1);
JsonDb.Save();
await WriteDataAsync(response);

View File

@@ -42,6 +42,27 @@ namespace EpinelPS.LobbyServer.Tower
user.TowerProgress[TowerType] = record.floor;
}
if (record.type == "TETRA")
{
user.AddTrigger(TriggerType.TowerTetraClear, 1);
}
else if (record.type == "ELYSION")
{
user.AddTrigger(TriggerType.TowerElysionClear, 1);
}
else if (record.type == "MISSILIS")
{
user.AddTrigger(TriggerType.TowerMissilisClear, 1);
}
else if (record.type == "PILGRIM")
{
user.AddTrigger(TriggerType.TowerOverspecClear, 1);
}
else if (record.type == "ALL")
{
user.AddTrigger(TriggerType.TowerBasicClear, 1);
}
var reward = GameData.Instance.GetRewardTableEntry(record.reward_id) ?? throw new Exception("failed to get reward");
response.Reward = RewardUtils.RegisterRewardsForUser(user, reward);

View File

@@ -1,3 +1,4 @@
using EpinelPS.Database;
using EpinelPS.Utils;
namespace EpinelPS.LobbyServer.Tower
@@ -8,9 +9,14 @@ namespace EpinelPS.LobbyServer.Tower
protected override async Task HandleAsync()
{
var req = await ReadData<ReqEnterTower>();
var user = GetUser();
var response = new ResEnterTower();
user.AddTrigger(StaticInfo.TriggerType.TowerAllStart, 1);
JsonDb.Save();
await WriteDataAsync(response);
}
}

View File

@@ -132,10 +132,18 @@ namespace EpinelPS.Utils
result.UserItems.Add(item);
}
foreach (var item in reward.Point)
{
result.Point.Add(item);
}
foreach (var c in reward.Character)
{
Console.WriteLine("MergeRewards - TODO Character");
}
if (reward.InfraCoreExp != null)
result.InfraCoreExp = reward.InfraCoreExp;
}
foreach (var c in currencyDict)
@@ -175,7 +183,7 @@ namespace EpinelPS.Utils
if (includeBoost)
boost += CalculateBoostValueForOutpost(user, type);
switch(type)
switch (type)
{
case CurrencyType.CharacterExp2:
value = battleData.character_exp2;

View File

@@ -64,7 +64,7 @@ namespace EpinelPS.Utils
foreach (var item in rewardData.rewards)
{
if (item.reward_id != 0)
if (item.reward_id != 0 || !string.IsNullOrEmpty(item.reward_type))
{
if (string.IsNullOrEmpty(item.reward_type) || string.IsNullOrWhiteSpace(item.reward_type)) { }
else if (item.reward_type == "Currency")
@@ -167,6 +167,15 @@ namespace EpinelPS.Utils
user.JukeboxBgm.Add(item.reward_id);
}
}
else if (item.reward_type == "InfraCoreExp")
{
ret.InfraCoreExp = new NetIncreaseExpData()
{
BeforeLv = user.InfraCoreLvl,
BeforeExp = user.InfraCoreExp,
// TODO
};
}
else
{
Console.WriteLine("TODO: Reward type " + item.reward_type);