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");
|
||||
var positionReward = GameData.Instance.FieldItems[fieldReward];
|
||||
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
|
||||
field.CompletedObjects.Add(new NetFieldObject() { PositionId = req.FieldObject.PositionId, Type = req.FieldObject.Type});
|
||||
|
||||
@@ -1,8 +1,7 @@
|
||||
using EpinelPS.Database;
|
||||
using EpinelPS.LobbyServer.Stage;
|
||||
using EpinelPS.Utils;
|
||||
|
||||
namespace EpinelPS.LobbyServer.Outpost
|
||||
namespace EpinelPS.LobbyServer.Msgs.Outpost
|
||||
{
|
||||
[PacketPath("/outpost/obtainoutpostbattlereward")]
|
||||
public class ObtainOutpostReward : LobbyMsgHandler
|
||||
|
||||
@@ -24,7 +24,7 @@ namespace EpinelPS.LobbyServer.Sidestory
|
||||
var rewardData = GameData.Instance.GetRewardTableEntry(GameData.Instance.SidestoryRewardTable[req.SideStoryStageId]);
|
||||
|
||||
if (rewardData != null)
|
||||
response.Reward = ClearStage.RegisterRewardsForUser(user, rewardData);
|
||||
response.Reward = RewardUtils.RegisterRewardsForUser(user, rewardData);
|
||||
else
|
||||
throw new Exception("failed to find reward");
|
||||
}
|
||||
|
||||
@@ -55,7 +55,7 @@ namespace EpinelPS.LobbyServer.Stage
|
||||
}
|
||||
|
||||
if (rewardData != null)
|
||||
response.StageClearReward = RegisterRewardsForUser(user, rewardData);
|
||||
response.StageClearReward = RewardUtils.RegisterRewardsForUser(user, rewardData);
|
||||
else
|
||||
Console.WriteLine("rewardId is null for stage " + StageId);
|
||||
|
||||
@@ -115,156 +115,6 @@ namespace EpinelPS.LobbyServer.Stage
|
||||
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)
|
||||
{
|
||||
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");
|
||||
response.Reward = ClearStage.RegisterRewardsForUser(user, reward);
|
||||
response.Reward = RewardUtils.RegisterRewardsForUser(user, reward);
|
||||
|
||||
|
||||
JsonDb.Save();
|
||||
|
||||
@@ -33,7 +33,7 @@ namespace EpinelPS.LobbyServer.Trigger
|
||||
var reward = GameData.Instance.GetRewardTableEntry(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