Ejemplo n.º 1
0
  public static final TurnCounter getExpiredCounter(GenericRequest request, boolean informational) {
    String URL = request.getURLString();
    KoLAdventure adventure = AdventureDatabase.getAdventureByURL(URL);

    String adventureId;
    int turnsUsed;

    if (adventure != null) {
      adventureId = adventure.getAdventureId();
      turnsUsed = adventure.getRequest().getAdventuresUsed();
    } else if (AdventureDatabase.getUnknownName(URL) != null) {
      adventureId = "";
      turnsUsed = 1;
    } else {
      adventureId = "";
      turnsUsed = TurnCounter.getTurnsUsed(request);
    }

    if (turnsUsed == 0) {
      return null;
    }

    int thisTurn = KoLCharacter.getCurrentRun();
    int currentTurns = thisTurn + turnsUsed - 1;

    synchronized (TurnCounter.relayCounters) {
      Iterator<TurnCounter> it = TurnCounter.relayCounters.iterator();

      while (it.hasNext()) {
        TurnCounter current = it.next();

        if (current.value > currentTurns
            || current.lastWarned == thisTurn
            || current.isExempt(adventureId) != informational) {
          continue;
        }

        if (informational
            && current.value > thisTurn) { // Defer until later, there's no point in reporting an
          // informational counter prior to actual expiration.
          continue;
        }

        if (current.value < thisTurn) {
          if (current.wander) {
            // This might not actually be necessary
            continue;
          }
          it.remove();
        }

        current.lastWarned = thisTurn;
        return current;
      }
    }

    return null;
  }
Ejemplo n.º 2
0
  public static final void printRequestData(final GenericRequest request) {
    if (request == null) {
      return;
    }

    boolean shouldOpenStream = !RequestLogger.isDebugging();
    if (shouldOpenStream) {
      RequestLogger.openDebugLog();
    }

    RequestLogger.updateDebugLog();
    RequestLogger.updateDebugLog("" + request.getClass() + ": " + request.getURLString());
    RequestLogger.updateDebugLog(
        KoLConstants.LINE_BREAK_PATTERN.matcher(request.responseText).replaceAll(""));
    RequestLogger.updateDebugLog();

    if (shouldOpenStream) {
      RequestLogger.closeDebugLog();
    }
  }
Ejemplo n.º 3
0
  private static final int getTurnsUsed(GenericRequest request) {
    if (!(request instanceof RelayRequest)) {
      return request.getAdventuresUsed();
    }

    String urlString = request.getURLString();

    if (urlString.startsWith("adventure.php")) {
      // Assume unknown adventure locations take 1 turn each
      // This is likely not true under the Sea, for example,
      // but it's as good a guess as any we can make.

      return 1;
    }

    if (urlString.startsWith("inv_use.php") || urlString.startsWith("inv_eat.php")) {
      return UseItemRequest.getAdventuresUsed(urlString);
    }

    if (urlString.startsWith("runskillz.php")) {
      return UseSkillRequest.getAdventuresUsed(urlString);
    }

    if (urlString.startsWith("craft.php") || urlString.startsWith("guild.php")) {
      return CreateItemRequest.getAdventuresUsed(request);
    }

    if (urlString.startsWith("place.php?whichplace=chateau")
        && urlString.contains("action=chateau_painting")) {
      return Preferences.getBoolean("_chateauMonsterFought") ? 0 : 1;
    }

    if (urlString.startsWith("crimbo09.php")) {
      return Crimbo09Request.getTurnsUsed(request);
    }

    return 0;
  }
Ejemplo n.º 4
0
  public static final void solve() {
    if (DvorakDecorator.lastResponse == null) {
      KoLmafia.updateDisplay(MafiaState.ERROR, "You don't appear to be at the tiles puzzle");
      return;
    }

    // Examine the tiles and figure out which row we are on.
    KoLmafia.updateDisplay("Examining tiles...");

    char[][] tiles = new char[7][9];
    int currentRow = 0;

    Matcher matcher = DvorakDecorator.TILE_PATTERN.matcher(DvorakDecorator.lastResponse);
    int count = 0;
    while (matcher.find()) {
      int row = count / 9;
      int column = count % 9;
      if (row > 7) {
        KoLmafia.updateDisplay("Too many rows!");
        return;
      }
      if (matcher.group(1).equals("cell")) {
        currentRow = row;
      }
      tiles[row][column] = matcher.group(2).charAt(0);
      count++;
    }

    if (count != (7 * 9)) {
      KoLmafia.updateDisplay("Wrong number of cells!");
      return;
    }

    /*
    StringBuffer buffer = new StringBuffer();
    for ( int row = 0; row < 7; ++row )
    {
    	buffer.setLength( 0 );
    	buffer.append( "Row " );
    	buffer.append( String.valueOf( row + 1 ) );
    	buffer.append( ": " );
    	for ( int col = 0; col < 9; ++col )
    	{
    		buffer.append( tiles[ row ][ col ] );
    		buffer.append( " " );
    	}
    	if ( row == currentRow )
    	{
    		buffer.append( " ---you are here" );
    	}
    	RequestLogger.printLine( buffer.toString() );
    }
    */

    // Execute requests to jump to the end.
    String solution = "BANANAS";

    GenericRequest request = new GenericRequest("");
    for (int row = currentRow; row >= 0; --row) {
      char match = solution.charAt(6 - row);
      int found = -1;
      for (int col = 0; col < 9; ++col) {
        char tile = tiles[row][col];
        if (match == tile) {
          found = col;
          break;
        }
      }
      if (found == -1) {
        KoLmafia.updateDisplay("Could not find '" + match + "' in row " + (row + 1));
        return;
      }

      String url = "tiles.php?action=jump&whichtile=" + found;
      request.constructURLString(url).run();
    }

    KoLmafia.updateDisplay("Tile puzzle completed.");

    StringBuffer buffer = new StringBuffer(request.responseText);
    RequestEditorKit.getFeatureRichHTML(request.getURLString(), buffer);
    RelayRequest.specialCommandResponse = buffer.toString();
    RelayRequest.specialCommandIsAdventure = true;
    DvorakDecorator.lastResponse = null;
  }