using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using DominionBase.Cards;
using DominionBase.Players;
namespace DominionBase
{
public class TokenCollectionsChangedEventArgs : EventArgs
{
public enum Operation
{
Reset,
Added,
Removed
}
private TokenCollection _AddedTokens = new TokenCollection();
private TokenCollection _RemovedTokens = new TokenCollection();
private Operation _OperationPerformed;
public TokenCollection TokenCollection;
public Player Player = null;
public TokenCollection AddedTokens { get { return _AddedTokens; } }
public TokenCollection RemovedTokens { get { return _RemovedTokens; } }
public Operation OperationPerformed { get { return _OperationPerformed; } private set { _OperationPerformed = value; } }
public int Count { get { return this.TokenCollection.Count; } }
public TokenCollectionsChangedEventArgs(TokenCollection tokenCollection, Operation operation)
{
this.TokenCollection = tokenCollection;
this.OperationPerformed = operation;
}
public TokenCollectionsChangedEventArgs(TokenCollection tokenCollection, Operation operation, Token tokenChanged)
: this(tokenCollection, operation)
{
switch (operation)
{
case TokenCollectionsChangedEventArgs.Operation.Added:
_AddedTokens.Add(tokenChanged);
break;
case TokenCollectionsChangedEventArgs.Operation.Removed:
_RemovedTokens.Add(tokenChanged);
break;
}
}
public TokenCollectionsChangedEventArgs(TokenCollection tokenCollection, Operation operation, TokenCollection tokensChanged)
: this(tokenCollection, operation)
{
switch (operation)
{
case TokenCollectionsChangedEventArgs.Operation.Added:
_AddedTokens.AddRange(tokensChanged);
break;
case TokenCollectionsChangedEventArgs.Operation.Removed:
_RemovedTokens.AddRange(tokensChanged);
break;
}
}
public TokenCollectionsChangedEventArgs(TokenCollection tokenCollection, Player player, Operation operation)
: this(tokenCollection, operation)
{
this.Player = player;
}
public TokenCollectionsChangedEventArgs(TokenCollection tokenCollection, Player player, Operation operation, Token tokenChanged)
: this(tokenCollection, player, operation)
{
switch (operation)
{
case TokenCollectionsChangedEventArgs.Operation.Added:
_AddedTokens.Add(tokenChanged);
break;
case TokenCollectionsChangedEventArgs.Operation.Removed:
_RemovedTokens.Add(tokenChanged);
break;
}
}
public TokenCollectionsChangedEventArgs(TokenCollection tokenCollection, Player player, Operation operation, TokenCollection tokensChanged)
: this(tokenCollection, player, operation)
{
switch (operation)
{
case TokenCollectionsChangedEventArgs.Operation.Added:
_AddedTokens.AddRange(tokensChanged);
break;
case TokenCollectionsChangedEventArgs.Operation.Removed:
_RemovedTokens.AddRange(tokensChanged);
break;
}
}
}
public class TokenActionEventArgs : EventArgs
{
public Player Actor;
public Player Actee;
public Boolean Cancelled = false;
public Card ActingCard;
public TokenActionEventArgs(Player actor, Player actee, Card actingCard)
{
Actor = actor;
Actee = actee;
ActingCard = actingCard;
}
}
public abstract class Token
{
public delegate void TokenActionEventHandler(object sender, TokenActionEventArgs e);
private String _DisplayString = String.Empty;
private String _LongDisplayString = String.Empty;
public Token(String displayString, String longDisplayString) { _DisplayString = displayString; _LongDisplayString = longDisplayString; }
public String DisplayString { get { return _DisplayString; } }
public String LongDisplayString { get { return _LongDisplayString; } }
public virtual String Name { get { return this.GetType().Name; } }
public virtual String Title { get { return this.Name; } }
public virtual Boolean Buying(Table table, Player player) { return false; }
public virtual Boolean Gaining() { return false; }
public virtual Boolean ActDefined { get { return false; } }
public virtual Boolean IsTemporary { get { return false; } }
///
/// Used internally by the base Card class -- Don't use this.
///
///
///
internal virtual void Act(Card card, TokenActionEventArgs e)
{
}
///
/// Called when the Token should tear down any control -- used when it's not needed any more
///
internal virtual void TearDown()
{
}
}
public class TokenCollection : List
{
internal void TearDown()
{
foreach (Token token in this)
token.TearDown();
}
}
public class TokenCollections : Dictionary
{
public delegate void TokenCollectionsChangedEventHandler(object sender, TokenCollectionsChangedEventArgs e);
public event TokenCollectionsChangedEventHandler TokenCollectionsChanged;
public void Add(Token token)
{
Type t = token.GetType();
this[t].Add(token);
if (TokenCollectionsChanged != null)
{
TokenCollectionsChangedEventArgs tccea = new TokenCollectionsChangedEventArgs(this[t], TokenCollectionsChangedEventArgs.Operation.Added, token);
TokenCollectionsChanged(this, tccea);
}
}
internal void Add(Token token, Player player)
{
Type t = token.GetType();
this[t].Add(token);
if (TokenCollectionsChanged != null)
{
TokenCollectionsChangedEventArgs tccea = new TokenCollectionsChangedEventArgs(this[t], player, TokenCollectionsChangedEventArgs.Operation.Added, token);
TokenCollectionsChanged(this, tccea);
}
}
internal void TearDown()
{
foreach (TokenCollection tokens in this.Values)
tokens.TearDown();
}
}
}