TouchyTickets/TouchyTickets/GameImpl.cs
2020-06-02 15:49:46 +02:00

85 lines
2.8 KiB
C#

using System;
using System.Collections.Generic;
using System.Numerics;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
using MLEM.Cameras;
using MLEM.Extensions;
using MLEM.Font;
using MLEM.Startup;
using TouchyTickets.Attractions;
namespace TouchyTickets {
public class GameImpl : MlemGame {
public static GameImpl Instance { get; private set; }
public readonly ISet<Upgrade> AppliedUpgrades = new HashSet<Upgrade>();
public BigInteger Tickets;
public int TimesRestarted;
public int Stars;
public ParkMap Map;
public Camera Camera { get; private set; }
public Ui Ui { get; private set; }
public bool DrawMap;
public DateTime LastUpdate;
private double saveCounter;
public GameImpl() {
Instance = this;
}
protected override void LoadContent() {
base.LoadContent();
if (!SaveHandler.Load(this))
this.Map = new ParkMap(12, 12);
this.Ui = new Ui(this.UiSystem);
this.Camera = new Camera(this.GraphicsDevice) {
Scale = 5,
AutoScaleWithScreen = true,
AutoScaleReferenceSize = new Point(720, 1280),
MaxScale = 24,
MinScale = 2
};
}
protected override void DoUpdate(GameTime gameTime) {
base.DoUpdate(gameTime);
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
if (passed.TotalSeconds >= 1)
passed = new TimeSpan(passed.Ticks / 2);
this.Map.Update(gameTime, passed);
}
this.LastUpdate = now;
this.Ui.Update(gameTime);
// save every 3 seconds
this.saveCounter += gameTime.ElapsedGameTime.TotalSeconds;
if (this.saveCounter >= 3) {
this.saveCounter = 0;
SaveHandler.Save(this);
}
}
protected override void DoDraw(GameTime gameTime) {
this.GraphicsDevice.Clear(Color.Black);
if (this.DrawMap) {
this.SpriteBatch.Begin(SpriteSortMode.Deferred, null, SamplerState.PointClamp, transformMatrix: this.Camera.ViewMatrix);
this.Map.Draw(gameTime, this.SpriteBatch, Vector2.Zero, 1, 1, true, this.Camera.GetVisibleRectangle());
this.SpriteBatch.End();
}
base.DoDraw(gameTime);
}
public BigInteger GetStarPrice() {
return 1000000 * BigInteger.Pow(10, this.TimesRestarted / 2);
}
}
}