From 338810c62312401a9921405a105e05f11839319c Mon Sep 17 00:00:00 2001 From: Ellpeck Date: Tue, 21 Jul 2020 21:51:30 +0200 Subject: [PATCH] added achievements! --- Android/AndroidPlatform.cs | 46 ++++++++++++++ Ideas.md | 4 -- Media/Achievements/FullMap.png | Bin 0 -> 2887 bytes Media/Achievements/Modifiers.png | Bin 0 -> 2603 bytes Media/Achievements/OnlyNonTechnologyRides.png | Bin 0 -> 3025 bytes Media/Achievements/OnlyRelaxingRides.png | Bin 0 -> 2435 bytes Media/Achievements/OnlySmallRides.png | Bin 0 -> 2617 bytes Media/Achievements/OnlyWalkingRides.png | Bin 0 -> 2965 bytes Media/Achievements/Star.png | Bin 0 -> 2549 bytes Media/Achievements/Tickets.png | Bin 0 -> 2449 bytes TouchyTickets/Achievement.cs | 60 ++++++++++++++++++ TouchyTickets/GameImpl.cs | 12 +++- TouchyTickets/ParkMap.cs | 5 ++ TouchyTickets/Platform.cs | 4 ++ TouchyTickets/Ui.cs | 6 +- iOS/IosPlatform.cs | 8 +++ 16 files changed, 139 insertions(+), 6 deletions(-) create mode 100644 Media/Achievements/FullMap.png create mode 100644 Media/Achievements/Modifiers.png create mode 100644 Media/Achievements/OnlyNonTechnologyRides.png create mode 100644 Media/Achievements/OnlyRelaxingRides.png create mode 100644 Media/Achievements/OnlySmallRides.png create mode 100644 Media/Achievements/OnlyWalkingRides.png create mode 100644 Media/Achievements/Star.png create mode 100644 Media/Achievements/Tickets.png create mode 100644 TouchyTickets/Achievement.cs diff --git a/Android/AndroidPlatform.cs b/Android/AndroidPlatform.cs index ab876bd..6ec3779 100644 --- a/Android/AndroidPlatform.cs +++ b/Android/AndroidPlatform.cs @@ -8,6 +8,7 @@ using Android.Gms.Common; using Android.Gms.Common.Apis; using Android.Gms.Extensions; using Android.Gms.Games; +using Android.Gms.Games.Achievement; using Android.Runtime; using Android.Views; using Android.Widget; @@ -15,12 +16,40 @@ using Coroutine; using GameAnalyticsSDK; using GameAnalyticsSDK.Utilities; using TouchyTickets; +using Achievement = TouchyTickets.Achievement; using Uri = Android.Net.Uri; namespace Android { public class AndroidPlatform : Platform { public const int GooglePlayLoginRequest = 9001; + public const int ShowAchievementsRequest = 9002; + + private static readonly Dictionary AchievementIds = new Dictionary { + {"1Stars", "CgkI_Lyp7PcEEAIQAw"}, + {"10Stars", "CgkI_Lyp7PcEEAIQBA"}, + {"100Stars", "CgkI_Lyp7PcEEAIQBQ"}, + {"FullMap", "CgkI_Lyp7PcEEAIQBg"}, + {"OnlySmallRides", "CgkI_Lyp7PcEEAIQBw"}, + {"OnlyRelaxedRides", "CgkI_Lyp7PcEEAIQCA"}, + {"OnlyWalkingRides", "CgkI_Lyp7PcEEAIQCQ"}, + {"OnlyNonTechnologyRides", "CgkI_Lyp7PcEEAIQCg"}, + {"100Modifiers", "CgkI_Lyp7PcEEAIQCw"}, + {"500Modifiers", "CgkI_Lyp7PcEEAIQDA"}, + {"1000Modifiers", "CgkI_Lyp7PcEEAIQDQ"}, + {"5000Modifiers", "CgkI_Lyp7PcEEAIQDg"}, + {"1.00MTickets", "CgkI_Lyp7PcEEAIQDw"}, + {"1.00BTickets", "CgkI_Lyp7PcEEAIQEA"}, + {"1.00TTickets", "CgkI_Lyp7PcEEAIQEQ"}, + {"1.00QTickets", "CgkI_Lyp7PcEEAIQEg"}, + {"1.00QiTickets", "CgkI_Lyp7PcEEAIQEw"}, + {"1.00STickets", "CgkI_Lyp7PcEEAIQFA"}, + {"1.00SpTickets", "CgkI_Lyp7PcEEAIQFQ"}, + {"1.00OTickets", "CgkI_Lyp7PcEEAIQFg"}, + {"1.00NTickets", "CgkI_Lyp7PcEEAIQFw"}, + {"1.00DTickets", "CgkI_Lyp7PcEEAIQGA"} + }; + private readonly Activity activity; private readonly LinearLayout adLayout; public GoogleApiClient GoogleApi { get; private set; } @@ -59,6 +88,11 @@ namespace Android { }) .Build(); this.GoogleApi.Connect(); + + // Sanity check to ensure that all achievements are mapped + foreach (var achievement in Achievement.Achievements.Values) { + var _ = AchievementIds[achievement.Name]; + } } public override void AddResourceEvent(bool sink, string currency, float amount, string itemType, string itemId) { @@ -77,5 +111,17 @@ namespace Android { this.activity.StartActivity(new Intent(Intent.ActionView, Uri.Parse("https://play.google.com/store/apps/details?id=de.ellpeck.touchytickets"))); } + public override void GainAchievement(Achievement achievement) { + if (this.GoogleApi != null) + GamesClass.Achievements.Unlock(this.GoogleApi, AchievementIds[achievement.Name]); + } + + public override void ShowAchievements() { + if (this.GoogleApi == null) + return; + var intent = GamesClass.Achievements.GetAchievementsIntent(this.GoogleApi); + this.activity.StartActivityForResult(intent, ShowAchievementsRequest); + } + } } \ No newline at end of file diff --git a/Ideas.md b/Ideas.md index 149118f..797277d 100644 --- a/Ideas.md +++ b/Ideas.md @@ -8,10 +8,6 @@ # Achievements - Each award has a "gotten for the first time" achievement -- Getting the first star -- Filling each space on the map -- Only attractions of a certain type -- High amount of modifiers on each ride # More star upgrades - Upgrade that allows you to set park placement templates diff --git a/Media/Achievements/FullMap.png b/Media/Achievements/FullMap.png new file mode 100644 index 0000000000000000000000000000000000000000..da54adbcadae72e7a074030b5e21d96f9f67ce99 GIT binary patch literal 2887 zcmd5;Z%k8H9KEGx^&i%-EXG+ulVzRB2+TTLI%$Eh6%r|%F^khk(JTtfrjCKYX8VXH z5Cd^;EN-l|?*nFC!UUxbvUaXG!Ww+G@KUF&rLC;6_e$-*QCiyfZr>i?G;<%J`*iPz z`{A7PJHK=8#kZA;?Da3M2LNPOR+JwAAd9_bfwj-EN37+3iaj`=98i>je!IXAzy?lb zdFjCxU2y8=srPwX+h;_dwcm+WU^(x7as1nZhq89=+_0Ag%ydOx$M=)_7r`WpIi5aUP+9@j?rTcnxC93Dnk{L#s<66 zFdrM->Ji@Cwz}Fqg>QL&dmX&{w`m{IOQAF&F)>CyfkQ%W4>9xRgps$AqB=YAlatMX z+0>w*106ZtY~-C=TpaGDnmj8%>VLs~(r&kUWRGmYU~FA)`tRf0-HdC@xIl6?$73-s z4kt7^xM}Inn@~<-W-|`s20nNvLxx>uF&STmn(eT6`^P6~b zZ~1uGH2B7BQ-F=XnnseAP-0)obfPV zGa%O12Q`g|Ge%fmEoe{davfDE(aU=w9i>r7-{!1nY(8_)Peym0`N%`tEQjAQ+S_fT}JMDQ~4wLh#ny*ly#pFEto z)drkU^b{SG1dOUA?CJO1~SV~Zuv&BXkBObi}DA6fHGB#?yT z)7;|PDb=t6SB+ToHVs{kJxEWL3@L- z$gzy>wj+lUCamX>QdcnQ^WN}T^WE!P2i~8YSw6}7|5cFnlz@M?k9}dhY-d$n_Nyh( z-E4l(yY=SZ+`jwUZnxg`|Kr!_#lIb{H@;+MX!t*$fuTWxk%7Sx=*=b;1_l;R1_llx z1_l8Y1_lKW1_p--v{SIfu=c?7_w%Lh?*CX(UGo3?)$ZSm*?Fw@?=#=^|5LTQ+kf_H z#qDa(!>iAy+3(-G_vPPj@CHECGX5E5X@8&pd-5;5-%S1a@wqk| zZFl{@zSDVe{r}9_r;ok(cX|2C`SY)4ePizV3=G?W2w#{FE*RB1++|lcU*<1S`ugSv z^&dwMU;H`!+!j5hzjRTb53-DzpH|JLoz59!QNALD```)Oh zPoHdq>>QM=t9zOK&HFXW{TmE-N3$>YXIQj{w)q#QLttgd79aTyrC+|h`1h_^-u-)~ zb6p5o#X z`4^uCKF=Qbw(;_1^`2cN9}j)u%$%+tFL&3z=F!@VwF^#j)3>0;i0IQ_7)!&~#m%-; ze0%Wj?aS&6Js$=>yd3T>?G^`>aZg`ueJRW^X%M9Tg8$Q{7ymvUXKlQz9_XrzwQ07% zmdKI;Vst08O0#A^-pY literal 0 HcmV?d00001 diff --git a/Media/Achievements/OnlyNonTechnologyRides.png b/Media/Achievements/OnlyNonTechnologyRides.png new file mode 100644 index 0000000000000000000000000000000000000000..73bd7782953c04a6149c8ae527038d068c40cc83 GIT binary patch literal 3025 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 F(`Sg4LM#9P literal 0 HcmV?d00001 diff --git a/Media/Achievements/Tickets.png b/Media/Achievements/Tickets.png new file mode 100644 index 0000000000000000000000000000000000000000..f1316eafb18fdf7a91dab035100e532ee9d032d4 GIT binary patch literal 2449 zcmc&$ZAep57(VLKRj5&+QRXy62`c?ntkShIr`ar|NG+QLY6!J8&8)3mDI!c7!G4Hn z8r-lSmXY@5Y8w$E!<-Epes0rrc~^O_w&`uVyZ3bapu(j7& z%o2qzTe}PZ5So#mnhii8I}HTfU^cib-gwy%P?{~;4O&c5P5_o>W~2%aRn$-RKPVY@ zM0bwD^qujJ5{+q}Fd{a6Q}*r5nxj*}5u7&b)(1)5!uw7!@bW;oRfo zHkmgUTdqvUo2HK_8zzGFL|ttx&sG?~UbKkgvpq-58~OBB>E!}WvVu9`<)XIQ6ac1( zRRFAr10W_HfL%8LsElEu3fU}O;sC%|3IKQI!fgoKl4ufz%j8g2260CnJYxkfQ&)>2-E Achievements = new Dictionary(); + + static Achievement() { + foreach (var amount in new[] {1, 10, 100}) + Register(new Achievement($"{amount}Stars", g => g.Stars >= amount)); + Register(new Achievement("FullMap", g => { + for (var x = 0; x < g.Map.Width; x++) { + for (var y = 0; y < g.Map.Height; y++) { + if (g.Map.GetAttractionAt(new Point(x, y)) == null) + return false; + } + } + return true; + })); + foreach (var flag in new[] {AttractionFlags.Small, AttractionFlags.Relaxed, AttractionFlags.Walking, AttractionFlags.NonTechnology}) + Register(new Achievement($"Only{flag}Rides", g => g.Map.GetAttractionAmount(null) >= 100 && g.Map.GetAttractions().All(a => a.Item2.Type.Flags.HasFlag(flag)))); + foreach (var amount in new[] {100, 500, 1000, 5000}) + Register(new Achievement($"{amount}Modifiers", g => g.Map.GetAttractions().All(a => a.Item2.GetModifierAmount(null) >= amount))); + for (var i = 1; i <= 10; i++) { + var amount = BigInteger.Pow(1000, i + 1); + Register(new Achievement($"{Ui.PrettyPrintNumber(amount).Replace(" ", "")}Tickets", g => g.Tickets >= amount)); + } + } + + public readonly string Name; + private readonly Func condition; + // this value doesn't save between game runs, since achievements + // are only displayed inside of the respective stores anyway + private bool unlocked; + + public Achievement(string name, Func condition) { + this.Name = name; + this.condition = condition; + } + + public void Update() { + if (this.unlocked) + return; + if (!this.condition.Invoke(GameImpl.Instance)) + return; + GameImpl.Instance.Platform.GainAchievement(this); + this.unlocked = true; + } + + public static void Register(Achievement achievement) { + Achievements.Add(achievement.Name, achievement); + } + + } +} \ No newline at end of file diff --git a/TouchyTickets/GameImpl.cs b/TouchyTickets/GameImpl.cs index 875ab75..0577e80 100644 --- a/TouchyTickets/GameImpl.cs +++ b/TouchyTickets/GameImpl.cs @@ -25,6 +25,7 @@ namespace TouchyTickets { public DateTime LastUpdate; public TimeSpan PlayTime; private double saveCounter; + private double achievementCounter; public GameImpl(Platform platform) { this.Platform = platform; @@ -78,6 +79,15 @@ namespace TouchyTickets { if (this.Map != null) { // update the map this.UpdateMapOnce(); + + // achievements + this.achievementCounter += gameTime.ElapsedGameTime.TotalSeconds; + if (this.achievementCounter >= 5) { + this.achievementCounter = 0; + foreach (var achievement in Achievement.Achievements.Values) + achievement.Update(); + } + // save every 3 seconds this.saveCounter += gameTime.ElapsedGameTime.TotalSeconds; if (this.saveCounter >= 3) { @@ -122,7 +132,7 @@ namespace TouchyTickets { if (this.LastUpdate != default) { var lastTickets = this.Tickets; var lastTps = this.Map.TicketsPerSecond; - + var passed = now - this.LastUpdate; this.Map.Update(passed, passed.TotalSeconds >= 1); diff --git a/TouchyTickets/ParkMap.cs b/TouchyTickets/ParkMap.cs index 7bf4daf..87f228e 100644 --- a/TouchyTickets/ParkMap.cs +++ b/TouchyTickets/ParkMap.cs @@ -234,6 +234,11 @@ namespace TouchyTickets { return this.attractions.Any(a => modifier.IsAffected(a.Item2)); } + public IEnumerable<(Point, Attraction)> GetAttractions() { + foreach (var attraction in this.attractions) + yield return attraction; + } + public bool IsInBounds(Point pos) { return pos.X >= 0 && pos.Y >= 0 && pos.X < this.Width && pos.Y < this.Height; } diff --git a/TouchyTickets/Platform.cs b/TouchyTickets/Platform.cs index 00db7d3..9abe5bc 100644 --- a/TouchyTickets/Platform.cs +++ b/TouchyTickets/Platform.cs @@ -11,5 +11,9 @@ namespace TouchyTickets { public abstract void OpenRateLink(); + public abstract void GainAchievement(Achievement achievement); + + public abstract void ShowAchievements(); + } } \ No newline at end of file diff --git a/TouchyTickets/Ui.cs b/TouchyTickets/Ui.cs index 1596e3b..32ab019 100644 --- a/TouchyTickets/Ui.cs +++ b/TouchyTickets/Ui.cs @@ -393,6 +393,10 @@ namespace TouchyTickets { } })); num.PositionOffset = new Vector2(0, 1); + optionList.AddChild(new Button(Anchor.AutoLeft, new Vector2(1, 30), Localization.Get("Achievements")) { + PositionOffset = new Vector2(0, 1), + OnPressed = e => GameImpl.Instance.Platform.ShowAchievements() + }); optionList.AddChild(new Paragraph(Anchor.AutoCenter, 1, Localization.Get("OtherOptions"), true) { PositionOffset = new Vector2(0, 10), @@ -733,7 +737,7 @@ namespace TouchyTickets { element.Transform = Matrix.Identity; } - private static string PrettyPrintNumber(BigInteger number) { + public static string PrettyPrintNumber(BigInteger number) { for (var i = 0; i < Localization.NumberFormat.Count; i++) { if (number < ExpoNums[i]) return number.ToString(Localization.NumberFormat[i]); diff --git a/iOS/IosPlatform.cs b/iOS/IosPlatform.cs index 7bb03ed..b3b4374 100644 --- a/iOS/IosPlatform.cs +++ b/iOS/IosPlatform.cs @@ -20,5 +20,13 @@ namespace iOS { throw new System.NotImplementedException(); } + public override void GainAchievement(Achievement achievement) { + throw new System.NotImplementedException(); + } + + public override void ShowAchievements() { + throw new System.NotImplementedException(); + } + } } \ No newline at end of file