removed external online services

This commit is contained in:
Ell 2023-03-04 10:50:45 +01:00
parent a1e8e684d0
commit 84e709a3f3
9 changed files with 10 additions and 271 deletions

View file

@ -1,21 +1,16 @@
using Android.App;
using Android.Content;
using Android.Content.PM;
using Android.Gms.Games;
using Android.OS;
using Android.Views;
using Android.Widget;
using GameAnalyticsSDK;
using Java.Lang;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Input;
using MLEM.Extensions;
using MLEM.Misc;
using TouchyTickets;
using static Android.Views.ViewGroup;
using Uri = Android.Net.Uri;
namespace Android;
namespace Android;
[Activity(
Label = "@string/app_name",
@ -30,18 +25,14 @@ public class Activity1 : AndroidGameActivity {
private GameImpl game;
private AndroidPlatform platform;
private LinearLayout mainView;
private View view;
protected override void OnCreate(Bundle bundle) {
base.OnCreate(bundle);
// ad layout
var adLayout = new LinearLayout(this) {Orientation = Orientation.Vertical};
adLayout.SetGravity(GravityFlags.Bottom);
// set up the game
MlemPlatform.Current = new MlemPlatform.Mobile(KeyboardInput.Show, l => this.StartActivity(new Intent(Intent.ActionView, Uri.Parse(l))));
this.platform = new AndroidPlatform(this, adLayout);
this.platform = new AndroidPlatform(this);
this.game = new GameImpl(this.platform);
this.game.GraphicsDeviceManager.ResetWidthAndHeight(this.game.Window);
this.game.GraphicsDeviceManager.IsFullScreen = true;
@ -59,30 +50,12 @@ public class Activity1 : AndroidGameActivity {
if (Build.VERSION.SdkInt >= BuildVersionCodes.P)
this.Window.Attributes.LayoutInDisplayCutoutMode = LayoutInDisplayCutoutMode.Never;
// total layout that is displayed
this.mainView = new LinearLayout(this) {Orientation = Orientation.Vertical};
this.mainView.LayoutParameters = new LinearLayout.LayoutParams(LayoutParams.MatchParent, LayoutParams.MatchParent);
this.mainView.AddView(gameView);
// height of 0 but high weight causes this element so scale based on the ad's height
gameView.LayoutParameters = new LinearLayout.LayoutParams(LayoutParams.MatchParent, 0, 1);
this.mainView.AddView(adLayout);
adLayout.LayoutParameters = new LinearLayout.LayoutParams(LayoutParams.MatchParent, LayoutParams.WrapContent);
this.SetContentView(this.mainView);
this.view = this.game.Services.GetService(typeof(View)) as View;
this.SetContentView(this.view);
this.game.Run();
}
protected override void OnActivityResult(int requestCode, Result result, Intent data) {
base.OnActivityResult(requestCode, result, data);
// Connect again after logging in to Google Play game services, but only if we haven't tried yet
try {
if (requestCode == AndroidPlatform.GooglePlayLoginRequest && (int) result != GamesActivityResultCodes.ResultSignInFailed)
this.platform.GoogleApi.Connect();
} catch (Exception e) {
GameAnalytics.NewErrorEvent(GAErrorSeverity.Error, "OnActivityResult " + e);
}
}
public override void OnWindowFocusChanged(bool hasFocus) {
base.OnWindowFocusChanged(hasFocus);
#pragma warning disable CS0618

View file

@ -13,8 +13,6 @@
<PackageReference Include="MonoGame.Content.Builder.Task" Version="3.8.1.303"/>
<PackageReference Include="MonoGame.Framework.Android" Version="3.8.1.303"/>
<PackageReference Include="Contentless" Version="3.0.7"/>
<PackageReference Include="GameAnalytics.Xamarin.SDK" Version="5.2.5"/>
<PackageReference Include="Xamarin.GooglePlayServices.Games" Version="123.1.0.1"/>
</ItemGroup>
<ItemGroup>

View file

@ -1,110 +1,17 @@
using System.Collections;
using System.Collections.Generic;
using Android.App;
using Android.Content;
using Android.Gms.Common.Apis;
using Android.Gms.Games;
using Android.Runtime;
using Android.Views;
using Android.Widget;
using GameAnalyticsSDK;
using GameAnalyticsSDK.Utilities;
using Java.Lang;
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<string, string> AchievementIds = new() {
{"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"},
{"1ExpTickets", "CgkI_Lyp7PcEEAIQDw"},
{"2ExpTickets", "CgkI_Lyp7PcEEAIQEA"},
{"3ExpTickets", "CgkI_Lyp7PcEEAIQEQ"},
{"4ExpTickets", "CgkI_Lyp7PcEEAIQEg"},
{"5ExpTickets", "CgkI_Lyp7PcEEAIQEw"},
{"6ExpTickets", "CgkI_Lyp7PcEEAIQFA"},
{"7ExpTickets", "CgkI_Lyp7PcEEAIQFQ"},
{"8ExpTickets", "CgkI_Lyp7PcEEAIQFg"},
{"9ExpTickets", "CgkI_Lyp7PcEEAIQFw"},
{"10ExpTickets", "CgkI_Lyp7PcEEAIQGA"}
};
private readonly Activity activity;
private readonly LinearLayout adLayout;
public GoogleApiClient GoogleApi { get; private set; }
public AndroidPlatform(Activity activity, LinearLayout adLayout) {
public AndroidPlatform(Activity activity) {
this.activity = activity;
this.adLayout = adLayout;
}
public override void SetupOnlineInteractions(Dictionary<string, object> analyticsJson) {
// Analytics
GameAnalytics.SetAutoDetectAppVersion(true);
GameAnalytics.Initialize(this.activity, GA_MiniJSON.Serialize(new Hashtable(analyticsJson)));
AndroidEnvironment.UnhandledExceptionRaiser += (_, args) => GameAnalytics.NewErrorEvent(GAErrorSeverity.Critical, args.Exception.ToString());
// TODO fix ads
// Ads
/*try {
var ad = new AdView(this.activity) {
AdUnitId = "ca-app-pub-5754829579653773/7841535920",
AdSize = AdSize.SmartBanner
};
ad.LoadAd(new AdRequest.Builder()
.AddTestDevice("14B965C6457E17D2808061ADF7E34923")
.Build());
this.adLayout.AddView(ad);
} catch (Exception e) {
GameAnalytics.NewErrorEvent(GAErrorSeverity.Error, "Ads " + e);
}*/
// TODO fix google play game services
/*// Google Play game services
try {
this.GoogleApi = new GoogleApiClient.Builder(this.activity)
.AddApi(GamesClass.API)
.AddScope(GamesClass.ScopeGames)
.AddOnConnectionFailedListener(res => {
if (res.HasResolution) {
res.StartResolutionForResult(this.activity, GooglePlayLoginRequest);
} else {
throw new GoogleApiClientConnectionException(res);
}
})
.Build();
this.GoogleApi.Connect();
} catch (Exception e) {
GameAnalytics.NewErrorEvent(GAErrorSeverity.Error, "GoogleApiClient " + e);
}*/
#if DEBUG
// Sanity check to ensure that all achievements are mapped
foreach (var achievement in Achievement.Achievements.Values) {
var _ = AndroidPlatform.AchievementIds[achievement.Name];
}
#endif
}
public override void AddResourceEvent(bool sink, string currency, float amount, string itemType, string itemId) {
GameAnalytics.NewResourceEvent(sink ? GAResourceFlowType.Sink : GAResourceFlowType.Source, currency, amount, itemType, itemId);
}
public override void SetKeepScreenOn(bool keep) {
@ -119,27 +26,4 @@ public class AndroidPlatform : Platform {
this.activity.StartActivity(new Intent(Intent.ActionView, Uri.Parse("https://play.google.com/store/apps/details?id=de.ellpeck.touchytickets")));
}
public override bool GainAchievement(Achievement achievement) {
try {
if (this.GoogleApi != null && this.GoogleApi.IsConnected) {
GamesClass.Achievements.Unlock(this.GoogleApi, AndroidPlatform.AchievementIds[achievement.Name]);
return true;
}
} catch (Exception e) {
GameAnalytics.NewErrorEvent(GAErrorSeverity.Error, "GainAchievement " + e);
}
return false;
}
public override void ShowAchievements() {
try {
if (this.GoogleApi == null || !this.GoogleApi.IsConnected)
return;
var intent = GamesClass.Achievements.GetAchievementsIntent(this.GoogleApi);
this.activity.StartActivityForResult(intent, AndroidPlatform.ShowAchievementsRequest);
} catch (Exception e) {
GameAnalytics.NewErrorEvent(GAErrorSeverity.Error, "ShowAchievements " + e);
}
}
}

View file

@ -1,60 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Numerics;
using Microsoft.Xna.Framework;
using TouchyTickets.Attractions;
namespace TouchyTickets;
public class Achievement {
public static readonly Dictionary<string, Achievement> Achievements = new();
static Achievement() {
foreach (var amount in new[] {1, 10, 100})
Achievement.Register(new Achievement($"{amount}Stars", g => g.Stars >= amount));
Achievement.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})
Achievement.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})
Achievement.Register(new Achievement($"{amount}Modifiers", g => g.Map.GetAttractionAmount(null) > 0 && g.Map.GetAttractions().All(a => a.Item2.GetModifierAmount(null) >= amount)));
for (var i = 1; i <= 10; i++) {
var amount = BigInteger.Pow(1000, i + 1);
Achievement.Register(new Achievement($"{i}ExpTickets", g => g.Tickets >= amount));
}
}
public readonly string Name;
private readonly Func<GameImpl, bool> 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<GameImpl, bool> condition) {
this.Name = name;
this.condition = condition;
}
public void Update() {
if (this.unlocked)
return;
if (!this.condition.Invoke(GameImpl.Instance))
return;
if (GameImpl.Instance.Platform.GainAchievement(this))
this.unlocked = true;
}
public static void Register(Achievement achievement) {
Achievement.Achievements.Add(achievement.Name, achievement);
}
}

View file

@ -44,7 +44,6 @@ public class AttractionModifier {
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;
}

View file

@ -27,7 +27,6 @@ public class GameImpl : MlemGame {
public DateTime LastUpdate;
public TimeSpan PlayTime;
private double saveCounter;
private double achievementCounter;
public GameImpl(Platform platform) {
this.Platform = platform;
@ -45,17 +44,6 @@ public class GameImpl : MlemGame {
}
private void LoadGame() {
// set up online stuff
var analytics = new Dictionary<string, object>();
analytics["InfoLog"] = true;
analytics["VerboseLog"] = true;
analytics["ResourceCurrencies"] = new[] {"Tickets", "Stars"};
analytics["ResourceItemTypes"] = new[] {"Attraction", "Restart", "Upgrade", "Modifier"};
// ios comes first, then android. For now they're the same
analytics["GameKey"] = new[] {"cc18de06eebbc5d5e987c384fcd28000", "cc18de06eebbc5d5e987c384fcd28000"};
analytics["SecretKey"] = new[] {"82ca1a930ee38e2383ffb02db7631e16033b511d", "82ca1a930ee38e2383ffb02db7631e16033b511d"};
this.Platform.SetupOnlineInteractions(analytics);
this.Tutorial = new Tutorial();
if (!SaveHandler.Load(this))
@ -82,14 +70,6 @@ public class GameImpl : MlemGame {
// 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) {

View file

@ -1,19 +1,10 @@
using System.Collections.Generic;
namespace TouchyTickets;
public abstract class Platform {
public abstract void SetupOnlineInteractions(Dictionary<string, object> analyticsJson);
public abstract void AddResourceEvent(bool sink, string currency, float amount, string itemType, string itemId);
public abstract void SetKeepScreenOn(bool keep);
public abstract void OpenRateLink();
public abstract bool GainAchievement(Achievement achievement);
public abstract void ShowAchievements();
}

View file

@ -5,9 +5,9 @@
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Coroutine" Version="2.1.4"/>
<PackageReference Include="MLEM.Startup" Version="6.1.0"/>
<PackageReference Include="Newtonsoft.Json" Version="13.0.2"/>
<PackageReference Include="Coroutine" Version="2.1.4" />
<PackageReference Include="MLEM.Startup" Version="6.1.0" />
<PackageReference Include="Newtonsoft.Json" Version="13.0.2" />
<PackageReference Include="MonoGame.Framework.DesktopGL" Version="3.8.1.303">
<PrivateAssets>all</PrivateAssets>
</PackageReference>

View file

@ -175,7 +175,6 @@ public class Ui {
ActionSound = new SoundEffectInfo(Assets.PlaceSound),
OnPressed = e2 => {
GameImpl.Instance.Tickets -= price;
GameImpl.Instance.Platform.AddResourceEvent(true, "Tickets", (float) price, "Attraction", attraction.Key);
map.Place(map.PlacingPosition, map.PlacingAttraction);
map.PlacingAttraction.Wobble();
@ -342,9 +341,6 @@ public class Ui {
this.uiSystem.Remove(e2.Root.Name);
var game = GameImpl.Instance;
game.Platform.AddResourceEvent(true, "Tickets", (float) game.Tickets, "Restart", "Restart" + game.TimesRestarted);
game.Platform.AddResourceEvent(false, "Stars", game.GetBuyableStars(), "Restart", "Restart" + game.TimesRestarted);
game.Stars += game.GetBuyableStars();
game.TimesRestarted++;
game.Tickets = 0;
@ -393,10 +389,6 @@ public class Ui {
}
}));
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 = _ => GameImpl.Instance.Platform.ShowAchievements()
});
optionList.AddChild(new Paragraph(Anchor.AutoCenter, 1, Localization.Get("OtherOptions"), true) {
PositionOffset = new Vector2(0, 10),
@ -553,22 +545,6 @@ public class Ui {
}
yield return new Wait(0.5);
var analyticsFlag = new FileInfo(Path.Combine(SaveHandler.GetGameDirectory(true).FullName, "_ReadGdpr"));
if (!analyticsFlag.Exists) {
var evt = new Event();
var panel = splash.AddChild(new Panel(Anchor.Center, new Vector2(0.8F), Vector2.Zero, true));
panel.AddChild(new Paragraph(Anchor.AutoLeft, 1, Localization.Get("GDPRInfo")));
panel.AddChild(new Button(Anchor.AutoLeft, new Vector2(1, 30), Localization.Get("Okay")) {
OnPressed = _ => {
// create the (empty) flag file
using (analyticsFlag.Create()) {}
splash.RemoveChild(panel);
CoroutineHandler.RaiseEvent(evt);
}
});
yield return new Wait(evt);
}
yield return new Wait(0.25);
loadGame();
yield return new Wait(0.25);
@ -699,8 +675,6 @@ public class Ui {
ActionSound = new SoundEffectInfo(Assets.BuySound),
OnPressed = _ => {
GameImpl.Instance.Stars -= upgrade.Price;
GameImpl.Instance.Platform.AddResourceEvent(true, "Stars", upgrade.Price, "Upgrade", upgrade.Name);
GameImpl.Instance.AppliedUpgrades.Add(upgrade);
upgrade.OnApplied();
Ui.PopulateUpgradeList(upgradeList);