public static DynamicGameAssets.PackData.FruitTreePackData ConvertFruitTree(this JsonAssets.Data.FruitTreeData data, string packId, Dictionary <string, Dictionary <string, string> > i18n, List <DynamicGameAssets.PackData.FruitTreePackData> fruitTrees, List <DynamicGameAssets.PackData.ObjectPackData> objs, List <DynamicGameAssets.PackData.ShopEntryPackData> shops) { var item = new DynamicGameAssets.PackData.FruitTreePackData(); item.ExtensionData.Add("JsonAssetsName", JToken.FromObject(data.Name)); item.ID = data.Name + " Tree"; item.Texture = Path.Combine("assets", "fruit-trees", item.ID + ".png"); var productObj = objs.FirstOrDefault(o => o.ID == data.Product.ToString()); item.Product = new List <DynamicGameAssets.Weighted <DynamicGameAssets.ItemAbstraction> >(new DynamicGameAssets.Weighted <DynamicGameAssets.ItemAbstraction>[] { new DynamicGameAssets.Weighted <DynamicGameAssets.ItemAbstraction>(1, new DynamicGameAssets.ItemAbstraction() { Value = productObj != null ? $"{packId}/{productObj.ID}" : data.Product.ToString(), Type = productObj != null ? DynamicGameAssets.ItemAbstraction.ItemType.DGAItem : DynamicGameAssets.ItemAbstraction.ItemType.VanillaObject }) }); var dynFields = new List <DynamicGameAssets.PackData.DynamicFieldData>(); { var dynField = new DynamicGameAssets.PackData.DynamicFieldData(); dynField.Conditions.Add("Season", data.Season); dynField.Fields.Add("CanGrowNow", JToken.FromObject(true)); dynFields.Add(dynField); } item.DynamicFields = dynFields.ToArray(); fruitTrees.Add(item); var saplingItem = new DynamicGameAssets.PackData.ObjectPackData(); i18n.AddI18n("en", $"object.{data.SaplingName}.name", data.SaplingName); i18n.AddI18n("en", $"object.{data.SaplingName}.description", data.SaplingDescription); saplingItem.ID = data.SaplingName; saplingItem.Texture = Path.Combine("assets", "objects", item.ID + "_sapling.png"); saplingItem.Category = DynamicGameAssets.PackData.ObjectPackData.VanillaCategory.Seeds; saplingItem.Plants = $"{packId}/{item.ID}"; foreach (var loc in data.SaplingNameLocalization) { i18n.AddI18n(loc.Key, $"object.{data.SaplingName}.name", loc.Value); } foreach (var loc in data.SaplingDescriptionLocalization) { i18n.AddI18n(loc.Key, $"object.{data.SaplingName}.description", loc.Value); } objs.Add(saplingItem); data.SaplingPurchaseRequirements.Add("z " + data.Season); ConversionExtensions.DoShopEntry(shops, packId, data.SaplingName, new JsonAssets.PurchaseData() { PurchasePrice = data.SaplingPurchasePrice, PurchaseFrom = data.SaplingPurchaseFrom, PurchaseRequirements = data.SaplingPurchaseRequirements, }); foreach (var entry in data.SaplingAdditionalPurchaseData) { ConversionExtensions.DoShopEntry(shops, packId, data.SaplingName, entry); } return(item); }
public static DynamicGameAssets.PackData.CropPackData ConvertCrop(this JsonAssets.Data.CropData data, string packId, Dictionary <string, Dictionary <string, string> > i18n, List <DynamicGameAssets.PackData.CropPackData> crops, List <DynamicGameAssets.PackData.ObjectPackData> objs, List <DynamicGameAssets.PackData.ShopEntryPackData> shops) { var item = new DynamicGameAssets.PackData.CropPackData(); item.ExtensionData.Add("JsonAssetsName", JToken.FromObject(data.Name)); item.ID = data.Name + " Crop"; switch (data.CropType) { case JsonAssets.Data.CropType.Normal: item.Type = DynamicGameAssets.PackData.CropPackData.CropType.Normal; break; case JsonAssets.Data.CropType.IndoorsOnly: item.Type = DynamicGameAssets.PackData.CropPackData.CropType.Indoors; break; case JsonAssets.Data.CropType.Paddy: item.Type = DynamicGameAssets.PackData.CropPackData.CropType.Paddy; break; } item.Colors = (data.Colors?.Count ?? 0) > 0 ? new List <Color>(data.Colors) : null; for (int i = 0; i <= data.Phases.Count; ++i) { var phase = new DynamicGameAssets.PackData.CropPackData.PhaseData(); string texPathBase = Path.Combine("assets", "crops", item.ID + ".png"); phase.TextureChoices = i == 0 ? (new string[] { $"{texPathBase}:0", $"{texPathBase}:1" }) : (new string[] { $"{texPathBase}:{i + 1}" }); phase.Trellis = data.TrellisCrop; if (i < data.Phases.Count) { phase.Length = data.Phases[i]; } if (i == data.Phases.Count) { if ((item.Colors?.Count ?? 0) > 0) { phase.TextureColorChoices = new string[] { $"{texPathBase}:{i + 2}" } } ; phase.Scythable = data.HarvestWithScythe; if (data.RegrowthPhase != -1) { Log.Warn("Regrowth phase adjusted for " + data.Name + "; see documentation for details."); phase.HarvestedNewPhase = data.Phases.Count - 2; } var productObj = objs.FirstOrDefault(o => o.ID == data.Product.ToString()); int productObjPrice = 0; if (productObj != null) { productObjPrice = productObj.SellPrice.HasValue ? productObj.SellPrice.Value : 0; } else { if (data.Product is long id) { productObjPrice = int.Parse(Game1.objectInformation[(int)id].Split('/')[StardewValley.Object.objectInfoPriceIndex]); } else { foreach (var entry in Game1.objectInformation) { string[] split = entry.Value.Split('/'); if (split[StardewValley.Object.objectInfoNameIndex] == (string)data.Product) { productObjPrice = int.Parse(split[StardewValley.Object.objectInfoPriceIndex]); break; } } } } phase.HarvestedExperience = (int)Math.Round(16 * Math.Log(0.018 * productObjPrice + 1, Math.E)); var drop = new DynamicGameAssets.PackData.CropPackData.HarvestedDropData() { Item = new List <DynamicGameAssets.Weighted <DynamicGameAssets.ItemAbstraction> >(new DynamicGameAssets.Weighted <DynamicGameAssets.ItemAbstraction>[] { new DynamicGameAssets.Weighted <DynamicGameAssets.ItemAbstraction>(1, new DynamicGameAssets.ItemAbstraction() { Value = productObj != null ? $"{packId}/{productObj.ID}" : data.Product.ToString(), Type = productObj != null ? DynamicGameAssets.ItemAbstraction.ItemType.DGAItem : (item.Colors != null ? DynamicGameAssets.ItemAbstraction.ItemType.VanillaObjectColored : DynamicGameAssets.ItemAbstraction.ItemType.VanillaObject) }) }), MininumHarvestedQuantity = data.Bonus?.MinimumPerHarvest ?? 1, MaximumHarvestedQuantity = data.Bonus?.MaximumPerHarvest ?? 1, ExtraQuantityChance = (double)(data.Bonus?.ExtraChance ?? 0), }; phase.HarvestedDrops.Add(drop); } item.Phases.Add(phase); } var dynFields = new List <DynamicGameAssets.PackData.DynamicFieldData>(); { var dynField = new DynamicGameAssets.PackData.DynamicFieldData(); dynField.Conditions.Add("Season", string.Join(", ", data.Seasons)); dynField.Fields.Add("CanGrowNow", JToken.FromObject(true)); dynFields.Add(dynField); } if ((data.Bonus?.MaxIncreasePerFarmLevel ?? 0) > 0) { for (int i = 1; i <= 10; ++i) { var dynField = new DynamicGameAssets.PackData.DynamicFieldData(); dynField.Conditions.Add("SkillLevel:Farming", i.ToString()); dynField.Fields.Add($"Phases[{item.Phases.Count - 1}].HarvestedDrops[0].MaximumHarvestedQuantity", JToken.FromObject(item.Phases[item.Phases.Count - 1].HarvestedDrops[0].MaximumHarvestedQuantity + data.Bonus.MaxIncreasePerFarmLevel * i)); dynFields.Add(dynField); } } item.DynamicFields = dynFields.ToArray(); crops.Add(item); var seedsItem = new DynamicGameAssets.PackData.ObjectPackData(); i18n.AddI18n("en", $"object.{data.SeedName}.name", data.SeedName); i18n.AddI18n("en", $"object.{data.SeedName}.description", data.SeedDescription); seedsItem.ID = data.SeedName; seedsItem.Texture = Path.Combine("assets", "objects", item.ID + "_seeds.png"); seedsItem.Category = DynamicGameAssets.PackData.ObjectPackData.VanillaCategory.Seeds; seedsItem.SellPrice = data.SeedSellPrice == -1 ? null : data.SeedSellPrice; seedsItem.Plants = $"{packId}/{item.ID}"; foreach (var loc in data.SeedNameLocalization) { i18n.AddI18n(loc.Key, $"object.{data.SeedName}.name", loc.Value); } foreach (var loc in data.SeedDescriptionLocalization) { i18n.AddI18n(loc.Key, $"object.{data.SeedName}.description", loc.Value); } objs.Add(seedsItem); data.SeedPurchaseRequirements.Add("z " + string.Join(" ", data.Seasons)); ConversionExtensions.DoShopEntry(shops, packId, data.SeedName, new JsonAssets.PurchaseData() { PurchasePrice = data.SeedPurchasePrice, PurchaseFrom = data.SeedPurchaseFrom, PurchaseRequirements = data.SeedPurchaseRequirements, }); foreach (var entry in data.SeedAdditionalPurchaseData) { ConversionExtensions.DoShopEntry(shops, packId, data.SeedName, entry); } return(item); }