anchor.diff:  	/// How long the crab animates
   	Duration randReactLength() => randSongLength() ~/ 2;
   
  +	Duration untilRespawn() => respawn.difference(new DateTime.now());
  +
   	/// Make the crab hear this noise
   	Future playMusic({WebSocket userSocket, String email, String itemType, int count, int slot, int subSlot}) async {
  +		if (!busy) {
  +			// Allow interaction
  +			busyWithEmail = email;
  +		} else {
  +			// Only 1 player at a time
  +			say(ERROR_BUSY);
  +		}
  +
   		assert (userSocket != null);
   		assert (email != null);
   		assert (itemType != null && MUSICBLOCK_TYPES.contains(itemType));
  
positive.code: 
  	/// Called from the client menu
  	void talkTo({WebSocket userSocket, String email}) {
  		if (!busy) {
  			// Allow interaction
  			busyWithEmail = email;
  
  			userSocket.add(JSON.encode({
  				"action": "playMusic",
  				"id": id,
  				"openWindow": "itemChooser",
  				"filter": "itemType=musicblock_.*",
  				"windowTitle": "Play what for Crab?"
  			}));
  		} else {
  			// Only 1 player at a time
  			say(ERROR_BUSY);
  		}
  	}
  
  	/// Adds a song to the history of the crab.
  
negative.code: 		} else {
  			// Be crabby
  
  print("not dancing...");
  			setState("dislike_on");
  			await new Future.delayed(randReactLength() + untilRespawn());
  
  print("removing headphones");
  			setState("like_off");
  			await _giveMusicblock();
  
  