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(); } } }