TouchyTickets/TouchyTickets/Attractions/AttractionModifier.cs

84 lines
3.1 KiB
C#
Raw Permalink Normal View History

2020-06-08 18:01:10 +02:00
using System;
using System.Collections.Generic;
using System.Runtime.Serialization;
using Microsoft.Xna.Framework;
2020-06-08 18:01:10 +02:00
using Newtonsoft.Json;
2020-06-11 01:18:06 +02:00
using static TouchyTickets.Attractions.AttractionFlags;
2020-06-08 18:01:10 +02:00
2023-02-11 10:16:42 +01:00
namespace TouchyTickets.Attractions;
2020-06-08 18:01:10 +02:00
2023-02-11 10:16:42 +01:00
[JsonConverter(typeof(Converter))]
public class AttractionModifier {
2020-06-08 18:01:10 +02:00
2023-02-11 10:16:42 +01:00
public static readonly Dictionary<string, AttractionModifier> Modifiers = new();
2020-06-08 18:01:10 +02:00
2023-02-11 10:16:42 +01:00
static AttractionModifier() {
AttractionModifier.Register(new AttractionModifier("Lubricant", 200, AttractionFlags.Cars | AttractionFlags.FastCars, 1.02F, new Point(0, 4)));
AttractionModifier.Register(new AttractionModifier("LouderMusic", 500, AttractionFlags.Relaxed, 1.03F, new Point(2, 4)));
AttractionModifier.Register(new AttractionModifier("SmallAds", 800, AttractionFlags.Small, 1.35F, new Point(5, 4)));
AttractionModifier.Register(new AttractionModifier("LongerQueue", 1000, AttractionFlags.All, 1.06F, new Point(1, 4)));
AttractionModifier.Register(new AttractionModifier("Bouncer", 1500, AttractionFlags.Walking, 1.2F, new Point(3, 4)));
AttractionModifier.Register(new AttractionModifier("OnRideCameras", 2500, AttractionFlags.FastCars, 1.1F, new Point(4, 4)));
}
2020-06-08 18:01:10 +02:00
2023-02-11 10:16:42 +01:00
public readonly string Name;
public readonly long InitialPrice;
public readonly Point Texture;
public readonly float Multiplier;
private readonly AttractionFlags affectedFlags;
public AttractionModifier(string name, long initialPrice, AttractionFlags affectedFlags, float multiplier, Point texture) {
this.Name = name;
this.InitialPrice = initialPrice;
this.affectedFlags = affectedFlags;
this.Texture = texture;
this.Multiplier = multiplier;
}
2020-06-08 18:01:10 +02:00
2023-02-11 10:16:42 +01:00
public bool IsAffected(Attraction attraction) {
return (attraction.Type.Flags & this.affectedFlags) != 0;
}
2020-07-08 16:04:44 +02:00
2023-02-11 10:16:42 +01:00
public bool Buy(Attraction attraction) {
var price = attraction.GetModifierPrice(this);
if (GameImpl.Instance.Tickets < price)
return false;
GameImpl.Instance.Tickets -= price;
attraction.ApplyModifier(this);
return true;
}
2020-06-08 18:01:10 +02:00
2023-02-11 10:16:42 +01:00
private static AttractionModifier Register(AttractionModifier type) {
AttractionModifier.Modifiers.Add(type.Name, type);
return type;
}
2020-06-08 18:01:10 +02:00
2023-02-11 10:16:42 +01:00
public class Converter : JsonConverter<AttractionModifier> {
2020-06-08 18:01:10 +02:00
2023-02-11 10:16:42 +01:00
public override void WriteJson(JsonWriter writer, AttractionModifier value, JsonSerializer serializer) {
if (value != null)
writer.WriteValue(value.Name);
}
2020-06-08 18:01:10 +02:00
2023-02-11 10:16:42 +01:00
public override AttractionModifier ReadJson(JsonReader reader, Type objectType, AttractionModifier existingValue, bool hasExistingValue, JsonSerializer serializer) {
return reader.Value != null ? AttractionModifier.Modifiers[reader.Value.ToString()] : null;
2020-06-08 18:01:10 +02:00
}
}
2023-02-11 10:16:42 +01:00
}
2020-06-08 18:01:10 +02:00
2023-02-11 10:16:42 +01:00
[DataContract]
public class ActiveModifier {
2020-06-08 18:01:10 +02:00
2023-02-11 10:16:42 +01:00
[DataMember]
public readonly AttractionModifier Modifier;
[DataMember]
public int Amount;
2020-06-08 18:01:10 +02:00
2023-02-11 10:16:42 +01:00
public ActiveModifier(AttractionModifier modifier, int amount) {
this.Modifier = modifier;
this.Amount = amount;
2020-06-08 18:01:10 +02:00
}
2023-02-11 10:16:42 +01:00
2020-06-08 18:01:10 +02:00
}