public static void ShieldBreakerUntilEnd(Card source, int shieldBreaker, Func <Creature[]> args) { Creature[] allCreatures = args(); int[] shieldMemory = new int[allCreatures.Length]; for (int i = 0; i < allCreatures.Length; i++) { shieldMemory[i] = allCreatures[i].ShieldBreaker; if (shieldBreaker > allCreatures[i].ShieldBreaker) { allCreatures[i].ShieldBreaker = shieldBreaker; } } Game.DuelistEventHandler a = null; a = (game, duelist) => { for (int i = 0; i < allCreatures.Length; i++) { if (shieldMemory[i] > allCreatures[i].ShieldBreaker) { allCreatures[i].ShieldBreaker = shieldMemory[i]; } } source.Owner.Game.DuelistTurnEnded -= a; }; source.Owner.Game.DuelistTurnEnded += a; }
public static void AttackEachTurnIfAble(Creature source) { Game game = source.Owner.Game; bool attacked = false; Duelist.DuelistEventHandler setHasAttackedToFalse = (duelist) => { attacked = false; }; Game.AttackEventHandler setHasAttackedToTrue = (g, atking) => { if (atking == source) { attacked = true; } }; Game.DuelistEventHandler attack = (g, d) => { foreach (Duelist duelist in game.Duelists) { if (attacked) { return; } if (source.Owner != duelist) { game.AttackPlayer(source, duelist); } } foreach (Creature creature in game.GetAllInBattleZone <Creature>(source.Owner.BattleZone)) { if (attacked) { return; } game.Battle(source, creature); } }; game.BattleZonePut += (g, bz, putCard) => { if (putCard == source) { source.Owner.TurnStarted += setHasAttackedToFalse; game.Attacked += setHasAttackedToTrue; game.DuelistEndAttackStep += attack; } }; game.BattleZoneRemoved += (g, bz, removedCard) => { if (removedCard == source) { source.Owner.TurnStarted -= setHasAttackedToFalse; game.Attacked -= setHasAttackedToTrue; game.DuelistEndAttackStep -= attack; } }; }
private static void StaticSpellEffectUntilEndMaker <T>(Spell source, Action <T> effect, Action <T> removeEffect, Func <T[]> toApply) where T : Card { Game game = source.Owner.Game; foreach (T card in toApply()) { effect(card); } Game.BattleZoneEventHandler applyEffectOnPut = (g, bz, putCard) => { if (putCard is T) { effect((T)putCard); } }; game.BattleZonePut += applyEffectOnPut; Game.BattleZoneEventHandler removeEffectOnRemove = (g, bz, removedCard) => { if (removedCard is T) { removeEffect((T)removedCard); } }; game.BattleZoneRemoved += removeEffectOnRemove; Game.DuelistEventHandler turnEnd = null; turnEnd = (g, duelist) => { foreach (T card in toApply()) { removeEffect(card); } game.BattleZonePut -= applyEffectOnPut; game.BattleZoneRemoved -= removeEffectOnRemove; game.DuelistAtTurnEnd -= turnEnd; }; game.DuelistTurnEnded += turnEnd; }