From 247912cbc9098782ae6e15084ec4477cabb670e9 Mon Sep 17 00:00:00 2001 From: Ellpeck Date: Fri, 10 Jul 2020 20:45:23 +0200 Subject: [PATCH] show applied upgrades in the map menu --- TouchyTickets/Attractions/Attraction.cs | 13 ++--- TouchyTickets/Attractions/AttractionType.cs | 12 ++--- TouchyTickets/Content/Localization | 2 +- TouchyTickets/GameImpl.cs | 1 + TouchyTickets/ParkMap.cs | 1 + TouchyTickets/SaveHandler.cs | 1 + TouchyTickets/Ui.cs | 17 ++++++ TouchyTickets/Upgrades/ModifierUpgrade.cs | 23 ++++++++ .../Upgrades/NeighborModifierUpgrade.cs | 26 +++++++++ TouchyTickets/{ => Upgrades}/Upgrade.cs | 53 ++++++++++--------- 10 files changed, 105 insertions(+), 44 deletions(-) create mode 100644 TouchyTickets/Upgrades/ModifierUpgrade.cs create mode 100644 TouchyTickets/Upgrades/NeighborModifierUpgrade.cs rename TouchyTickets/{ => Upgrades}/Upgrade.cs (77%) diff --git a/TouchyTickets/Attractions/Attraction.cs b/TouchyTickets/Attractions/Attraction.cs index 9e56564..ddfe7fb 100644 --- a/TouchyTickets/Attractions/Attraction.cs +++ b/TouchyTickets/Attractions/Attraction.cs @@ -9,6 +9,7 @@ using MLEM.Extensions; using MLEM.Misc; using MLEM.Startup; using MLEM.Textures; +using TouchyTickets.Upgrades; using static TouchyTickets.Attractions.AttractionFlags; using static TouchyTickets.Attractions.AttractionType; @@ -65,14 +66,8 @@ namespace TouchyTickets.Attractions { genRate *= mod; // apply star upgrades - if (Upgrade.FerrisWheelModifier.IsActive() && this.GetSurrounding(map, position, FerrisWheel).Any()) - genRate *= 2; - if (Upgrade.FoodCourtModifier.IsActive() && this.GetSurrounding(map, position, FoodCourt).Any()) - genRate *= 2; - if (Upgrade.SpiralSlideModifier.IsActive() && this.GetSurrounding(map, position, SpiralSlide).Any()) - genRate *= 2; - if (Upgrade.HauntedHouseModifier.IsActive() && this.Type.Flags.HasFlag(Relaxed) && this.GetSurrounding(map, position, HauntedHouse).Any()) - genRate *= 3; + foreach (var upgrade in Upgrade.Upgrades.Values.OfType()) + genRate *= upgrade.GetCurrentMultiplier(this, map, position); return genRate; } @@ -102,7 +97,7 @@ namespace TouchyTickets.Attractions { this.animationSizeModifier = MathHelper.Pi; } - private IEnumerable GetSurrounding(ParkMap map, Point position, AttractionType type) { + public IEnumerable GetSurrounding(ParkMap map, Point position, AttractionType type) { foreach (var tile in this.Type.GetCoveredTiles()) { foreach (var dir in Direction2Helper.Adjacent) { var other = map.GetAttractionAt(position + tile + dir.Offset()); diff --git a/TouchyTickets/Attractions/AttractionType.cs b/TouchyTickets/Attractions/AttractionType.cs index 93971da..aabc0fa 100644 --- a/TouchyTickets/Attractions/AttractionType.cs +++ b/TouchyTickets/Attractions/AttractionType.cs @@ -1,8 +1,10 @@ using System; using System.Collections.Generic; +using System.Linq; using Microsoft.Xna.Framework; using MLEM.Textures; using Newtonsoft.Json; +using TouchyTickets.Upgrades; using static TouchyTickets.Attractions.AttractionFlags; namespace TouchyTickets.Attractions { @@ -50,14 +52,8 @@ namespace TouchyTickets.Attractions { public double GetGenerationRate() { var genRate = this.generationPerSecond; - - if (this.Flags.HasFlag(FastCars) && Upgrade.RollerCoasterModifier.IsActive()) - genRate *= 2; - if (this.Flags.HasFlag(Walking) && Upgrade.ManualRideModifier.IsActive()) - genRate *= 3; - if (this.Flags.HasFlag(NonTechnology) && Upgrade.NatureModifier.IsActive()) - genRate *= 2; - + foreach (var upgrade in Upgrade.Upgrades.Values.OfType()) + genRate *= upgrade.GetCurrentMultiplier(this); return genRate; } diff --git a/TouchyTickets/Content/Localization b/TouchyTickets/Content/Localization index 83e0e71..8428712 160000 --- a/TouchyTickets/Content/Localization +++ b/TouchyTickets/Content/Localization @@ -1 +1 @@ -Subproject commit 83e0e71857a74015ae547ab1ab5d0b9622082e85 +Subproject commit 8428712d0a64e36334908cd25bec7dddd9abd66d diff --git a/TouchyTickets/GameImpl.cs b/TouchyTickets/GameImpl.cs index 6b4d1d6..62e3da7 100644 --- a/TouchyTickets/GameImpl.cs +++ b/TouchyTickets/GameImpl.cs @@ -6,6 +6,7 @@ using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Graphics; using MLEM.Cameras; using MLEM.Startup; +using TouchyTickets.Upgrades; namespace TouchyTickets { public class GameImpl : MlemGame { diff --git a/TouchyTickets/ParkMap.cs b/TouchyTickets/ParkMap.cs index 8cabca9..7bf4daf 100644 --- a/TouchyTickets/ParkMap.cs +++ b/TouchyTickets/ParkMap.cs @@ -10,6 +10,7 @@ using MLEM.Misc; using MLEM.Startup; using MLEM.Textures; using TouchyTickets.Attractions; +using TouchyTickets.Upgrades; namespace TouchyTickets { [DataContract] diff --git a/TouchyTickets/SaveHandler.cs b/TouchyTickets/SaveHandler.cs index 4330a66..376cae9 100644 --- a/TouchyTickets/SaveHandler.cs +++ b/TouchyTickets/SaveHandler.cs @@ -4,6 +4,7 @@ using System.IO; using System.Linq; using System.Numerics; using Newtonsoft.Json; +using TouchyTickets.Upgrades; namespace TouchyTickets { public static class SaveHandler { diff --git a/TouchyTickets/Ui.cs b/TouchyTickets/Ui.cs index 552ace9..1596e3b 100644 --- a/TouchyTickets/Ui.cs +++ b/TouchyTickets/Ui.cs @@ -18,6 +18,7 @@ using MLEM.Textures; using MLEM.Ui; using MLEM.Ui.Elements; using TouchyTickets.Attractions; +using TouchyTickets.Upgrades; namespace TouchyTickets { public class Ui { @@ -33,6 +34,8 @@ namespace TouchyTickets { this.uiSystem = uiSystem; foreach (var modifier in AttractionModifier.Modifiers.Values) this.uiSystem.TextFormatter.AddImage(modifier.Name, Assets.UiTexture[modifier.Texture]); + foreach (var upgrade in Upgrade.Upgrades.Values) + this.uiSystem.TextFormatter.AddImage(upgrade.Name, Assets.UiTexture[upgrade.Texture]); // main ticket store ui var rainingTickets = new List(); @@ -651,6 +654,20 @@ namespace TouchyTickets { var attraction = map.GetAttractionAt(map.SelectedPosition.Value); return string.Join(" ", attraction.Modifiers.Select(m => $"{m.Amount}")); }, true)); + element.AddChild(new Paragraph(Anchor.AutoCenter, 1, p => { + if (map.SelectedPosition == null) + return string.Empty; + var pos = map.SelectedPosition.Value; + var attraction = map.GetAttractionAt(pos); + // beautiful + return string.Join(" ", Upgrade.Upgrades.Values + .Select(u => { + var multiplier = + u is ModifierUpgrade mod ? mod.GetCurrentMultiplier(attraction.Type) : + u is NeighborModifierUpgrade neighbor ? neighbor.GetCurrentMultiplier(attraction, map, pos) : 1; + return multiplier > 1 ? $" x{multiplier}" : null; + }).Where(s => s != null)); + }, true)); element.AddChild(new Paragraph(Anchor.AutoCenter, 1, p => { if (map.SelectedPosition == null) return string.Empty; diff --git a/TouchyTickets/Upgrades/ModifierUpgrade.cs b/TouchyTickets/Upgrades/ModifierUpgrade.cs new file mode 100644 index 0000000..3262490 --- /dev/null +++ b/TouchyTickets/Upgrades/ModifierUpgrade.cs @@ -0,0 +1,23 @@ +using Microsoft.Xna.Framework; +using TouchyTickets.Attractions; + +namespace TouchyTickets.Upgrades { + public class ModifierUpgrade : Upgrade { + + private readonly AttractionFlags requiredFlag; + private readonly float modifier; + + public ModifierUpgrade(string name, int price, Point texture, AttractionFlags requiredFlag, float modifier, params Upgrade[] dependencies) : + base(name, price, texture, dependencies) { + this.requiredFlag = requiredFlag; + this.modifier = modifier; + } + + public float GetCurrentMultiplier(AttractionType attraction) { + if (this.IsActive() && attraction.Flags.HasFlag(this.requiredFlag)) + return this.modifier; + return 1; + } + + } +} \ No newline at end of file diff --git a/TouchyTickets/Upgrades/NeighborModifierUpgrade.cs b/TouchyTickets/Upgrades/NeighborModifierUpgrade.cs new file mode 100644 index 0000000..7c438c7 --- /dev/null +++ b/TouchyTickets/Upgrades/NeighborModifierUpgrade.cs @@ -0,0 +1,26 @@ +using System.Linq; +using Microsoft.Xna.Framework; +using TouchyTickets.Attractions; + +namespace TouchyTickets.Upgrades { + public class NeighborModifierUpgrade : Upgrade { + + private readonly AttractionType requiredNeighbor; + private readonly AttractionFlags requiredFlag; + private readonly float modifier; + + public NeighborModifierUpgrade(string name, int price, Point texture, AttractionType requiredNeighbor, float modifier, AttractionFlags requiredFlag = AttractionFlags.None, params Upgrade[] dependencies) : + base(name, price, texture, dependencies) { + this.requiredNeighbor = requiredNeighbor; + this.requiredFlag = requiredFlag; + this.modifier = modifier; + } + + public float GetCurrentMultiplier(Attraction attraction, ParkMap map, Point position) { + if (this.IsActive() && attraction.Type.Flags.HasFlag(this.requiredFlag) && attraction.GetSurrounding(map, position, this.requiredNeighbor).Any()) + return this.modifier; + return 1; + } + + } +} \ No newline at end of file diff --git a/TouchyTickets/Upgrade.cs b/TouchyTickets/Upgrades/Upgrade.cs similarity index 77% rename from TouchyTickets/Upgrade.cs rename to TouchyTickets/Upgrades/Upgrade.cs index a52ccb5..3537e44 100644 --- a/TouchyTickets/Upgrade.cs +++ b/TouchyTickets/Upgrades/Upgrade.cs @@ -3,9 +3,10 @@ using System.Collections.Generic; using System.Linq; using Microsoft.Xna.Framework; using MLEM.Extensions; -using MLEM.Textures; +using static TouchyTickets.Attractions.AttractionFlags; +using static TouchyTickets.Attractions.AttractionType; -namespace TouchyTickets { +namespace TouchyTickets.Upgrades { public class Upgrade { public static readonly Dictionary Upgrades = new Dictionary(); @@ -13,13 +14,13 @@ namespace TouchyTickets { public static readonly Upgrade[] TapIncrease = RegisterTiers("TapIncrease", 3, 1, 0.5F, new Point(6, 3)); public static readonly Upgrade[] ModifierIncrease = RegisterTiers("ModifierIncrease", 3, 1, 1.5F, new Point(9, 3)); public static readonly Upgrade[] AutoPlaceModifiers = RegisterTiers("AutoPlaceModifiers", 2, 6, 1, new Point(10, 3)); - public static readonly Upgrade FerrisWheelModifier = Register(new Upgrade("FerrisWheelModifier", 1, new Point(2, 3))); - public static readonly Upgrade NatureModifier = Register(new Upgrade("NatureModifier", 1, new Point(8, 3))); - public static readonly Upgrade FoodCourtModifier = Register(new Upgrade("FoodCourtModifier", 2, new Point(1, 3))); - public static readonly Upgrade RollerCoasterModifier = Register(new Upgrade("RollerCoasterModifier", 2, new Point(3, 3))); - public static readonly Upgrade ManualRideModifier = Register(new Upgrade("ManualRideModifier", 2, new Point(4, 3))); - public static readonly Upgrade SpiralSlideModifier = Register(new Upgrade("SpiralSlideModifier", 2, new Point(5, 3))); - public static readonly Upgrade HauntedHouseModifier = Register(new Upgrade("HauntedHouseModifier", 2, new Point(7, 3))); + public static readonly Upgrade FerrisWheelModifier = Register(new NeighborModifierUpgrade("FerrisWheelModifier", 1, new Point(2, 3), FerrisWheel, 2)); + public static readonly Upgrade NatureModifier = Register(new ModifierUpgrade("NatureModifier", 1, new Point(8, 3), NonTechnology, 2)); + public static readonly Upgrade FoodCourtModifier = Register(new NeighborModifierUpgrade("FoodCourtModifier", 2, new Point(1, 3), FoodCourt, 2)); + public static readonly Upgrade RollerCoasterModifier = Register(new ModifierUpgrade("RollerCoasterModifier", 2, new Point(3, 3), FastCars, 2)); + public static readonly Upgrade ManualRideModifier = Register(new ModifierUpgrade("ManualRideModifier", 2, new Point(4, 3), Walking, 3)); + public static readonly Upgrade SpiralSlideModifier = Register(new NeighborModifierUpgrade("SpiralSlideModifier", 2, new Point(5, 3), SpiralSlide, 2)); + public static readonly Upgrade HauntedHouseModifier = Register(new NeighborModifierUpgrade("HauntedHouseModifier", 2, new Point(7, 3), HauntedHouse, 3, Relaxed)); public readonly string Name; public readonly int Price; @@ -33,6 +34,23 @@ namespace TouchyTickets { this.Dependencies = dependencies; } + public void OnApplied() { + // map size upgrades + if (MapSize.Contains(this)) { + var oldMap = GameImpl.Instance.Map; + GameImpl.Instance.Map = oldMap.Copy(oldMap.Width + 10, oldMap.Height + 10); + } + } + + public bool IsActive() { + return GameImpl.Instance.AppliedUpgrades.Contains(this); + } + + private static Upgrade Register(Upgrade upgrade) { + Upgrades.Add(upgrade.Name, upgrade); + return upgrade; + } + private static Upgrade[] RegisterTiers(string name, int amount, int startPrice, float priceIncrease, Point texture) { var ret = new Upgrade[amount]; for (var i = 0; i < amount; i++) { @@ -44,22 +62,5 @@ namespace TouchyTickets { return ret; } - public void OnApplied() { - // map size upgrades - if (MapSize.Contains(this)) { - var oldMap = GameImpl.Instance.Map; - GameImpl.Instance.Map = oldMap.Copy(oldMap.Width + 10, oldMap.Height + 10); - } - } - - private static Upgrade Register(Upgrade upgrade) { - Upgrades.Add(upgrade.Name, upgrade); - return upgrade; - } - - public bool IsActive() { - return GameImpl.Instance.AppliedUpgrades.Contains(this); - } - } } \ No newline at end of file