move RegisterRewardsForUser to RewardUtils

This commit is contained in:
Mikhail
2024-12-21 11:39:36 -05:00
parent c8a47a39d0
commit 3fa3915c2b
7 changed files with 166 additions and 157 deletions

View File

@@ -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});

View File

@@ -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

View File

@@ -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");
} }

View File

@@ -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);

View File

@@ -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();

View File

@@ -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));
} }
} }

View 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;
}
}
}