private void progress(State s, StateBuffer nextBuffer, StateBuffer goalBuffer) {
    curGb.restore(s);
    int textSpeed = curGb.readMemory(curGb.pokemon.optionsAddress) & curGb.pokemon.optionsTextSpeedMask;
    int[] allowedMoves = new int[(textSpeed <= 1 ? 1 : 0) + (textSpeed >= 1 ? 1 : 0)];
    if (textSpeed <= 1)
      allowedMoves[0] = 0;
    if (textSpeed >= 1)
      allowedMoves[textSpeed <= 1 ? 1 : 0] = skipMove;

//    allowedMoves = new int[] { skipMove };

//    System.out.println("progress: textSpeed: " + textSpeed);

    for (int usedMove : allowedMoves) {
//      System.out.println("progress: usedMove: " + usedMove);
	    curGb.restore(s);
      curGb.step(usedMove, curGb.pokemon.printLetterDelayDoneAddress); // press usedMove
//      EflUtil.runInputPastAddressNoLimit(skipMove, curGb.pokemon.printLetterDelayDoneAddress);
		  if (hasMoreText(textSpeed)) {
		    EflUtil.runToNextInputFrameNoLimit(skipMove); // this is guaranteed to be for the next letter delay through hasMoreText()
	      nextBuffer.addState(curGb.createState(true));
		  } else {
        goalBuffer.addState(curGb.createState(true)); // done (no inputs)
		  }
		}
	}