/// <summary> /// Determines if the player has a free perk slot available /// </summary> public static bool HasFreeSlot(Player player) { if (!PerkTable.ContainsKey(player)) { return(true); } return(PerkTable[player].Item1 is Empty || PerkTable[player].Item2 is Empty); }
/// <summary> /// Determines if the player has the specified perk /// </summary> public static bool HasPerk(Player player, Perk perk) { if (!PerkTable.ContainsKey(player) || perk == null || perk is Empty) { return(false); } return(PerkTable[player].Item1.GetType() == perk.GetType() || (PerkTable[player].Item2.GetType() == perk.GetType())); }
/// <summary> /// Returns the set of perks belonging to the specified player /// </summary> public static Tuple <Perk, Perk> GetPerks(Player player) { if (!PerkTable.ContainsKey(player)) { return(Tuple.Create <Perk, Perk>(Empty, Empty)); } return(PerkTable[player]); }
/// <summary> /// Sets the player perk at the chosen position /// </summary> /// <returns>true if the perk could be assigned, false if the perk tree is full and overwriteExisting is false</returns> public static bool Set(Player player, Perk perk, PerkPosition position, bool overwriteExisting) { if (perk == null || !HasFreeSlot(player) || HasPerk(player, perk)) { return(false); } if (!PerkTable.ContainsKey(player)) { PerkTable[player] = Tuple.Create <Perk, Perk>(Perk.Empty, Perk.Empty); } if (!overwriteExisting) { if (position == PerkPosition.Primary && !(PerkTable[player].Item1 is Empty)) { position = PerkPosition.Secondary; } if (position == PerkPosition.Secondary && !(PerkTable[player].Item2 is Empty)) { if (PerkTable[player].Item1 is Empty) { position = PerkPosition.Primary; } else { return(false); } } } switch (position) { case PerkPosition.Primary: PerkTable[player] = Tuple.Create <Perk, Perk>(perk, PerkTable[player].Item2); break; case PerkPosition.Secondary: PerkTable[player] = Tuple.Create <Perk, Perk>(PerkTable[player].Item1, perk); break; } return(true); }
/// <summary> /// Gets a perk by type for a specific player /// </summary> /// <returns>instance of the <code>Perk</code> or <code>null</code> if the player does not have the type of Perk</returns> /// <typeparam name="T"><code>Perk</code> to retrieve from the player</typeparam> public static T GetByType <T>(Player player) where T : Perk { T perk = default(T); if (!PerkTable.ContainsKey(player)) { return(perk); } if (PerkTable[player].Item1 is T) { perk = (T)(object)PerkTable[player].Item1; } else if (PerkTable[player].Item2 is T) { perk = (T)(object)PerkTable[player].Item2; } return(perk); }
/// <summary> /// Gets a perk of the same type as given for the specified player /// </summary> /// <param name="player">the player to lookup</param> /// <param name="perk">the perk type to match</param> /// <returns>instance of the perk or null if the player does not have that perk</returns> public static Perk Get(Player player, Perk perk) { Perk res = null; if (!PerkTable.ContainsKey(player) || !HasPerk(player, perk)) { return(res); } if (PerkTable[player].Item1.GetType() == perk.GetType()) { res = PerkTable[player].Item1; } else if (PerkTable[player].Item2.GetType() == perk.GetType()) { res = PerkTable[player].Item2; } return(res); }
/// <summary> /// Removes the perk at the given position /// </summary> public static void Remove(Player player, PerkPosition position) { if (!PerkTable.ContainsKey(player)) { return; } switch (position) { case PerkPosition.Primary: PerkTable[player] = Tuple.Create <Perk, Perk>(Empty, PerkTable[player].Item2); break; case PerkPosition.Secondary: PerkTable[player] = Tuple.Create <Perk, Perk>(PerkTable[player].Item1, Empty); break; } if (PerkTable[player].Item1 is Empty && PerkTable[player].Item2 is Empty) { PerkTable.Remove(player); } }