mirror of
https://github.com/EpinelPS/EpinelPS.git
synced 2025-12-13 07:24:52 +01:00
move RegisterRewardsForUser to RewardUtils
This commit is contained in:
@@ -46,7 +46,7 @@ namespace EpinelPS.LobbyServer.Campaign
|
|||||||
if (!GameData.Instance.PositionReward.TryGetValue(req.FieldObject.PositionId, out int fieldReward)) throw new Exception("bad position id");
|
if (!GameData.Instance.PositionReward.TryGetValue(req.FieldObject.PositionId, out int fieldReward)) throw new Exception("bad position id");
|
||||||
var positionReward = GameData.Instance.FieldItems[fieldReward];
|
var positionReward = GameData.Instance.FieldItems[fieldReward];
|
||||||
var reward = GameData.Instance.GetRewardTableEntry(positionReward.type_value) ?? throw new Exception("failed to get reward");
|
var reward = GameData.Instance.GetRewardTableEntry(positionReward.type_value) ?? throw new Exception("failed to get reward");
|
||||||
response.Reward = ClearStage.RegisterRewardsForUser(user, reward);
|
response.Reward = RewardUtils.RegisterRewardsForUser(user, reward);
|
||||||
|
|
||||||
// Hide it from the field
|
// Hide it from the field
|
||||||
field.CompletedObjects.Add(new NetFieldObject() { PositionId = req.FieldObject.PositionId, Type = req.FieldObject.Type});
|
field.CompletedObjects.Add(new NetFieldObject() { PositionId = req.FieldObject.PositionId, Type = req.FieldObject.Type});
|
||||||
|
|||||||
@@ -1,8 +1,7 @@
|
|||||||
using EpinelPS.Database;
|
using EpinelPS.Database;
|
||||||
using EpinelPS.LobbyServer.Stage;
|
|
||||||
using EpinelPS.Utils;
|
using EpinelPS.Utils;
|
||||||
|
|
||||||
namespace EpinelPS.LobbyServer.Outpost
|
namespace EpinelPS.LobbyServer.Msgs.Outpost
|
||||||
{
|
{
|
||||||
[PacketPath("/outpost/obtainoutpostbattlereward")]
|
[PacketPath("/outpost/obtainoutpostbattlereward")]
|
||||||
public class ObtainOutpostReward : LobbyMsgHandler
|
public class ObtainOutpostReward : LobbyMsgHandler
|
||||||
|
|||||||
@@ -24,7 +24,7 @@ namespace EpinelPS.LobbyServer.Sidestory
|
|||||||
var rewardData = GameData.Instance.GetRewardTableEntry(GameData.Instance.SidestoryRewardTable[req.SideStoryStageId]);
|
var rewardData = GameData.Instance.GetRewardTableEntry(GameData.Instance.SidestoryRewardTable[req.SideStoryStageId]);
|
||||||
|
|
||||||
if (rewardData != null)
|
if (rewardData != null)
|
||||||
response.Reward = ClearStage.RegisterRewardsForUser(user, rewardData);
|
response.Reward = RewardUtils.RegisterRewardsForUser(user, rewardData);
|
||||||
else
|
else
|
||||||
throw new Exception("failed to find reward");
|
throw new Exception("failed to find reward");
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -55,7 +55,7 @@ namespace EpinelPS.LobbyServer.Stage
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (rewardData != null)
|
if (rewardData != null)
|
||||||
response.StageClearReward = RegisterRewardsForUser(user, rewardData);
|
response.StageClearReward = RewardUtils.RegisterRewardsForUser(user, rewardData);
|
||||||
else
|
else
|
||||||
Console.WriteLine("rewardId is null for stage " + StageId);
|
Console.WriteLine("rewardId is null for stage " + StageId);
|
||||||
|
|
||||||
@@ -115,156 +115,6 @@ namespace EpinelPS.LobbyServer.Stage
|
|||||||
return response;
|
return response;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static NetRewardData RegisterRewardsForUser(Database.User user, RewardTableRecord rewardData)
|
|
||||||
{
|
|
||||||
NetRewardData ret = new();
|
|
||||||
if (rewardData.rewards == null) return ret;
|
|
||||||
|
|
||||||
if (rewardData.user_exp != 0)
|
|
||||||
{
|
|
||||||
var newXp = rewardData.user_exp + user.userPointData.ExperiencePoint;
|
|
||||||
|
|
||||||
var oldXpData = GameData.Instance.GetUserLevelFromUserExp(user.userPointData.ExperiencePoint);
|
|
||||||
var newLevelExp = GameData.Instance.GetUserMinXpForLevel(user.userPointData.UserLevel);
|
|
||||||
var newLevel = user.userPointData.UserLevel;
|
|
||||||
|
|
||||||
if (newLevelExp == -1)
|
|
||||||
{
|
|
||||||
Console.WriteLine("Unknown user level value for xp " + newXp);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
while (newXp >= newLevelExp)
|
|
||||||
{
|
|
||||||
newLevel++;
|
|
||||||
newXp -= oldXpData.Item2;
|
|
||||||
if (user.Currency.ContainsKey(CurrencyType.FreeCash))
|
|
||||||
user.Currency[CurrencyType.FreeCash] += 30;
|
|
||||||
else
|
|
||||||
user.Currency.Add(CurrencyType.FreeCash, 30);
|
|
||||||
|
|
||||||
newLevelExp = GameData.Instance.GetUserMinXpForLevel(newLevel);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// TODO: what is the difference between IncreaseExp and GainExp
|
|
||||||
// NOTE: Current Exp/Lv refers to after XP was added.
|
|
||||||
|
|
||||||
ret.UserExp = new NetIncreaseExpData()
|
|
||||||
{
|
|
||||||
BeforeExp = user.userPointData.ExperiencePoint,
|
|
||||||
BeforeLv = user.userPointData.UserLevel,
|
|
||||||
|
|
||||||
IncreaseExp = rewardData.user_exp,
|
|
||||||
CurrentExp = newXp,
|
|
||||||
CurrentLv = newLevel,
|
|
||||||
|
|
||||||
GainExp = rewardData.user_exp,
|
|
||||||
Csn = 123,
|
|
||||||
};
|
|
||||||
user.userPointData.ExperiencePoint = newXp;
|
|
||||||
|
|
||||||
user.userPointData.UserLevel = newLevel;
|
|
||||||
}
|
|
||||||
|
|
||||||
foreach (var item in rewardData.rewards)
|
|
||||||
{
|
|
||||||
if (item.reward_id != 0)
|
|
||||||
{
|
|
||||||
if (string.IsNullOrEmpty(item.reward_type) || string.IsNullOrWhiteSpace(item.reward_type)) { }
|
|
||||||
else if (item.reward_type == "Currency")
|
|
||||||
{
|
|
||||||
bool found = false;
|
|
||||||
foreach (var currentReward in user.Currency)
|
|
||||||
{
|
|
||||||
if (currentReward.Key == (CurrencyType)item.reward_id)
|
|
||||||
{
|
|
||||||
user.Currency[currentReward.Key] += item.reward_value;
|
|
||||||
|
|
||||||
ret.Currency.Add(new NetCurrencyData()
|
|
||||||
{
|
|
||||||
FinalValue = user.Currency[currentReward.Key],
|
|
||||||
Value = item.reward_value,
|
|
||||||
Type = item.reward_id
|
|
||||||
});
|
|
||||||
found = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!found)
|
|
||||||
{
|
|
||||||
user.Currency.Add((CurrencyType)item.reward_id, item.reward_value);
|
|
||||||
ret.Currency.Add(new NetCurrencyData()
|
|
||||||
{
|
|
||||||
FinalValue = item.reward_value,
|
|
||||||
Value = item.reward_value,
|
|
||||||
Type = item.reward_id
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (item.reward_type == "Item")
|
|
||||||
{
|
|
||||||
// Check if user already has said item. If it is level 1, increase item count.
|
|
||||||
// If user does not have item, generate a new item ID
|
|
||||||
if (user.Items.Where(x => x.ItemType == item.reward_id && x.Level == 1).Any())
|
|
||||||
{
|
|
||||||
ItemData? newItem = user.Items.Where(x => x.ItemType == item.reward_id && x.Level == 1).FirstOrDefault();
|
|
||||||
if (newItem != null)
|
|
||||||
{
|
|
||||||
newItem.Count += item.reward_value;
|
|
||||||
|
|
||||||
ret.Item.Add(new NetItemData()
|
|
||||||
{
|
|
||||||
Count = item.reward_value,
|
|
||||||
Tid = item.reward_id,
|
|
||||||
Isn = newItem.Isn
|
|
||||||
});
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
throw new Exception("should not occur");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
|
|
||||||
var id = user.GenerateUniqueItemId();
|
|
||||||
user.Items.Add(new ItemData() { ItemType = item.reward_id, Isn = id, Level = 1, Exp = 0, Count = item.reward_value });
|
|
||||||
ret.Item.Add(new NetItemData()
|
|
||||||
{
|
|
||||||
Count = item.reward_value,
|
|
||||||
Tid = item.reward_id,
|
|
||||||
Isn = id
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (item.reward_type == "Memorial")
|
|
||||||
{
|
|
||||||
if (!user.Memorial.Contains(item.reward_id))
|
|
||||||
{
|
|
||||||
ret.Memorial.Add(item.reward_id);
|
|
||||||
user.Memorial.Add(item.reward_id);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (item.reward_type == "Bgm")
|
|
||||||
{
|
|
||||||
if (!user.JukeboxBgm.Contains(item.reward_id))
|
|
||||||
{
|
|
||||||
ret.JukeboxBgm.Add(item.reward_id);
|
|
||||||
user.JukeboxBgm.Add(item.reward_id);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
Console.WriteLine("TODO: Reward type " + item.reward_type);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void DoQuestSpecificUserOperations(Database.User user, int clearedStageId)
|
private static void DoQuestSpecificUserOperations(Database.User user, int clearedStageId)
|
||||||
{
|
{
|
||||||
var quest = GameData.Instance.GetMainQuestForStageClearCondition(clearedStageId);
|
var quest = GameData.Instance.GetMainQuestForStageClearCondition(clearedStageId);
|
||||||
|
|||||||
@@ -44,7 +44,7 @@ namespace EpinelPS.LobbyServer.Tower
|
|||||||
}
|
}
|
||||||
|
|
||||||
var reward = GameData.Instance.GetRewardTableEntry(record.reward_id) ?? throw new Exception("failed to get reward");
|
var reward = GameData.Instance.GetRewardTableEntry(record.reward_id) ?? throw new Exception("failed to get reward");
|
||||||
response.Reward = ClearStage.RegisterRewardsForUser(user, reward);
|
response.Reward = RewardUtils.RegisterRewardsForUser(user, reward);
|
||||||
|
|
||||||
|
|
||||||
JsonDb.Save();
|
JsonDb.Save();
|
||||||
|
|||||||
@@ -33,7 +33,7 @@ namespace EpinelPS.LobbyServer.Trigger
|
|||||||
var reward = GameData.Instance.GetRewardTableEntry(questInfo.reward_id);
|
var reward = GameData.Instance.GetRewardTableEntry(questInfo.reward_id);
|
||||||
if (reward == null) throw new Exception("failed to lookup reward id " + questInfo.reward_id);
|
if (reward == null) throw new Exception("failed to lookup reward id " + questInfo.reward_id);
|
||||||
|
|
||||||
rewards.Add(ClearStage.RegisterRewardsForUser(user, reward));
|
rewards.Add(RewardUtils.RegisterRewardsForUser(user, reward));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
160
EpinelPS/Utils/RewardUtils.cs
Normal file
160
EpinelPS/Utils/RewardUtils.cs
Normal file
@@ -0,0 +1,160 @@
|
|||||||
|
using EpinelPS.Database;
|
||||||
|
using EpinelPS.StaticInfo;
|
||||||
|
|
||||||
|
namespace EpinelPS.Utils
|
||||||
|
{
|
||||||
|
// Calculate rewards for various messages
|
||||||
|
public class RewardUtils
|
||||||
|
{
|
||||||
|
|
||||||
|
public static NetRewardData RegisterRewardsForUser(Database.User user, RewardTableRecord rewardData)
|
||||||
|
{
|
||||||
|
NetRewardData ret = new();
|
||||||
|
if (rewardData.rewards == null) return ret;
|
||||||
|
|
||||||
|
if (rewardData.user_exp != 0)
|
||||||
|
{
|
||||||
|
var newXp = rewardData.user_exp + user.userPointData.ExperiencePoint;
|
||||||
|
|
||||||
|
var oldXpData = GameData.Instance.GetUserLevelFromUserExp(user.userPointData.ExperiencePoint);
|
||||||
|
var newLevelExp = GameData.Instance.GetUserMinXpForLevel(user.userPointData.UserLevel);
|
||||||
|
var newLevel = user.userPointData.UserLevel;
|
||||||
|
|
||||||
|
if (newLevelExp == -1)
|
||||||
|
{
|
||||||
|
Console.WriteLine("Unknown user level value for xp " + newXp);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
while (newXp >= newLevelExp)
|
||||||
|
{
|
||||||
|
newLevel++;
|
||||||
|
newXp -= oldXpData.Item2;
|
||||||
|
if (user.Currency.ContainsKey(CurrencyType.FreeCash))
|
||||||
|
user.Currency[CurrencyType.FreeCash] += 30;
|
||||||
|
else
|
||||||
|
user.Currency.Add(CurrencyType.FreeCash, 30);
|
||||||
|
|
||||||
|
newLevelExp = GameData.Instance.GetUserMinXpForLevel(newLevel);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// TODO: what is the difference between IncreaseExp and GainExp
|
||||||
|
// NOTE: Current Exp/Lv refers to after XP was added.
|
||||||
|
|
||||||
|
ret.UserExp = new NetIncreaseExpData()
|
||||||
|
{
|
||||||
|
BeforeExp = user.userPointData.ExperiencePoint,
|
||||||
|
BeforeLv = user.userPointData.UserLevel,
|
||||||
|
|
||||||
|
IncreaseExp = rewardData.user_exp,
|
||||||
|
CurrentExp = newXp,
|
||||||
|
CurrentLv = newLevel,
|
||||||
|
|
||||||
|
GainExp = rewardData.user_exp,
|
||||||
|
Csn = 123,
|
||||||
|
};
|
||||||
|
user.userPointData.ExperiencePoint = newXp;
|
||||||
|
|
||||||
|
user.userPointData.UserLevel = newLevel;
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach (var item in rewardData.rewards)
|
||||||
|
{
|
||||||
|
if (item.reward_id != 0)
|
||||||
|
{
|
||||||
|
if (string.IsNullOrEmpty(item.reward_type) || string.IsNullOrWhiteSpace(item.reward_type)) { }
|
||||||
|
else if (item.reward_type == "Currency")
|
||||||
|
{
|
||||||
|
bool found = false;
|
||||||
|
foreach (var currentReward in user.Currency)
|
||||||
|
{
|
||||||
|
if (currentReward.Key == (CurrencyType)item.reward_id)
|
||||||
|
{
|
||||||
|
user.Currency[currentReward.Key] += item.reward_value;
|
||||||
|
|
||||||
|
ret.Currency.Add(new NetCurrencyData()
|
||||||
|
{
|
||||||
|
FinalValue = user.Currency[currentReward.Key],
|
||||||
|
Value = item.reward_value,
|
||||||
|
Type = item.reward_id
|
||||||
|
});
|
||||||
|
found = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!found)
|
||||||
|
{
|
||||||
|
user.Currency.Add((CurrencyType)item.reward_id, item.reward_value);
|
||||||
|
ret.Currency.Add(new NetCurrencyData()
|
||||||
|
{
|
||||||
|
FinalValue = item.reward_value,
|
||||||
|
Value = item.reward_value,
|
||||||
|
Type = item.reward_id
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (item.reward_type == "Item")
|
||||||
|
{
|
||||||
|
// Check if user already has said item. If it is level 1, increase item count.
|
||||||
|
// If user does not have item, generate a new item ID
|
||||||
|
if (user.Items.Where(x => x.ItemType == item.reward_id && x.Level == 1).Any())
|
||||||
|
{
|
||||||
|
ItemData? newItem = user.Items.Where(x => x.ItemType == item.reward_id && x.Level == 1).FirstOrDefault();
|
||||||
|
if (newItem != null)
|
||||||
|
{
|
||||||
|
newItem.Count += item.reward_value;
|
||||||
|
|
||||||
|
ret.Item.Add(new NetItemData()
|
||||||
|
{
|
||||||
|
Count = item.reward_value,
|
||||||
|
Tid = item.reward_id,
|
||||||
|
Isn = newItem.Isn
|
||||||
|
});
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
throw new Exception("should not occur");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
|
||||||
|
var id = user.GenerateUniqueItemId();
|
||||||
|
user.Items.Add(new ItemData() { ItemType = item.reward_id, Isn = id, Level = 1, Exp = 0, Count = item.reward_value });
|
||||||
|
ret.Item.Add(new NetItemData()
|
||||||
|
{
|
||||||
|
Count = item.reward_value,
|
||||||
|
Tid = item.reward_id,
|
||||||
|
Isn = id
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (item.reward_type == "Memorial")
|
||||||
|
{
|
||||||
|
if (!user.Memorial.Contains(item.reward_id))
|
||||||
|
{
|
||||||
|
ret.Memorial.Add(item.reward_id);
|
||||||
|
user.Memorial.Add(item.reward_id);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (item.reward_type == "Bgm")
|
||||||
|
{
|
||||||
|
if (!user.JukeboxBgm.Contains(item.reward_id))
|
||||||
|
{
|
||||||
|
ret.JukeboxBgm.Add(item.reward_id);
|
||||||
|
user.JukeboxBgm.Add(item.reward_id);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Console.WriteLine("TODO: Reward type " + item.reward_type);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user