private void DoLearn(PlayerWitch p, TomeSpell spell) { int index = _tome.IndexOf(spell); if (p.Inventory.Delta[0] < index * READ_AHEAD_COST) { throw new GameException("Not enough ingredients to learn " + spell.Id); } for (int i = 0; i < index; ++i) { _tomeStockGain[i] += READ_AHEAD_COST; p.Inventory.Delta[0] -= READ_AHEAD_COST; } PlayerSpell learnt = new PlayerSpell(spell, p); p.Spells.Add(learnt); int maxToGet = MAX_SPACE - p.Inventory.GetTotal(); int ingredientsGot = Math.Min(maxToGet, spell.GetStock()); p.Inventory.Delta[0] += ingredientsGot; _learntSpells.Add(spell); EventData e = new EventData(); e.Type = EventData.LEARN; e.PlayerIdx = p.Index; e.SpellId = spell.Id; e.ResultId = learnt.Id; e.TomeIdx = index; e.Acquired = ingredientsGot; e.Lost = spell.GetStock() - ingredientsGot; _viewerEvents.Add(e); }
private void DoReset(PlayerWitch p) { if (p.Spells.All(spell => spell.IsActive())) { throw new GameException("All spells are already castable"); } p.Spells.ForEach(x => x.Activate()); EventData e = new EventData(); e.Type = EventData.RESET; e.PlayerIdx = p.Index; _viewerEvents.Add(e); }
private void DoPlayerSpell(PlayerWitch p, PlayerSpell spell) { int repeats = p.Action.GetRepeats(); if (repeats < 1) { throw new GameException("Repeat can't be zero (on " + spell.Id + ")"); } if (repeats > 1 && !spell.IsRepeatable()) { throw new GameException("Spell " + spell.Id + " is not repeatable"); } if (!spell.IsActive()) { throw new GameException("Spell " + spell.Id + " is exhausted"); } if (!p.CanAfford(spell.Recipe, repeats)) { throw new GameException("Not enough ingredients for spell " + spell.Id); } if (!p.EnoughSpace(spell.Recipe, repeats)) { throw new GameException("Not enough space in inventory for spell " + spell.Id); } //do spell for (int k = 0; k < repeats; ++k) { for (int i = 0; i < INGREDIENT_TYPE_COUNT; ++i) { p.Inventory.Add(i, spell.GetDelta()[i]); } } spell.Deactivate(); EventData e = new EventData(); e.Type = EventData.PLAYER_SPELL; e.PlayerIdx = p.Index; e.SpellId = spell.Id; e.Repeats = repeats; _viewerEvents.Add(e); }
private SpellType GetSpellType(Spell spell, PlayerWitch player) { if (spell.GetType() == typeof(TomeSpell)) { return(SpellType.LEARN); } else if (spell.GetType() == typeof(DeliverySpell)) { return(SpellType.BREW); } else { if (spell.IsOwner(player)) { return(SpellType.CAST); } else { return(SpellType.OPPONENT_CAST); } } }
private DeliveryCompletion DoDelivery(PlayerWitch p, DeliverySpell del) { if (!p.CanDeliver(del.Recipe)) { throw new GameException("Not enough ingredients for order " + del.Id); } for (int i = 0; i < INGREDIENT_TYPE_COUNT; ++i) { p.Inventory.Add(i, del.Recipe.Delta[i]); } DeliveryCompletion delCompletion = new DeliveryCompletion(del, _deliveries.IndexOf(del), GetScoreOf(del)); _delivered.Add(delCompletion); p.AddDelivery(); p.AddScore(GetScoreOf(del)); EventData e = new EventData(); e.Type = EventData.DELIVERY; e.PlayerIdx = p.Index; e.SpellId = del.Id; _viewerEvents.Add(e); return(delCompletion); }
public List <String> GetGlobalInfoFor(PlayerWitch player) { return(new List <String>()); }