void startNewGame() { closeWindow("#MagicCrow.ui.mainMenu.iml"); loadWindow("#MagicCrow.ui.log.iml"); phasePannel = Load("#MagicCrow.ui.phases.iml"); AddWidget(phasePannel); phasePannel.DataSource = this; playerPannels = new GraphicObject[2]; for (int i = 0; i < 2; i++) { playerPannels[i] = Load("#MagicCrow.ui.player.iml"); playerPannels[i].HorizontalAlignment = HorizontalAlignment.Left; playerPannels[i].DataSource = Players[i]; } playerPannels[1].HorizontalAlignment = HorizontalAlignment.Right; new Deck(DeckList [P1DeckIdx], Players [0]); new Deck(DeckList [P2DeckIdx], Players [1]); Players [0].LoadDeckCards(); Players [1].LoadDeckCards(); engine = new MagicEngine(Players); MagicEngine.MagicEvent += MagicEngine_MagicEvent; engine.currentPlayerIndex = engine.interfacePlayer; mstack = Load("#MagicCrow.ui.MagicStack.iml"); AddWidget(mstack); mstack.DataSource = engine.MagicStack; updatePhaseStopsControls(); }
public void ActivateAvailableMana(MagicEngine engine) { MagicAction ma = engine.MagicStack.Peek() as MagicAction; if (ma == null) { Debug.WriteLine("no action to activate mana for."); return; } if (ma.remainingCost == null) { Debug.WriteLine("Action has no cost"); return; } foreach (CardInstance c in InPlay.Cards.Where(crd => !crd.IsTapped)) { foreach (Ability a in c.Model.Abilities.Where(a => a.ContainsEffect(EffectType.ProduceMana))) { ManaEffect me = a.Effects.OfType <ManaEffect> ().FirstOrDefault(); if (a.ActivationCost.Contains(CostTypes.Tap)) { if (ma.remainingCost.Contains(me.ProducedMana)) { MagicEngine.CurrentEngine.MagicStack.PushOnStack(new AbilityActivation(c, a)); return; } } } } }
void OnKeep(Object sender, EventArgs _e) { Magic.CurrentGameWin.DeleteWidget(msgBox); msgBox = null; CurrentState = PlayerStates.Ready; MagicEngine e = MagicEngine.CurrentEngine; e.RaiseMagicEvent(new MagicEventArg(MagicEventType.PlayerIsReady, this)); }
public MagicEngine(Player[] _players) { CurrentEngine = this; MagicStack = new MagicStack(this); Players = _players; MagicEvent += new MagicEventHandler(MagicEngine_MagicEvent); }
protected void PlayerPanel_MouseClick(object sender, Crow.MouseButtonEventArgs e) { MagicEngine me = MagicEngine.CurrentEngine; if (me.pp != me.ip) { return; } me.MagicStack.TryToHandleClick(this); }
public MagicStack(MagicEngine _engine) : base() { engine = _engine; SpellStackLayout.Position = new Vector3(0, 0, 2); //Magic.vGroupedFocusedPoint; SpellStackLayout.HorizontalSpacing = 0.1f; SpellStackLayout.VerticalSpacing = 0.3f; SpellStackLayout.MaxHorizontalSpace = 3f; //SpellStackLayout.xAngle = Magic.FocusAngle; }
public IEnumerable <CardInstance> GetValidTargetsInPlay(CardInstance _source) { MagicEngine engine = MagicEngine.CurrentEngine; IEnumerable <CardInstance> cards; switch (TypeOfTarget) { case TargetType.Self: yield return(_source); break; case TargetType.EnchantedBy: case TargetType.EquipedBy: if (_source.IsAttached) { yield return(_source.AttachedTo); } break; case TargetType.Card: case TargetType.Attached: case TargetType.Permanent: if (Controler == ControlerType.All) { cards = engine.Players.SelectMany(p => p.InPlay.Cards); } else if (Controler == ControlerType.You) { cards = _source.Controler.InPlay.Cards; } else { cards = _source.Controler.Opponent.InPlay.Cards; } foreach (CardInstance ci in cards) { if (Accept(ci, _source)) { yield return(ci); } } break; } }
public IList <CardInstance> GetAffectedCardInstances(CardInstance _source, Ability _ability) { List <CardInstance> temp = new List <CardInstance> (); if (Affected == null) { return(null); } MagicEngine engine = MagicEngine.CurrentEngine; foreach (CardTarget ct in Affected.OfType <CardTarget>()) { foreach (CardInstance ci in ct.GetValidTargetsInPlay(_source)) { temp.Add(ci); } } return(temp.Count > 0 ? temp : null); }
void closeCurrentGame() { closeWindow("#MagicCrow.ui.log.iml"); DeleteWidget(phasePannel); for (int i = 0; i < 2; i++) { Players[i].Deck.Cards = new List <CardInstance>(); Players[i].DeckLoaded = false; Players[i].CurrentState = MagicCrow.Player.PlayerStates.Init; DeleteWidget(playerPannels [i]); } engine = null; DeleteWidget(mstack); CardInstance.CardsVBO?.Dispose(); CardInstance.Dispose3DCardTexture(); loadWindow("#MagicCrow.ui.mainMenu.iml"); }
public virtual void Process() { MagicEngine e = MagicEngine.CurrentEngine; switch (CurrentState) { #region StartUp case PlayerStates.Init: return; case PlayerStates.DeckLoading: //if (!DeckLoaded) // return; return; case PlayerStates.PlayDrawChoice: return; case PlayerStates.InitialDraw: initialDraw(); CurrentState = PlayerStates.WaitHandReady; return; case PlayerStates.WaitHandReady: if (Deck.HasAnimatedCards) { return; } createKeepMulliganChoice(); CurrentState = PlayerStates.KeepMuliganChoice; return; case PlayerStates.KeepMuliganChoice: return; #endregion } if (e.pp != this || e.State < EngineStates.CurrentPlayer) { return; } switch (e.CurrentPhase) { case GamePhases.Untap: break; case GamePhases.Upkeep: break; case GamePhases.Draw: break; case GamePhases.Main1: case GamePhases.Main2: //e.Chrono.Reset(); break; case GamePhases.BeforeCombat: //e.Chrono.Restart(); break; case GamePhases.DeclareAttacker: //if (cp != this) //if (HaveUntapedCreatureOnTable) // e.Chrono.Stop(); //if (pp != cp || !cp.HaveUntapedCreatureOnTable) //{ // SwitchToNextPhase(); // GivePriorityToNextPlayer(); //} break; case GamePhases.DeclareBlocker: break; case GamePhases.FirstStrikeDame: break; case GamePhases.CombatDamage: break; case GamePhases.EndOfCombat: break; case GamePhases.EndOfTurn: break; case GamePhases.CleanUp: break; } // if (e.Chrono.ElapsedMilliseconds < MagicEngine.timerLength) // return; if (e.MagicStack.Count == 0 && !PhaseStops[(int)e.CurrentPhase]) { PhaseDone = true; } // e.Chrono.Stop(); }
public override void Process() { MagicEngine e = MagicEngine.CurrentEngine; switch (CurrentState) { case PlayerStates.Init: return; case PlayerStates.PlayDrawChoice: //chose to play first e.currentPlayerIndex = e.getPlayerIndex(this); CurrentState = PlayerStates.InitialDraw; return; case PlayerStates.InitialDraw: initialDraw(); CurrentState = PlayerStates.KeepMuliganChoice; return; case PlayerStates.KeepMuliganChoice: //choose to keep CurrentState = PlayerStates.Ready; e.RaiseMagicEvent(new MagicEventArg(MagicEventType.PlayerIsReady, this)); return; } if (e.pp != this || e.State < EngineStates.CurrentPlayer) { return; } if (HasActionPending) { ActivateAvailableMana(e); return; } if (e.cp == this) { switch (e.CurrentPhase) { case GamePhases.Untap: PhaseDone = true; break; case GamePhases.Upkeep: PhaseDone = true; break; case GamePhases.Draw: PhaseDone = true; break; case GamePhases.Main1: case GamePhases.Main2: if (AllowedLandsToBePlayed > 0) { if (AITryToPlayLand()) { break; } } if (!CastAvailableAndAllowedCreature()) { PhaseDone = true; } break; case GamePhases.BeforeCombat: PhaseDone = true; break; case GamePhases.DeclareAttacker: AITryToAttack(); PhaseDone = true; break; case GamePhases.DeclareBlocker: PhaseDone = true; break; case GamePhases.FirstStrikeDame: PhaseDone = true; break; case GamePhases.CombatDamage: PhaseDone = true; break; case GamePhases.EndOfCombat: PhaseDone = true; break; case GamePhases.EndOfTurn: PhaseDone = true; break; case GamePhases.CleanUp: PhaseDone = true; break; } } else { if (e.pp == this) { Magic.AddLog("AI just had priority"); e.GivePriorityToNextPlayer(); } // switch (e.CurrentPhase) // { // case GamePhases.Untap: // PhaseDone = true; // break; // case GamePhases.Upkeep: // PhaseDone = true; // break; // case GamePhases.Draw: // PhaseDone = true; // break; // case GamePhases.Main1: // PhaseDone = true; // break; // case GamePhases.BeforeCombat: // PhaseDone = true; // break; // case GamePhases.DeclareAttacker: // PhaseDone = true; // break; // case GamePhases.DeclareBlocker: // PhaseDone = true; // break; // case GamePhases.FirstStrikeDame: // PhaseDone = true; // break; // case GamePhases.CombatDamage: // PhaseDone = true; // break; // case GamePhases.EndOfCombat: // PhaseDone = true; // break; // case GamePhases.Main2: // PhaseDone = true; // break; // case GamePhases.EndOfTurn: // PhaseDone = true; // break; // case GamePhases.CleanUp: // PhaseDone = true; // break; // } } }