public LevelScript(JSONTable template)
        {
            spawns = new List<List<MinionType>>();
            name = template.getString("name", "UNNAMED");
            JSONArray spawnTemplate = template.getArray("monsters");
            for (int Idx = 0; Idx < spawnTemplate.Length; ++Idx)
            {
                List<MinionType> thisTurn = new List<MinionType>();
                foreach (string minion in spawnTemplate.getArray(Idx).asStrings())
                {
                    MinionType type = MinionType.get(minion);
                    thisTurn.Add(type);
                }
                spawns.Add(thisTurn);
            }

            scenery = new List<KeyValuePair<MinionType, Point>>();
            foreach (JSONArray entry in template.getArray("scenery", JSONArray.empty).asJSONArrays())
            {
                scenery.Add(new KeyValuePair<MinionType,Point>(MinionType.get(entry.getString(0)), new Point(entry.getInt(1), entry.getInt(2))));
            }

            ongoingEffects = new List<KeyValuePair<Card, Point>>();
            foreach (JSONArray entry in template.getArray("ongoingEffects", JSONArray.empty).asJSONArrays())
            {
                ongoingEffects.Add(new KeyValuePair<Card, Point>(Card.get(entry.getString(0)), new Point(entry.getInt(1), entry.getInt(2))));
            }

            levelType = LevelType.get(template.getString("type"));

            string unlock = template.getString("unlock", null);
            if(unlock != null)
                unlocksCard = Card.get(unlock);
        }
        public bool CanUpgrade(Card c)
        {
            if (c.upgrades == null)
                return false;

            if (upgrades.ContainsKey(c))
            {
                return c.upgrades.Count > upgrades[c];
            }
            return true;
        }
 public void AddUpgrade(Card c)
 {
     if (upgrades.ContainsKey(c))
     {
         upgrades[c]++;
     }
     else
     {
         upgrades[c] = 1;
     }
 }
 public TextChanges getTextChanges(Card c)
 {
     if (cardTextChanges.ContainsKey(c))
         return cardTextChanges[c];
     else
         return TextChanges.none;
 }
 public CardState GetCardState(Card c)
 {
     if (choosingCardForCard != null)
     {
         bool canTarget = playState.CanPlayCard(choosingCardForCard, TriggerItem.create(c));
         return canTarget ? CardState.Targetable : CardState.NotTargetable;
     }
     else if (choosingPositionForCard != null)
     {
         bool beingPlayed = (choosingPositionForCard == c);
         return beingPlayed? CardState.BeingPlayed: CardState.NotPlayable;
     }
     else
     {
         bool canPlay = playState.CanPlayCard(c);
         return canPlay ? CardState.Playable : CardState.NotPlayable;
     }
 }
        public void ClickedCard(Card card, bool isUpgrade)
        {
            if (clickHandled)
                return;

            clickHandled = true;

            if (choosingCardForCard != null)
            {
                playing = choosingCardForCard;
                playTargetCard = card;
                choosingCardForCard = null;
            }
            else
            {
            //                if (isUpgrade)
            //                    AddUpgrade(card);
                if (card.targetType == TargetType.numeric_spell ||
                        card.targetType == TargetType.area_spell)
                {
                    choosingCardForCard = card;
                }
                else if (card.targetType != TargetType.none)
                {
                    choosingPositionForCard = card;
                }
                else
                {
                    playing = card;
                    playPosition = playState.wizard.position;
                }
            }
        }
        public void ClickedPosition()
        {
            if (clickHandled)
                return;

            if (choosingCardForCard != null)
            {
                //choosingCardForCard = null;
            }
            else if (choosingPositionForCard != null)
            {
                Point targetPos = GameState.ScreenToGridPos(Game1.inputState.MousePos);
                if (playState.CanPlayCard(choosingPositionForCard, playState.getItemAt(targetPos)))
                {
                    playing = choosingPositionForCard;
                    playPosition = targetPos;
                    playTargetCard = null;
                    clickHandled = true;
                }
                choosingPositionForCard = null;
            }
        }
 public TriggerEvent(TriggerType type, Card c, TriggerItem target)
 {
     this.type = type;
     this.source = TriggerItem.create(c);
     this.target = target;
 }
 public void ClearPlaying()
 {
     playing = null;
     playTargetCard = null;
     clickHandled = false;
 }
Beispiel #10
0
        public void PlayTurn(Card c, Minion caster, TriggerItem target)
        {
            if (c.effect != null && c.effect is Effect_Rewind)
            {
                if (gameStates.Count <= 1)
                    return;
                // rewind isn't really a spell like everything else
                gameStates.RemoveAt(gameStates.Count - 1);
                gameStateOnSkip = gameStates.Last().GetGameStateOnSkip();
                selectionState = new UISelectionState(gameStates.Last());
            }
            else
            {
                GameState oldGameState = gameStates.Last();
                if (oldGameState.CanPlayCard(c, target))
                {
                    nextGameState = new GameState(gameStates.Last());

                    animation.Clear();
                    if (caster == null)
                        caster = nextGameState.wizard;

                    nextGameState.PlayCard(c, caster, nextGameState.Adapt(target), animation);
                    nextGameState.TurnEffects(animation);

                    gameStateOnSkip = nextGameState.GetGameStateOnSkip();
                }
            }
        }
 public Ongoing(Card baseCard, Point p)
     : base(baseCard.ongoingType, p, false)
 {
     this.baseCard = baseCard;
 }
        public bool CanPlayCard(Card card)
        {
            if (gameEndState == GameEndState.GameOver && (card.effect == null || !(card.effect is Effect_Rewind)))
            {
                return false;
            }

            if (playableCards.Contains(card))
            {
                return true;
            }

            if (card.ongoingType != null)
            {
                if (!CanPayCost(CombineCosts(card.cost, card.ongoingType.upkeep)))
                {
                    return false;
                }
            }
            else
            {
                if (!CanPayCost(card.cost))
                {
                    return false;
                }
            }

            // can't rewind on turn 1
            if (parentState == null && card.effect != null && card.effect is Effect_Rewind)
            {
                return false;
            }

            playableCards.Add(card);
            return true;
        }
 public void DrawTargetCursor(SpriteBatch spriteBatch, Card playing, Vector2 mousePos)
 {
     Point p = ScreenToGridPos(mousePos);
     bool canPlay = CanPlayCard(playing, getItemAt(p));
     spriteBatch.Draw(Game1.gridCursor, GridToScreenPos(p), canPlay? Color.LightGreen: Color.Red);
 }
        public bool CanPlayCard(Card card, TriggerItem target)
        {
            switch (card.targetType)
            {
                case TargetType.numeric_spell:
                    if (!target.card.HasANumber())
                        return false;
                    break;
                case TargetType.area_spell:
                    if (!target.card.HasAnArea())
                        return false;
                    break;
                case TargetType.empty:
                case TargetType.path:
                    if(target.permanent != null)
                        return false;
                    break;
                case TargetType.minion:
                    if (target.permanent == null)
                        return false;
                    break;
                case TargetType.friend:
                    if (target.permanent == null || target.permanent.isEnemy)
                        return false;
                    break;
                case TargetType.enemy:
                    if (target.permanent == null)
                    {
                        return false;
                    }
                    else
                    {
                        if (!target.permanent.isEnemy)
                            return false;
                    }
                    break;
            }

            if (card.targetTest != null && !card.targetTest.Test(target, new EffectContext(this, wizard, null, null)))
                return false;

            if (target.card == null && levelScript.Blocks(target.position, card.targetType))
                return false;

            return CanPlayCard(card);
        }
        public void ApplyCardEffect(Card c, Minion caster, TriggerItem target, MinionAnimationSequence animation)
        {
            TextChanges changes = null;
            if (cardTextChanges.ContainsKey(c))
                changes = cardTextChanges[c];

            ApplyEffect(c.effect, new EffectContext(this, changes, caster, target, new TriggerEvent(TriggerType.onSpell, caster, target.permanent), animation));

            if (c.ongoingType != null)
            {
                Point pos = target.position;
                ongoingEffects[pos] = new Ongoing(c, pos);
            }
        }
 public void AddTextChange(Card c, TextChanges.TextChange<int> change)
 {
     if (cardTextChanges.ContainsKey(c))
     {
         cardTextChanges[c] = new TextChanges(cardTextChanges[c], change);
     }
     else
     {
         cardTextChanges[c] = new TextChanges(change);
     }
 }
 public TriggerItem_Card(Card card)
 {
     this.mcard = card;
 }
 public static TriggerItem create(Card card)
 {
     return new TriggerItem_Card(card);
 }
        public void PlayCard(Card c, Minion caster, TriggerItem target, MinionAnimationSequence animation)
        {
            PayCost(c.cost);

            HandleTriggers(new TriggerEvent(TriggerType.beforeSpells));
            if(Card.get("wait") != c)
                HandleTriggers(new TriggerEvent(TriggerType.beforeActualSpell, c));

            ApplyCardEffect(c, caster, target, animation);

            HandleTriggers(new TriggerEvent(TriggerType.afterSpells));
            if (c.effect != null || c.ongoingType != null)
                HandleTriggers(new TriggerEvent(TriggerType.afterActualSpell, c));
        }
 public Card GetUpgrade(Card c)
 {
     if (upgrades.ContainsKey(c))
     {
         return c.upgrades[upgrades[c]-1];
     }
     else
     {
         return c;
     }
 }
 public Ongoing(Ongoing basis)
     : base(basis)
 {
     this.baseCard = basis.baseCard;
 }
 public TriggerEvent(TriggerType type, Card c)
 {
     this.type = type;
     this.source = TriggerItem.create(c);
 }