jumpstart-games-reduxed/src/Services/InventoryService.cs
rpaciorek 7bee6c620a
dragons tactics (battle) backpack (#26)
* return battle item as battle items

placeholder - no saved stats, always use default stats

* Blacksmith API implementation

* ApplyRewards (DT rewards) and AddBattleItems

also temporary disable some AchievementsTask rewards from DT ... probably should not be repeatable ...

* support "box tickets" blueprints

- add OpenBox in ItemService (should be useful for other boxes also)
- move checking item category to ItemService (ItemHasCategory)

* InventoryService and full DragonTactics rewards

- move "add to inventory" to InventoryService
- move creating CommonInventoryData from inventory to InventoryService
- move CreateItemStats() to ItemService
- assigning random "item" reward from DT based on dtrewards.xml (at this moment list of all DT items not listed in store)
- rework dragon XP and add player XP and gems reward to DT
2023-08-31 20:42:03 +02:00

116 lines
4.5 KiB
C#

using sodoff.Model;
using sodoff.Schema;
using sodoff.Util;
using System.Threading.Tasks;
namespace sodoff.Services {
public class InventoryService {
private readonly DBContext ctx;
private ItemService itemService;
public const int Shards = 13711;
public InventoryService(DBContext ctx, ItemService itemService) {
this.ctx = ctx;
this.itemService = itemService;
}
public InventoryItem AddItemToInventory(Viking viking, int itemID, int quantity) {
InventoryItem? item = null;
if (!ItemNeedUniqueInventorySlot(itemID))
item = viking.Inventory.InventoryItems.FirstOrDefault(e => e.ItemId == itemID);
if (item is null) {
item = new InventoryItem {
ItemId = itemID,
Quantity = 0
};
viking.Inventory.InventoryItems.Add(item);
}
item.Quantity += quantity;
return item;
}
public CommonInventoryResponseItem AddItemToInventoryAndGetResponse(Viking viking, int itemID, int quantity) {
InventoryItem item = AddItemToInventory(viking, itemID, quantity);
ctx.SaveChanges(); // We need to get the ID of the newly created item
if (quantity == 1)
quantity = 0; // The game expects 0 if quantity got updated by just 1
// Otherwise it expects the quantity from the request
return new CommonInventoryResponseItem {
CommonInventoryID = item.Id,
ItemID = itemID,
Quantity = quantity
};
}
public InventoryItemStatsMap AddBattleItemToInventory(Viking viking, int itemId, int itemTier, ItemStat[] itemStat = null) {
// get item data
ItemData itemData = itemService.GetItem(itemId);
// create new item
InventoryItem item = new InventoryItem { ItemId = itemId, Quantity = 1 };
ItemStatsMap itemStatsMap = new ItemStatsMap {
ItemID = itemId,
ItemTier = (ItemTier)itemTier,
ItemStats = itemStat ?? itemService.CreateItemStats(itemData.PossibleStatsMap, (int)itemData.ItemRarity, itemTier).ToArray()
};
item.StatsSerialized = XmlUtil.SerializeXml(itemStatsMap);
// add to viking
viking.Inventory.InventoryItems.Add(item);
ctx.SaveChanges(); // We need to get the ID of the newly created item
// return item with stats
return new InventoryItemStatsMap {
CommonInventoryID = item.Id,
Item = itemData,
ItemStatsMap = itemStatsMap
};
}
public CommonInventoryData GetCommonInventoryData(Viking viking) {
List<InventoryItem> items = viking.Inventory.InventoryItems.ToList();
List<UserItemData> userItemData = new();
foreach (InventoryItem item in items) {
if (item.Quantity == 0) continue; // Don't include an item that the viking doesn't have
ItemData itemData = itemService.GetItem(item.ItemId);
UserItemData uid = new UserItemData {
UserInventoryID = item.Id,
ItemID = itemData.ItemID,
Quantity = item.Quantity,
Uses = itemData.Uses,
ModifiedDate = new DateTime(DateTime.Now.Ticks),
Item = itemData
};
if (item.StatsSerialized != null) {
ItemStatsMap itemStats = XmlUtil.DeserializeXml<ItemStatsMap>(item.StatsSerialized);
uid.ItemStats = itemStats.ItemStats;
uid.ItemTier = itemStats.ItemTier;
} else if (itemData.ItemStatsMap != null) {
uid.ItemStats = itemData.ItemStatsMap?.ItemStats;
uid.ItemTier = itemData.ItemStatsMap?.ItemTier;
}
userItemData.Add(uid);
}
return new CommonInventoryData {
UserID = Guid.Parse(viking.Id),
Item = userItemData.ToArray()
};
}
public bool ItemNeedUniqueInventorySlot(int itemId) {
return itemService.ItemHasCategory(
itemService.GetItem(itemId), new int[] {
541, // farm expansion
511, // dragons tactics (battle) items
}
);
}
}
}