forked from SoDOff-Project/sodoff
split AchievementService into scoped and singleton
This commit is contained in:
parent
d95a117ef0
commit
9949fb5e7d
@ -14,14 +14,17 @@ builder.Services.AddControllers(options => {
|
|||||||
options.Filters.Add<LogRequestOnError>();
|
options.Filters.Add<LogRequestOnError>();
|
||||||
});
|
});
|
||||||
builder.Services.AddDbContext<DBContext>();
|
builder.Services.AddDbContext<DBContext>();
|
||||||
builder.Services.AddScoped<KeyValueService>();
|
|
||||||
builder.Services.AddSingleton<ItemService>();
|
|
||||||
builder.Services.AddSingleton<MissionStoreSingleton>();
|
builder.Services.AddSingleton<MissionStoreSingleton>();
|
||||||
builder.Services.AddScoped<MissionService>();
|
builder.Services.AddSingleton<AchievementStoreSingleton>();
|
||||||
|
builder.Services.AddSingleton<ItemService>();
|
||||||
builder.Services.AddSingleton<StoreService>();
|
builder.Services.AddSingleton<StoreService>();
|
||||||
|
|
||||||
|
builder.Services.AddScoped<KeyValueService>();
|
||||||
|
builder.Services.AddScoped<MissionService>();
|
||||||
builder.Services.AddScoped<RoomService>();
|
builder.Services.AddScoped<RoomService>();
|
||||||
builder.Services.AddSingleton<AchievementService>();
|
|
||||||
builder.Services.AddScoped<InventoryService>();
|
builder.Services.AddScoped<InventoryService>();
|
||||||
|
builder.Services.AddScoped<AchievementService>();
|
||||||
|
|
||||||
var app = builder.Build();
|
var app = builder.Build();
|
||||||
|
|
||||||
|
@ -7,6 +7,7 @@ using System.Xml.Linq;
|
|||||||
|
|
||||||
namespace sodoff.Services {
|
namespace sodoff.Services {
|
||||||
public class AchievementService {
|
public class AchievementService {
|
||||||
|
private AchievementStoreSingleton achievementStore;
|
||||||
private InventoryService inventoryService;
|
private InventoryService inventoryService;
|
||||||
|
|
||||||
Dictionary<AchievementPointTypes, UserRank[]> ranks = new();
|
Dictionary<AchievementPointTypes, UserRank[]> ranks = new();
|
||||||
@ -16,30 +17,9 @@ namespace sodoff.Services {
|
|||||||
int dragonAdultMinXP;
|
int dragonAdultMinXP;
|
||||||
int dragonTitanMinXP;
|
int dragonTitanMinXP;
|
||||||
|
|
||||||
public AchievementService(InventoryService inventoryService) {
|
public AchievementService(AchievementStoreSingleton achievementStore, InventoryService inventoryService) {
|
||||||
|
this.achievementStore = achievementStore;
|
||||||
this.inventoryService = inventoryService;
|
this.inventoryService = inventoryService;
|
||||||
|
|
||||||
ArrayOfUserRank allranks = XmlUtil.DeserializeXml<ArrayOfUserRank>(XmlUtil.ReadResourceXmlString("allranks"));
|
|
||||||
foreach (var pointType in Enum.GetValues<AchievementPointTypes>()) {
|
|
||||||
ranks[pointType] = allranks.UserRank.Where(r => r.PointTypeID == pointType).ToArray();
|
|
||||||
}
|
|
||||||
|
|
||||||
AchievementsIdInfo[] allAchievementsIdInfo = XmlUtil.DeserializeXml<AchievementsIdInfo[]>(XmlUtil.ReadResourceXmlString("achievementsids"));
|
|
||||||
foreach (var achievementsIdInfo in allAchievementsIdInfo) {
|
|
||||||
achivmentsRewardByID[achievementsIdInfo.AchievementID] = achievementsIdInfo.AchievementReward;
|
|
||||||
}
|
|
||||||
|
|
||||||
AchievementsTaskInfo[] allAchievementsTaskInfo = XmlUtil.DeserializeXml<AchievementsTaskInfo[]>(XmlUtil.ReadResourceXmlString("achievementstasks"));
|
|
||||||
foreach (var achievementsTaskInfo in allAchievementsTaskInfo) {
|
|
||||||
achivmentsRewardByTask[achievementsTaskInfo.TaskID] = achievementsTaskInfo.AchievementReward;
|
|
||||||
}
|
|
||||||
|
|
||||||
dragonAdultMinXP = ranks[AchievementPointTypes.DragonXP][10].Value;
|
|
||||||
dragonTitanMinXP = ranks[AchievementPointTypes.DragonXP][20].Value;
|
|
||||||
}
|
|
||||||
|
|
||||||
public int GetRankFromXP(int? xpPoints, AchievementPointTypes type) {
|
|
||||||
return ranks[type].Count(r => r.Value <= xpPoints);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public UserAchievementInfo CreateUserAchievementInfo(string userId, int? value, AchievementPointTypes type) {
|
public UserAchievementInfo CreateUserAchievementInfo(string userId, int? value, AchievementPointTypes type) {
|
||||||
@ -48,7 +28,7 @@ namespace sodoff.Services {
|
|||||||
return new UserAchievementInfo {
|
return new UserAchievementInfo {
|
||||||
UserID = Guid.Parse(userId),
|
UserID = Guid.Parse(userId),
|
||||||
AchievementPointTotal = value,
|
AchievementPointTotal = value,
|
||||||
RankID = GetRankFromXP(value, type),
|
RankID = achievementStore.GetRankFromXP(value, type),
|
||||||
PointTypeID = type
|
PointTypeID = type
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
@ -58,17 +38,8 @@ namespace sodoff.Services {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void DragonLevelUpOnAgeUp(Dragon dragon, RaisedPetGrowthState oldGrowthState, RaisedPetGrowthState newGrowthState) {
|
public void DragonLevelUpOnAgeUp(Dragon dragon, RaisedPetGrowthState oldGrowthState, RaisedPetGrowthState newGrowthState) {
|
||||||
if (oldGrowthState is null || newGrowthState.Order > oldGrowthState.Order) {
|
if (oldGrowthState is null || newGrowthState.Order > oldGrowthState.Order) { // if dragon age up
|
||||||
// age up
|
dragon.PetXP = achievementStore.GetUpdatedDragonXP(dragon.PetXP ?? 0, newGrowthState.Order);
|
||||||
int dragonXP = dragon.PetXP ?? 0;
|
|
||||||
if (newGrowthState.Order == 4 && dragonXP < dragonAdultMinXP) {
|
|
||||||
// to adult via ticket -> add XP
|
|
||||||
dragonXP += dragonAdultMinXP;
|
|
||||||
} else if (newGrowthState.Order == 5 && dragonXP < dragonTitanMinXP) {
|
|
||||||
// adult to titan via ticket -> add XP
|
|
||||||
dragonXP += dragonTitanMinXP - dragonAdultMinXP;
|
|
||||||
}
|
|
||||||
dragon.PetXP = dragonXP;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -139,8 +110,8 @@ namespace sodoff.Services {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public AchievementReward[] ApplyAchievementRewardsByID(Viking viking, int achievementID) {
|
public AchievementReward[] ApplyAchievementRewardsByID(Viking viking, int achievementID) {
|
||||||
if (achivmentsRewardByID.ContainsKey(achievementID)) {
|
var rewards = achievementStore.GetAchievementRewardsById(achievementID);
|
||||||
var rewards = achivmentsRewardByID[achievementID];
|
if (rewards != null) {
|
||||||
return ApplyAchievementRewards(viking, rewards);
|
return ApplyAchievementRewards(viking, rewards);
|
||||||
} else {
|
} else {
|
||||||
return new AchievementReward[0];
|
return new AchievementReward[0];
|
||||||
@ -148,8 +119,8 @@ namespace sodoff.Services {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public AchievementReward[] ApplyAchievementRewardsByTask(Viking viking, AchievementTask task) {
|
public AchievementReward[] ApplyAchievementRewardsByTask(Viking viking, AchievementTask task) {
|
||||||
if (achivmentsRewardByTask.ContainsKey(task.TaskID)) {
|
var rewards = achievementStore.GetAchievementRewardsByTask(task.TaskID);
|
||||||
var rewards = achivmentsRewardByTask[task.TaskID];
|
if (rewards != null) {
|
||||||
return ApplyAchievementRewards(viking, rewards);
|
return ApplyAchievementRewards(viking, rewards);
|
||||||
} else {
|
} else {
|
||||||
return new AchievementReward[0];
|
return new AchievementReward[0];
|
||||||
|
72
src/Services/AchievementStoreSingleton.cs
Normal file
72
src/Services/AchievementStoreSingleton.cs
Normal file
@ -0,0 +1,72 @@
|
|||||||
|
using sodoff.Schema;
|
||||||
|
using sodoff.Model;
|
||||||
|
using sodoff.Util;
|
||||||
|
using System.Reflection;
|
||||||
|
using System.Xml;
|
||||||
|
using System.Xml.Linq;
|
||||||
|
|
||||||
|
namespace sodoff.Services {
|
||||||
|
public class AchievementStoreSingleton {
|
||||||
|
private InventoryService inventoryService;
|
||||||
|
|
||||||
|
Dictionary<AchievementPointTypes, UserRank[]> ranks = new();
|
||||||
|
Dictionary<int, AchievementReward[]> achivmentsRewardByID = new();
|
||||||
|
Dictionary<int, AchievementReward[]> achivmentsRewardByTask = new();
|
||||||
|
|
||||||
|
int dragonAdultMinXP;
|
||||||
|
int dragonTitanMinXP;
|
||||||
|
|
||||||
|
public AchievementStoreSingleton(InventoryService inventoryService) {
|
||||||
|
this.inventoryService = inventoryService;
|
||||||
|
|
||||||
|
ArrayOfUserRank allranks = XmlUtil.DeserializeXml<ArrayOfUserRank>(XmlUtil.ReadResourceXmlString("allranks"));
|
||||||
|
foreach (var pointType in Enum.GetValues<AchievementPointTypes>()) {
|
||||||
|
ranks[pointType] = allranks.UserRank.Where(r => r.PointTypeID == pointType).ToArray();
|
||||||
|
}
|
||||||
|
|
||||||
|
AchievementsIdInfo[] allAchievementsIdInfo = XmlUtil.DeserializeXml<AchievementsIdInfo[]>(XmlUtil.ReadResourceXmlString("achievementsids"));
|
||||||
|
foreach (var achievementsIdInfo in allAchievementsIdInfo) {
|
||||||
|
achivmentsRewardByID[achievementsIdInfo.AchievementID] = achievementsIdInfo.AchievementReward;
|
||||||
|
}
|
||||||
|
|
||||||
|
AchievementsTaskInfo[] allAchievementsTaskInfo = XmlUtil.DeserializeXml<AchievementsTaskInfo[]>(XmlUtil.ReadResourceXmlString("achievementstasks"));
|
||||||
|
foreach (var achievementsTaskInfo in allAchievementsTaskInfo) {
|
||||||
|
achivmentsRewardByTask[achievementsTaskInfo.TaskID] = achievementsTaskInfo.AchievementReward;
|
||||||
|
}
|
||||||
|
|
||||||
|
dragonAdultMinXP = ranks[AchievementPointTypes.DragonXP][10].Value;
|
||||||
|
dragonTitanMinXP = ranks[AchievementPointTypes.DragonXP][20].Value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int GetRankFromXP(int? xpPoints, AchievementPointTypes type) {
|
||||||
|
return ranks[type].Count(r => r.Value <= xpPoints);
|
||||||
|
}
|
||||||
|
|
||||||
|
public AchievementReward[]? GetAchievementRewardsById(int achievementID) {
|
||||||
|
if (achivmentsRewardByID.ContainsKey(achievementID)) {
|
||||||
|
return achivmentsRewardByID[achievementID];
|
||||||
|
} else {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public AchievementReward[]? GetAchievementRewardsByTask(int taskID) {
|
||||||
|
if (achivmentsRewardByTask.ContainsKey(taskID)) {
|
||||||
|
return achivmentsRewardByTask[taskID];
|
||||||
|
} else {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public int GetUpdatedDragonXP(int dragonXP, int growthState) {
|
||||||
|
if (growthState == 4 && dragonXP < dragonAdultMinXP) {
|
||||||
|
// to adult via ticket -> add XP
|
||||||
|
dragonXP += dragonAdultMinXP;
|
||||||
|
} else if (growthState == 5 && dragonXP < dragonTitanMinXP) {
|
||||||
|
// adult to titan via ticket -> add XP
|
||||||
|
dragonXP += dragonTitanMinXP - dragonAdultMinXP;
|
||||||
|
}
|
||||||
|
return dragonXP;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user