From 003c9c2a4b22ccf2f6ab9ca6db58c2f1a31fc9eb Mon Sep 17 00:00:00 2001 From: Ellpeck Date: Wed, 8 Jul 2020 16:04:44 +0200 Subject: [PATCH] added modifier upgrades --- Ideas.md | 6 +-- TouchyTickets/Attractions/Attraction.cs | 2 +- .../Attractions/AttractionModifier.cs | 10 ++++ .../Content/Localization/Localization.json | 9 ++++ TouchyTickets/Content/Textures/Ui.aseprite | Bin 3493 -> 3588 bytes TouchyTickets/Content/Textures/Ui.png | Bin 5609 -> 5692 bytes TouchyTickets/GameImpl.cs | 36 ++++++++------- TouchyTickets/Options.cs | 6 +++ TouchyTickets/ParkMap.cs | 43 +++++++++++++++++- TouchyTickets/Ui.cs | 39 +++++++++++++--- TouchyTickets/Upgrade.cs | 1 + 11 files changed, 122 insertions(+), 30 deletions(-) diff --git a/Ideas.md b/Ideas.md index 223604e..149118f 100644 --- a/Ideas.md +++ b/Ideas.md @@ -17,10 +17,6 @@ - Upgrade that allows you to set park placement templates - Multiple levels, each level allows more rides to be put into the template - When a new park is started, the template is automatically populated as soon as there are enough tickets -- Upgrade that increases the amount of modifiers on each ride - - Advanced version that adds modifiers to each ride automatically, regardless of whether they already contain them # Gameplay options -- Edit park templates -- Set the minimum amount of tickets required for auto-buyers of any kind to take effect -- Set the amount of time between auto-buy attempts \ No newline at end of file +- Edit park templates \ No newline at end of file diff --git a/TouchyTickets/Attractions/Attraction.cs b/TouchyTickets/Attractions/Attraction.cs index e4c1b9c..fd05ee8 100644 --- a/TouchyTickets/Attractions/Attraction.cs +++ b/TouchyTickets/Attractions/Attraction.cs @@ -28,7 +28,7 @@ namespace TouchyTickets.Attractions { this.Type = type; } - public double Update(GameTime time, TimeSpan passed, ParkMap map, Point position) { + public double Update(TimeSpan passed, ParkMap map, Point position) { var genRate = this.GetGenerationRate(map, position); // apply generation rate to ticket amount this.ticketPercentage += genRate * passed.TotalSeconds; diff --git a/TouchyTickets/Attractions/AttractionModifier.cs b/TouchyTickets/Attractions/AttractionModifier.cs index 29e11ac..738776e 100644 --- a/TouchyTickets/Attractions/AttractionModifier.cs +++ b/TouchyTickets/Attractions/AttractionModifier.cs @@ -39,6 +39,16 @@ namespace TouchyTickets.Attractions { return (attraction.Type.Flags & this.affectedFlags) != 0; } + public bool Buy(Attraction attraction) { + var price = attraction.GetModifierPrice(this); + if (GameImpl.Instance.Tickets < price) + return false; + GameImpl.Instance.Tickets -= price; + GameImpl.Instance.Platform.AddResourceEvent(true, "Tickets", (float) price, "Modifier", this.Name); + attraction.ApplyModifier(this); + return true; + } + private static AttractionModifier Register(AttractionModifier type) { Modifiers.Add(type.Name, type); return type; diff --git a/TouchyTickets/Content/Localization/Localization.json b/TouchyTickets/Content/Localization/Localization.json index 347ceb1..a718898 100644 --- a/TouchyTickets/Content/Localization/Localization.json +++ b/TouchyTickets/Content/Localization/Localization.json @@ -22,6 +22,11 @@ "Rate": "Rate", "Attractions": "Attractions", "Modifiers": "Modifiers", + "GameplayOptions": "Gameplay", + "OtherOptions": "Other", + "AutoBuyEnabled": "Auto-Buying Enabled", + "MinTicketsForAutoBuy": "Min Tickets for Auto-Buying", + "AutoBuyInterval": "Auto-Buying Interval/s", "----- Tutorial -----": "", "Tutorial1": "Hi! Welcome to Touchy Tickets. To start the game, simply tap the ticket booth to sell a . Start by racking up 50!", "Tutorial2": "Great! Now, you can buy your first attraction. Access the menu on the right by swiping and purchase a carousel.", @@ -89,6 +94,10 @@ "ModifierIncrease2Description": "Increases the amount of ride modifiers placed at once to 5.", "ModifierIncrease3": "Modified Most", "ModifierIncrease3Description": "Increases the amount of ride modifiers placed at once to 10.", + "AutoPlaceModifiers1": "Magically Modified", + "AutoPlaceModifiers1Description": "More modifiers will automatically be bought for rides that already have them. Limits can be set in the Options screen.", + "AutoPlaceModifiers2": "Mighty Modified", + "AutoPlaceModifiers2Description": "More modifiers will automatically be bought for rides, even if they don't have them yet. Limits can be set in the Options screen.", "FoodCourtModifier": "Tasty Treats", "FoodCourtModifierDescription": "Doubles sales for all attractions adjacent to food courts.", "FerrisWheelModifier": "Crowded Pods", diff --git a/TouchyTickets/Content/Textures/Ui.aseprite b/TouchyTickets/Content/Textures/Ui.aseprite index 5c0d65a888f4e180eab5b17f3b7b5f2be8c8de09..a269a909822bd25384ea93d8fc93e4eda4257417 100644 GIT binary patch delta 3108 zcmV+<4BPXi8-yGJ1P+k`egTBBfrtTr`wIX71t0(b00031{{jF200000006H5P5^kE z?VVk09Y-044Hw+>ic%ER)CBTx66eQ9wu$S;wGtUq<4{tEHh@w@5ET}Z1s7b98*){N zh6qYQP%5I7Ql$!ks5MlesEt5^h(-#akgB4QDsCbq#9c4oX6U=+J^K84W_I>}@BFym zE4|v8**&{^b{~J|o7p)&0|TqIwCRJc340D@GSw<@wtWA`Yjro+z5epMOC59nh5-l1 z%BJ2ExjnakJTqe^>t);W_?}b0ja*SVcOQ-S+X2~w&Eb27lZ`tc>YEJqyzX|);CAZ_P-R{b-4mnw8n=FU81*7El z&0C9^CBJzLgH^Ek<||KRX1t}zb6wZlRFCB6dez)ErA;3nJc3IZcTv}W_QhSvEV=#H ztMAP$<8L0rN?m~~&iaQ5-r987+F%#vGf>$?VI z_n$AE%uIG=-Pr9d>9K_-^WD&xLtflvol9TdAo(S$n%mfQAiEH9g#Wzylgz9eyS*oV zu0Q(Op~n6BsXJHYy|M9s1ahjEq4y%k7bMH6{WZo~nC!~7I{_^##_ZAJNIjv#q8c6(RM8OZK`UvIVT;}7kR9K0*aXy~po{wHOZU-e1XdtpQ-HnwrP^xSU)VbPAU{{josdVlxA15=Zl{{E_GWs z*fqWL$z?z+3lo_ zT~i$bN1q%U>ZpxfQ(fvLzs9YpZdHB8mFjN4Pt)3eQ|skSjPQxlT^qXwMC{wGb! z|E=-08@r|^B)_i~`;J=P_t#?E7`vt>WI2PWUlsemc6oV1YK~#-nwn6jo~w2HeVW$3 zem*kd;BKFXsdKvbE8E@3vHqTuPj2hr_x#qaj;`zcOw9<~hWJh8dhz~g7b{6)0uCbITPgf`7iBrMO^J2Ru}Vk-@2_^wm3LcZ(5fwU2-9Z zUh}}SUvMz_#FA}vjO(+Xo_Amp%R7gsvt_6(+vGkTY_%Nxoyoz<*QyG$5IA)=Za5it zS(n>Ab##v_*H4Pd*AmT z@^UTrK_-_UKGI%>%Ce2G2d{HGcV<36H{_lue8yt-C*1>fS*6n&-9=qdXV=LH2J;ZK* z>~}pwOW%I-xDD|uV{0hx`nZ<+(D5|Yd_CAb{juQ{PPxwzb6PN}KPzamo09)BSCDa+ zWil+cCnw-jmUUh8q|d*-zqi{5v z{F2=Z7cOL$yvjDsF5@bfvtt{*_dhRx?jnxrJRntIS3Bi(vOh+4=TAKpWjBvsGRl}M zu8&ug^>{*mUe2Jm_uU8T;&absoHFKyxP{0C_>^T`*F5>gM9^L& z?$*sNn5EIia)@0WcX{t$``cgIX6#MLcV&JcmyE+cc6EFW=D&h#xewV_3!OjLmtmK@ z>N@W|$~tF|xr59ZQn>xzV~=IqfLA)SJ-I+%OqO+B^F--$N{zd`=5qXh##h$$5W8UX z`73|OOm=nM_x>4oZ(jb{s{2k~f8mLY-MqX(=D0Hc#>N>|#Mhj0hY-7P-uW}H(C6@r zUtV;-{_RU`KmF5ZRx-K#r}Wi|aGN5I*}ie*K$3l9y!xELW}bP?@7TB}^Z8>( zf@N7p>C^=$cn>~CJoEbFnji)G%uk8umh*vmXY@*83|Wqd*N;5&Za`SWjI zzYgrKziY5<$*#P&vA797V-8(2swlS*#%hbQn=-yTv~`nf?cU*HZMcqP6HJE6x*qGR zky$>IkoC~Hl1JS8ka6#ejPL5aA#Z$FjxV(PZh>~$S7ZMJeU!X^^N+FXi@TcB)aMOF zp9h!WmI90Cey}&mbv~CUIvz=LPN#35Ri3Ni9{>CIPkN1epRy0|iC7C(v1C2;T+KJW z(6*URk=02E#CWEzdN(SMcFN?P#-5`zD|E0<(+?Mj11!n+Ew09)%gsj z;;Jj|c1!(!{w7nus+;pSsrjjKC*Ab%Ox;zL`IB|b-<+D7a(Nyd9Zfnn@XF`M#_rly z)%lZE=Wjw_b7p47O;1l}%Y}u7%&cRX$}YLp^B?jwF)`tP=+xJQG<))#gRAbx6jzn` zlTg+9n-JKQ+#WxEJhS9CmEDVvpKNoBa^ChsLqkqlK9hpwx|HM3op{Q9@$8>6Pb{7? zej8NT`IA)D`J0f8yPDl1ahLNBz$_e^10e+_TW{q{I0vwb<4L0p>wN6$=QoGGwVW~g z@Q*HMMj35?vDcW&D>RQMReJs=+x7g{*gj<3#avV73@E3@T`;Wqr@sASW|U>_VBf#4S9P%K>x+fTzJ2I?m-D5IS8yguNGrha>}@WD|yaimw7IhW z^M^8C;Ro++Wp%EX^QBGI6`DU;r)1vXThF*Fxuxgl=aa`7*f*1TZj*gA9X}tLo6K0n za`Wte`pn=t_8L=pRf)TD{-#{Ybx;bs93S(sTV$L8%(9->PlM_jBRhQf@T23y+cS2t z1hX*8SeJM1rs66)f6~`S3-!;yaZ0|+F$T#k+KR;8qU_cwFzR!sj{iNrD)-A?jr>YU2XpDgkWEpLny3|yu-c0O`kEY@b~fBg@!$q`X{5ud#P delta 3012 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 GEI_a0fPc;a diff --git a/TouchyTickets/Content/Textures/Ui.png b/TouchyTickets/Content/Textures/Ui.png index d862bc94e354482ac1f717743e507481a46eb29c..4428b2f9289997f3593ecca8a691b3bbe8d6c996 100644 GIT binary patch literal 5692 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 YwX*a+dR6s#?#UElXnqHK%Q^c001i(negFUf delta 5353 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 diff --git a/TouchyTickets/GameImpl.cs b/TouchyTickets/GameImpl.cs index e9dd9ea..3a58ded 100644 --- a/TouchyTickets/GameImpl.cs +++ b/TouchyTickets/GameImpl.cs @@ -68,28 +68,17 @@ namespace TouchyTickets { MaxScale = 24, MinScale = 2 }; + + // update the map once to make sure that catching up happens during loading + this.UpdateMapOnce(); } protected override void DoUpdate(GameTime gameTime) { base.DoUpdate(gameTime); if (this.Map != null) { - var now = DateTime.Now; - if (this.LastUpdate != default) { - var passed = now - this.LastUpdate; - // if more than 1 second passed, the app is minimized or a save was loaded, so we penalize - var toSimulate = passed.TotalSeconds >= 1 ? new TimeSpan(passed.Ticks / 2) : passed; - - var lastTickets = this.Tickets; - this.Map.Update(gameTime, toSimulate); - var generated = this.Tickets - lastTickets; - - // if 10 or more seconds passed, we display a message - if (Options.Instance.WhileYouWereAwayMessage && passed.TotalSeconds >= 10 && generated > 0) - Ui.DisplayWhileYouWereAway(passed, generated); - } - this.LastUpdate = now; - + // update the map + this.UpdateMapOnce(); // save every 3 seconds this.saveCounter += gameTime.ElapsedGameTime.TotalSeconds; if (this.saveCounter >= 3) { @@ -129,5 +118,20 @@ namespace TouchyTickets { return (int) BigInteger.Min(3, this.Tickets / this.GetStarPrice()); } + private void UpdateMapOnce() { + var now = DateTime.Now; + if (this.LastUpdate != default) { + var lastTickets = this.Tickets; + var passed = now - this.LastUpdate; + this.Map.Update(passed, passed.TotalSeconds >= 1); + var generated = this.Tickets - lastTickets; + + // if 10 or more seconds passed, we display a message + if (Options.Instance.WhileYouWereAwayMessage && passed.TotalSeconds >= 10 && generated > 0) + Ui.DisplayWhileYouWereAway(passed, generated); + } + this.LastUpdate = now; + } + } } \ No newline at end of file diff --git a/TouchyTickets/Options.cs b/TouchyTickets/Options.cs index 8f16205..9ecce2c 100644 --- a/TouchyTickets/Options.cs +++ b/TouchyTickets/Options.cs @@ -31,6 +31,12 @@ namespace TouchyTickets { } } private bool keepScreenOn; + [DataMember] + public bool AutoBuyEnabled = true; + [DataMember] + public int MinTicketsForAutoBuy = 50000; + [DataMember] + public float AutoBuyIntervalSecs = 60; public static void Save() { var file = GetOptionsFile(true); diff --git a/TouchyTickets/ParkMap.cs b/TouchyTickets/ParkMap.cs index 29eacfb..657e06d 100644 --- a/TouchyTickets/ParkMap.cs +++ b/TouchyTickets/ParkMap.cs @@ -33,6 +33,7 @@ namespace TouchyTickets { public Point PlacingPosition; public Point? SelectedPosition; private bool draggingAttraction; + private TimeSpan autoBuyCounter; public ParkMap(int width, int height) { this.Width = width; @@ -68,15 +69,29 @@ namespace TouchyTickets { } } - public void Update(GameTime time, TimeSpan passed) { + public void Update(TimeSpan passed, bool wasAway) { + var toSimulate = wasAway ? new TimeSpan(passed.Ticks / 2) : passed; + + // handle auto-buying + this.autoBuyCounter += toSimulate; + if (this.autoBuyCounter.TotalSeconds >= Options.Instance.AutoBuyIntervalSecs) { + this.autoBuyCounter = TimeSpan.Zero; + this.TryAutoBuy(); + } + + // update tickets this.TicketsPerRide.Clear(); this.TicketsPerSecond = 0; foreach (var (pos, attraction) in this.attractions) { - var genPerSecond = attraction.Update(time, passed, this, pos); + var genPerSecond = attraction.Update(toSimulate, this, pos); // store ride statistics this.TicketsPerRide.TryGetValue(attraction.Type, out var curr); this.TicketsPerRide[attraction.Type] = curr + genPerSecond; this.TicketsPerSecond += genPerSecond; + + // after each attraction has sold their tickets, try auto-buying again if we were away + if (wasAway && passed.TotalSeconds >= Options.Instance.AutoBuyIntervalSecs) + this.TryAutoBuy(); } // map movement @@ -229,5 +244,29 @@ namespace TouchyTickets { return newMap; } + private void TryAutoBuy() { + if (!Options.Instance.AutoBuyEnabled) + return; + while (GameImpl.Instance.Tickets >= Options.Instance.MinTicketsForAutoBuy) { + var success = false; + + // auto-buy modifiers + if (Upgrade.AutoPlaceModifiers[0].IsActive()) { + foreach (var modifier in AttractionModifier.Modifiers.Values) { + var match = this.attractions.Select(pa => pa.Item2).Where(modifier.IsAffected); + // if we don't have level 2, we only want to increase existing modifiers + if (!Upgrade.AutoPlaceModifiers[1].IsActive()) + match = match.Where(a => a.GetModifierAmount(modifier) > 0); + var attraction = match.OrderBy(a => a.GetModifierAmount(modifier)).FirstOrDefault(); + if (attraction != null && modifier.Buy(attraction)) + success = true; + } + } + + if (!success) + break; + } + } + } } \ No newline at end of file diff --git a/TouchyTickets/Ui.cs b/TouchyTickets/Ui.cs index 1f7680e..177737b 100644 --- a/TouchyTickets/Ui.cs +++ b/TouchyTickets/Ui.cs @@ -255,12 +255,8 @@ namespace TouchyTickets { } for (var i = 0; i < placeAmount; i++) { - var price = attraction.GetModifierPrice(map.PlacingModifier); - if (GameImpl.Instance.Tickets < price) + if (!map.PlacingModifier.Buy(attraction)) break; - GameImpl.Instance.Tickets -= price; - GameImpl.Instance.Platform.AddResourceEvent(true, "Tickets", (float) price, "Modifier", modifier.Name); - attraction.ApplyModifier(map.PlacingModifier); } attraction.Wobble(); }, @@ -376,6 +372,37 @@ namespace TouchyTickets { ChildPadding = new Padding(5, 15, 5, 5), PreventParentSpill = true }); + + optionList.AddChild(new Paragraph(Anchor.AutoCenter, 1, Localization.Get("GameplayOptions"), true) { + TextScale = 0.12F + }); + optionList.AddChild(new Checkbox(Anchor.AutoLeft, new Vector2(1, 20), Localization.Get("AutoBuyEnabled"), Options.Instance.AutoBuyEnabled) { + OnCheckStateChange = (e, value) => { + Options.Instance.AutoBuyEnabled = value; + Options.Save(); + }, + PositionOffset = new Vector2(0, 1) + }); + optionList.AddChild(new Paragraph(Anchor.AutoLeft, 1, Localization.Get("MinTicketsForAutoBuy"))); + var num = optionList.AddChild(ElementHelper.NumberField(Anchor.AutoLeft, new Vector2(1, 20), Options.Instance.MinTicketsForAutoBuy, 1000, null, (t, value) => { + if (int.TryParse(value, out Options.Instance.MinTicketsForAutoBuy)) + Options.Save(); + })); + num.PositionOffset = new Vector2(0, 1); + optionList.AddChild(new Paragraph(Anchor.AutoLeft, 1, p => Localization.Get("AutoBuyInterval") + ": " + Options.Instance.AutoBuyIntervalSecs)); + optionList.AddChild(new Slider(Anchor.AutoLeft, new Vector2(1, 20), 10, 299) { + PositionOffset = new Vector2(0, 1), + CurrentValue = Options.Instance.AutoBuyIntervalSecs - 1, + OnValueChanged = (s, v) => { + Options.Instance.AutoBuyIntervalSecs = (int) v + 1; + Options.Save(); + } + }); + + optionList.AddChild(new Paragraph(Anchor.AutoCenter, 1, Localization.Get("OtherOptions"), true) { + PositionOffset = new Vector2(0, 10), + TextScale = 0.12F + }); optionList.AddChild(new Paragraph(Anchor.AutoLeft, 1, p => Localization.Get("RainingTicketLimit") + ": " + Options.Instance.RainingTicketLimit)); optionList.AddChild(new Slider(Anchor.AutoLeft, new Vector2(1, 20), 10, 500) { PositionOffset = new Vector2(0, 1), @@ -499,7 +526,7 @@ namespace TouchyTickets { uiSystem.AutoScaleWithScreen = true; uiSystem.AutoScaleReferenceSize = new Point(720, 1280); uiSystem.Style.Font = new GenericSpriteFont(Assets.Font); - uiSystem.Style.PanelTexture = uiSystem.Style.ScrollBarBackground = uiSystem.Style.CheckboxTexture = new NinePatch(Assets.UiTexture[2, 1], 4); + uiSystem.Style.PanelTexture = uiSystem.Style.TextFieldTexture = uiSystem.Style.ScrollBarBackground = uiSystem.Style.CheckboxTexture = new NinePatch(Assets.UiTexture[2, 1], 4); uiSystem.Style.ButtonTexture = uiSystem.Style.ScrollBarScrollerTexture = new NinePatch(Assets.UiTexture[3, 1], 4); uiSystem.Style.CheckboxCheckmark = Assets.UiTexture[4, 1]; uiSystem.Style.TextScale = 0.1F; diff --git a/TouchyTickets/Upgrade.cs b/TouchyTickets/Upgrade.cs index cfc2cc1..a52ccb5 100644 --- a/TouchyTickets/Upgrade.cs +++ b/TouchyTickets/Upgrade.cs @@ -12,6 +12,7 @@ namespace TouchyTickets { public static readonly Upgrade[] MapSize = RegisterTiers("MapSize", 5, 1, 1, new Point(0, 3)); 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)));