code: StoryState copy() {
  		StoryState copy = new StoryState(story);
  
  		copy.getOutputStream().addAll(outputStream);
  		outputStreamDirty();
  		copy.currentChoices.addAll(currentChoices);
  
  		if (hasError()) {
  			copy.currentErrors = new ArrayList<String>();
  			copy.currentErrors.addAll(currentErrors);
  		}
  
  		if (hasWarning()) {
  			copy.currentWarnings = new ArrayList<String>();
  			copy.currentWarnings.addAll(currentWarnings);
  		}
  
  		copy.callStack = new CallStack(callStack);
  
  		copy.variablesState = new VariablesState(copy.callStack, story.getListDefinitions());
  		copy.variablesState.copyFrom(variablesState);
  
  		copy.evaluationStack.addAll(evaluationStack);
  
  		if (!divertedPointer.isNull())
  			copy.divertedPointer.assign(divertedPointer);
  
  		copy.setPreviousPointer(getPreviousPointer());
  
  		copy.visitCounts = new HashMap<String, Integer>(visitCounts);
  		copy.turnIndices = new HashMap<String, Integer>(turnIndices);
  		copy.currentTurnIndex = currentTurnIndex;
  		copy.storySeed = storySeed;
  		copy.previousRandom = previousRandom;
  
  		copy.setDidSafeExit(didSafeExit);
  
  		return copy;
  	}
docs: I wonder if there's a sensible way to enforce that..??