Ejemplo n.º 1
0
 public void Take(Character taker, Board ParentBoard)
 {
     if (!taker.HasToken("items"))
     {
         taker.Tokens.Add(new Token("items"));
     }
     taker.GetToken("items").Tokens.Add(Token);
     taker.CheckHasteSlow();
     ParentBoard.EntitiesToRemove.Add(this);
 }
Ejemplo n.º 2
0
 public void Consume(Character carrier, Token carriedItem)
 {
     if (this.HasToken("charge"))
     {
         var charge = carriedItem.Path("charge");
         if (charge == null && carriedItem.Name == "charge")
         {
             charge = carriedItem;
         }
         if (charge == null || charge.Value == 1)
         {
             if (HasToken("revert"))
             {
                 carriedItem.Name = GetToken("revert").Text;
                 carriedItem.Tokens.Clear();
             }
             else
             {
                 carrier.GetToken("items").Tokens.Remove(carriedItem);
                 carrier.CheckHasteSlow();
             }
         }
         else
         {
             charge.Value--;
         }
     }
     else
     {
         if (HasToken("revert"))
         {
             carriedItem.Name = GetToken("revert").Text;
             carriedItem.Tokens.Clear();
         }
         else
         {
             carrier.GetToken("items").Tokens.Remove(carriedItem);
             carrier.CheckHasteSlow();
         }
     }
 }
Ejemplo n.º 3
0
        public bool Unequip(Character character)
        {
            /*
             * if item's slots have covering slots
             *      check for target slot's reachability.
             *      if unreachable, try to temp-remove items in covering slots, recursively.
             *      if still unreachable, error out.
             * if item is cursed, error out
             * mark item as unequipped.
             */
            var item = this.CarriedToken.ContainsKey(character.ID) ? this.CarriedToken[character.ID] : null;

            if (item != null && item.HasToken("cursed") && item.GetToken("cursed").HasToken("known"))
            {
                throw new ItemException(item.GetToken("cursed").Text.IsBlank(i18n.Format("cannot_remove_sticky", this.ToString(item, true)), item.GetToken("cursed").Text));
            }

            var equip      = this.GetToken("equipable");
            var tempRemove = new Stack <Token>();
            var items      = character.GetToken("items");

            foreach (var t in equip.Tokens)
            {
                if (t.Name == "underpants")
                {
                    TempRemove(character, tempRemove, "pants");
                }
                else if (t.Name == "undershirt")
                {
                    TempRemove(character, tempRemove, "shirt");
                }
                else if (t.Name == "shirt")
                {
                    TempRemove(character, tempRemove, "jacket");
                }
                else if (t.Name == "jacket")
                {
                    TempRemove(character, tempRemove, "cloak");
                }
                else if (t.Name == "socks")
                {
                    TempRemove(character, tempRemove, "shoes");
                }
            }

            if (item == null)
            {
                item = items.Tokens.Find(x => x.Name == this.ID);
            }

            if (item.HasToken("cursed"))
            {
                item.GetToken("cursed").Tokens.Add(new Token("known"));
                throw new ItemException(i18n.Format("surprise_its_sticky", this.ToString(item, true)));
            }

            var succeed = true;

            if (!this.OnUnequip.IsBlank())
            {
                succeed = Convert.ToBoolean(RunScript(item, this.OnUnequip, character, null, null));
            }
            if (succeed)
            {
                item.RemoveToken("equipped");
            }

            if (!this.OnTimer.IsBlank() && this.Path("timer/evenunequipped") == null)
            {
                item.RemoveToken("timer");
            }

            //Not sure about automatically putting pants back on after taking them off to take off underpants...
            //while (tempRemove.Count > 0)
            //	tempRemove.Pop().Tokens.Add(new Token("equipped"));

            character.RecalculateStatBonuses();
            character.CheckHasteSlow();
            return(succeed);
        }
Ejemplo n.º 4
0
        public bool Equip(Character character, Token item)
        {
            /*
             * if rings and character is quadruped, error out.
             * if required slots have covering slots
             *      check for target slot's reachability.
             *      if unreachable, try to temp-remove items in covering slots, recursively.
             *      if still unreachable, error out.
             * if required slots are taken
             *      try to unequip the items in those slots, recursively.
             *      if required slots are still taken, error out;
             *      else, mark the item as equipped.
             * replace each temp-removed item whose required slots are still free.
             */
            var equip      = this.GetToken("equipable");
            var tempRemove = new Stack <Token>();

            //var items = character.GetToken("items");

            //TODO: make full quadrupeds equip weapons in their mouth instead of the hands they don't have.
            //This means they can carry only ONE weapon at a time, and maybe not be able to converse until unequipped.
            if ((equip.HasToken("hands") || equip.HasToken("ring")) && (character.HasToken("quadruped")))
            {
                throw new ItemException(i18n.Format("cannot_equip_no_hands", this.ToString(item, true, false)));
            }

            if (equip.HasToken("hand"))
            {
                CheckHands(character, "hand");
            }
            else if (equip.HasToken("ring"))
            {
                CheckHands(character, "ring");
            }
            if (equip.HasToken("pants") || equip.HasToken("underpants") || equip.HasToken("shoes") || equip.HasToken("socks"))
            {
                CheckPants(character, equip);
            }
            if (character.HasToken("snaketail") && (equip.HasToken("pants") || equip.HasToken("underpants")))
            {
                throw new ItemException(i18n.Format("cannot_equip_no_legs", this.ToString(item, true, false)));
            }

            //lol
            foreach (var nonLayeredSlot in new[] { "socks", "hat", "mask", "goggles", "neck" })
            {
                if (equip.HasToken(nonLayeredSlot))
                {
                    var currentNonLayeredItem = character.GetEquippedItemBySlot(nonLayeredSlot);
                    if (currentNonLayeredItem != null)
                    {
                        currentNonLayeredItem.Unequip(character);
                    }
                }
            }

            foreach (var t in equip.Tokens)
            {
                if (t.Name == "underpants" && (!TempRemove(character, tempRemove, "pants") || !TempRemove(character, tempRemove, "underpants")))
                {
                    return(false);
                }
                else if (t.Name == "undershirt" && (!TempRemove(character, tempRemove, "shirt") || !TempRemove(character, tempRemove, "undershirt")))
                {
                    return(false);
                }
                else if (t.Name == "shirt" && (!TempRemove(character, tempRemove, "shirt") || !TempRemove(character, tempRemove, "jacket")))
                {
                    return(false);
                }
                else if (t.Name == "jacket" && (!TempRemove(character, tempRemove, "cloak") || !TempRemove(character, tempRemove, "jacket")))
                {
                    return(false);
                }
                else if (t.Name == "socks" && (!TempRemove(character, tempRemove, "shoes") || !TempRemove(character, tempRemove, "socks")))
                {
                    return(false);
                }
            }

            var succeed = true;

            if (!this.OnEquip.IsBlank())
            {
                succeed = Convert.ToBoolean(RunScript(item, this.OnEquip, character, null, null));
            }
            if (succeed)
            {
                item.AddToken("equipped");
            }

            if (this.HasToken("timer") && !this.OnTimer.IsBlank() && !item.HasToken("timer"))
            {
                item.AddToken("timer").Value = (this.GetToken("timer").Value == 0) ? 60 : this.GetToken("timer").Value;
                item.GetToken("timer").Text  = NoxicoGame.InGameTime.ToBinary().ToString();
            }

            character.RecalculateStatBonuses();
            character.CheckHasteSlow();

            //Difficult bit: gotta re-equip tempremovals without removing the target item all over. THAT WOULD BE QUITE BAD.
            return(succeed);
        }