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); }
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(); } } }
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); }
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); }