anchor.diff:          combine();
       }
   
  +    String  description(Player p, templates) {
  +        templates.addAll(<String>["${p.htmlTitleBasicNoTip()} uses Alchemy to combine ${turnArrayIntoHumanSentence(items)} to get ${result.fullName}. ${result.randomDescription(p.session.rand)}"]);
  +        return p.session.rand.pickFrom(templates);
  +    }
  +
  +    void apply(List<Item> targetItems) {
  +        for(Item item in items) {
  +            if(!targetItems.contains(item)) return;
  +        }
  +        //alright, if I'm here, then I have all the parts I need for this.
  +        //give first item traits of result. (replace)
  +        Item modified = targetItems[targetItems.indexOf(items[0])];
  +        modified.traits = result.traits;
  +
  +        //remove all other items.
  +        for(int i = 1; i<items.length; i++) {
  +            Item item = items[i];
  +            targetItems.remove(item);
  +        }
  +    }
  +
       void combine();
  +
  +    //alchemy results are naturally sorted by the power of the items they produce.
  +    @override
  +    int compareTo(AlchemyResult other) {
  +        return (other.result.rank - result.rank).round(); //TODO or is it the otherway around???
  +    }
   
       ///returns a list of all possible alchemy types between these two items.
       static List<AlchemyResult> planAlchemy(List<Item> items) {
  
positive.code: import "Item.dart";
  import "Trait.dart";
  
  /*
  http://mspaintadventures.wikia.com/wiki/Alchemiter
  
negative.code: class AlchemyResultXOR extends AlchemyResult {
      AlchemyResultXOR(List<Item> items) : super(items);
  
      @override
      String  description(Player p, templates) {
          templates.addAll(<String>["Wait. What the fuck? Is this cheating? The ${p.htmlTitleBasicNoTip()} figures out how to use a XOR operation to turn ${turnArrayIntoHumanSentence(items)} into a ${result.fullName}. ${result.randomDescription(p.session.rand)}"]);
          return super.description(p, templates);
      }
  
      //XOR is where you have traits ONLY if they only show up in one place, not two.
      @override
      void combine() {
  