mirror of
https://github.com/EpinelPS/EpinelPS.git
synced 2025-12-12 15:04:36 +01:00
Implement daily, weekly, and challenge missions
This commit is contained in:
@@ -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()
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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 = [];
|
||||
}
|
||||
}
|
||||
|
||||
@@ -73,6 +73,8 @@ namespace EpinelPS.LobbyServer.Character
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
user.AddTrigger(TriggerType.CharacterLevelUpCount, 1);
|
||||
JsonDb.Save();
|
||||
|
||||
await WriteDataAsync(response);
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -47,6 +47,8 @@ namespace EpinelPS.LobbyServer.Character
|
||||
}
|
||||
response.SynchroLv = user.SynchroDeviceLevel;
|
||||
|
||||
user.AddTrigger(TriggerType.CharacterLevelUpCount, 1);
|
||||
|
||||
JsonDb.Save();
|
||||
await WriteDataAsync(response);
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
36
EpinelPS/LobbyServer/Mission/ObtainAchievement.cs
Normal file
36
EpinelPS/LobbyServer/Mission/ObtainAchievement.cs
Normal 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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
59
EpinelPS/LobbyServer/Mission/ObtainWeekly.cs
Normal file
59
EpinelPS/LobbyServer/Mission/ObtainWeekly.cs
Normal 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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -27,6 +27,8 @@ namespace EpinelPS.LobbyServer.Msgs.Outpost
|
||||
|
||||
user.BattleTime = DateTime.UtcNow;
|
||||
|
||||
user.AddTrigger(StaticInfo.TriggerType.OutpostBattleReward, 1);
|
||||
|
||||
JsonDb.Save();
|
||||
|
||||
await WriteDataAsync(response);
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user