/**
* Copyright (c) 2005-2017, KoLmafia development team
* http://kolmafia.sourceforge.net/
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* [1] Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* [2] Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
* [3] Neither the name "KoLmafia" nor the names of its contributors may
* be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION ) HOWEVER
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE ) ARISING IN
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
package net.sourceforge.kolmafia.textui.command;
import java.io.File;
import java.io.PrintStream;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import net.sourceforge.kolmafia.AdventureResult;
import net.sourceforge.kolmafia.KoLCharacter;
import net.sourceforge.kolmafia.KoLConstants;
import net.sourceforge.kolmafia.KoLConstants.MafiaState;
import net.sourceforge.kolmafia.KoLmafia;
import net.sourceforge.kolmafia.RequestLogger;
import net.sourceforge.kolmafia.objectpool.ItemPool;
import net.sourceforge.kolmafia.persistence.HolidayDatabase;
import net.sourceforge.kolmafia.persistence.SkillDatabase;
import net.sourceforge.kolmafia.request.EatItemRequest;
import net.sourceforge.kolmafia.request.EquipmentRequest;
import net.sourceforge.kolmafia.request.GenericRequest;
import net.sourceforge.kolmafia.request.UneffectRequest;
import net.sourceforge.kolmafia.request.UseSkillRequest;
import net.sourceforge.kolmafia.session.EquipmentManager;
import net.sourceforge.kolmafia.session.TurnCounter;
import net.sourceforge.kolmafia.swingui.CalendarFrame;
import net.sourceforge.kolmafia.utilities.LogStream;
import net.sourceforge.kolmafia.utilities.StringUtilities;
public class ShowDataCommand
extends AbstractCommand
{
public ShowDataCommand()
{
this.usage = " [<param>] - list indicated type of data, possibly filtered by param.";
}
@Override
public void run( final String cmd, final String parameters )
{
ShowDataCommand.show( cmd + " " + parameters );
}
public static void show( final String parameters )
{
ShowDataCommand.show( parameters, false );
}
/**
* A special module used specifically for properly printing out data relevant to the current session.
*/
public static void show( String parameters, final boolean sessionPrint )
{
if ( parameters.length() == 0 )
{
KoLmafia.updateDisplay( MafiaState.ERROR, "Print what?" );
return;
}
parameters = parameters.trim();
int spaceIndex = parameters.indexOf( " " );
String list = spaceIndex == -1 ? parameters : parameters.substring( 0, spaceIndex ).trim();
String filter =
spaceIndex == -1 ? "" : StringUtilities.getCanonicalName( parameters.substring( spaceIndex ).trim() );
PrintStream desiredOutputStream = sessionPrint ? RequestLogger.getSessionStream() : RequestLogger.INSTANCE;
if ( !filter.equals( "" ) && ( parameters.startsWith( "summary" ) || parameters.startsWith( "session" ) || parameters.equals( "status" ) || parameters.startsWith( "equip" ) || parameters.startsWith( "encounters" ) || parameters.startsWith( "locations" ) ) )
{
desiredOutputStream = LogStream.openStream( new File( KoLConstants.ROOT_LOCATION, filter ), false );
filter = "";
}
ShowDataCommand.show( list, filter, desiredOutputStream );
if ( sessionPrint && RequestLogger.isDebugging() )
{
ShowDataCommand.show( list, filter, RequestLogger.getDebugStream() );
}
if ( !sessionPrint )
{
desiredOutputStream.close();
}
}
/**
* A special module used specifically for properly printing out data relevant to the current session. This method is
* more specialized than its counterpart and is used when the data to be printed is known, as well as the stream to
* print to. Usually called by its counterpart to handle specific instances.
*/
private static void show( final String desiredData, String filter, final PrintStream desiredStream )
{
desiredStream.println();
if ( desiredData.startsWith( "moon" ) )
{
Date today = new Date();
desiredStream.println( CalendarFrame.LONG_FORMAT.format( today ) + " - " + HolidayDatabase.getCalendarDayAsString( today ) );
desiredStream.println();
desiredStream.println( "Ronald: " + HolidayDatabase.getRonaldPhaseAsString() );
desiredStream.println( "Grimace: " + HolidayDatabase.getGrimacePhaseAsString() );
desiredStream.println( "Mini-moon: " + HolidayDatabase.getHamburglarPositionAsString() );
desiredStream.println();
String[] holidayPredictions = HolidayDatabase.getHolidayPredictions( today );
for ( int i = 0; i < holidayPredictions.length; ++i )
{
desiredStream.println( holidayPredictions[ i ] );
}
desiredStream.println();
desiredStream.println( HolidayDatabase.getHoliday( today ) );
desiredStream.println( HolidayDatabase.getMoonEffect() );
desiredStream.println();
return;
}
if ( desiredData.equals( "session" ) )
{
desiredStream.println( "Player: " + KoLCharacter.getUserName() );
desiredStream.println( "Session Id: " + GenericRequest.sessionId );
desiredStream.println( "Password Hash: " + GenericRequest.passwordHash );
desiredStream.println( "Current Server: " + GenericRequest.KOL_HOST );
desiredStream.println();
return;
}
if ( desiredData.equals( "status" ) )
{
desiredStream.println( "Name: " + KoLCharacter.getUserName() );
desiredStream.println( "Class: " + KoLCharacter.getClassType() );
desiredStream.println();
desiredStream.println( "Lv: " + KoLCharacter.getLevel() );
desiredStream.println( "HP: " + KoLCharacter.getCurrentHP() + " / " + KoLConstants.COMMA_FORMAT.format( KoLCharacter.getMaximumHP() ) );
desiredStream.println( "MP: " + KoLCharacter.getCurrentMP() + " / " + KoLConstants.COMMA_FORMAT.format( KoLCharacter.getMaximumMP() ) );
desiredStream.println();
desiredStream.println( "Mus: " + ShowDataCommand.getStatString(
KoLCharacter.getBaseMuscle(), KoLCharacter.getAdjustedMuscle(), KoLCharacter.getMuscleTNP() ) );
desiredStream.println( "Mys: " + ShowDataCommand.getStatString(
KoLCharacter.getBaseMysticality(), KoLCharacter.getAdjustedMysticality(),
KoLCharacter.getMysticalityTNP() ) );
desiredStream.println( "Mox: " + ShowDataCommand.getStatString(
KoLCharacter.getBaseMoxie(), KoLCharacter.getAdjustedMoxie(), KoLCharacter.getMoxieTNP() ) );
desiredStream.println();
desiredStream.println( "Advs: " + KoLCharacter.getAdventuresLeft() );
desiredStream.println( "Meat: " + KoLConstants.COMMA_FORMAT.format( KoLCharacter.getAvailableMeat() ) );
desiredStream.println();
desiredStream.println( "Full: " + KoLCharacter.getFullness() + " / " + KoLCharacter.getFullnessLimit() );
desiredStream.println( "Drunk: " + KoLCharacter.getInebriety() + " / " + KoLCharacter.getInebrietyLimit() );
desiredStream.println( "Spleen: " + KoLCharacter.getSpleenUse() + " / " + KoLCharacter.getSpleenLimit() );
desiredStream.println();
return;
}
if ( desiredData.equals( "modifiers" ) )
{
desiredStream.println( "ML: " + KoLConstants.MODIFIER_FORMAT.format( KoLCharacter.getMonsterLevelAdjustment() ) );
desiredStream.println( "Enc: " + KoLConstants.ROUNDED_MODIFIER_FORMAT.format( KoLCharacter.getCombatRateAdjustment() ) + "%" );
desiredStream.println( "Init: " + KoLConstants.ROUNDED_MODIFIER_FORMAT.format( KoLCharacter.getInitiativeAdjustment() ) + "%" );
desiredStream.println();
desiredStream.println( "Exp: " + KoLConstants.ROUNDED_MODIFIER_FORMAT.format( KoLCharacter.getExperienceAdjustment() ) );
desiredStream.println( "Meat: " + KoLConstants.ROUNDED_MODIFIER_FORMAT.format( KoLCharacter.getMeatDropPercentAdjustment() ) + "%" );
desiredStream.println( "Item: " + KoLConstants.ROUNDED_MODIFIER_FORMAT.format( KoLCharacter.getItemDropPercentAdjustment() ) + "%" );
desiredStream.println();
return;
}
if ( desiredData.startsWith( "equip" ) )
{
AdventureResult hat = EquipmentManager.getEquipment( EquipmentManager.HAT );
desiredStream.println( "Hat: " + hat );
if ( hat.getItemId() == ItemPool.HATSEAT )
{
desiredStream.println( "Carrying: " + KoLCharacter.getEnthroned() );
}
desiredStream.println( "Weapon: " + EquipmentManager.getEquipment( EquipmentManager.WEAPON ) );
if ( EquipmentManager.getFakeHands() > 0 )
{
desiredStream.println( "Fake Hands: " + EquipmentManager.getFakeHands() );
}
desiredStream.println( "Off-hand: " + EquipmentManager.getEquipment( EquipmentManager.OFFHAND ) );
desiredStream.println( "Shirt: " + EquipmentManager.getEquipment( EquipmentManager.SHIRT ) );
desiredStream.println( "Pants: " + EquipmentManager.getEquipment( EquipmentManager.PANTS ) );
AdventureResult container = EquipmentManager.getEquipment( EquipmentManager.CONTAINER );
if ( container != EquipmentRequest.UNEQUIP )
{
desiredStream.println( "Back: " + container );
if ( container.getItemId() == ItemPool.BUDDY_BJORN )
{
desiredStream.println( "Carrying: " + KoLCharacter.getBjorned() );
}
}
desiredStream.println();
desiredStream.println( "Acc. 1: " + EquipmentManager.getEquipment( EquipmentManager.ACCESSORY1 ) );
desiredStream.println( "Acc. 2: " + EquipmentManager.getEquipment( EquipmentManager.ACCESSORY2 ) );
desiredStream.println( "Acc. 3: " + EquipmentManager.getEquipment( EquipmentManager.ACCESSORY3 ) );
desiredStream.println();
desiredStream.println( "Pet: " + KoLCharacter.getFamiliar() );
desiredStream.println( "Item: " + EquipmentManager.getFamiliarItem() +
(EquipmentManager.familiarItemLocked() ? " (locked)" : "") );
AdventureResult st1 = EquipmentManager.getEquipment( EquipmentManager.STICKER1 );
AdventureResult st2 = EquipmentManager.getEquipment( EquipmentManager.STICKER2 );
AdventureResult st3 = EquipmentManager.getEquipment( EquipmentManager.STICKER3 );
if ( st1 != EquipmentRequest.UNEQUIP || st2 != EquipmentRequest.UNEQUIP || st3 != EquipmentRequest.UNEQUIP )
{
desiredStream.println();
desiredStream.println( "Sticker 1: " + ShowDataCommand.getStickerText(
st1, EquipmentManager.getTurns( EquipmentManager.STICKER1 ) ) );
desiredStream.println( "Sticker 2: " + ShowDataCommand.getStickerText(
st2, EquipmentManager.getTurns( EquipmentManager.STICKER2 ) ) );
desiredStream.println( "Sticker 3: " + ShowDataCommand.getStickerText(
st3, EquipmentManager.getTurns( EquipmentManager.STICKER3 ) ) );
}
return;
}
if ( desiredData.equals( "encounters" ) )
{
desiredStream.println( "Encounter Listing: " );
desiredStream.println();
RequestLogger.printList( KoLConstants.encounterList, desiredStream );
return;
}
if ( desiredData.equals( "locations" ) )
{
desiredStream.println( "Visited Locations: " );
desiredStream.println();
RequestLogger.printList( KoLConstants.adventureList, desiredStream );
return;
}
if ( desiredData.equals( "counters" ) )
{
desiredStream.println( EatItemRequest.lastSemirareMessage() );
desiredStream.println();
String counters = TurnCounter.getUnexpiredCounters();
if ( counters.equals( "" ) )
{
desiredStream.println( "No active counters." );
}
else
{
desiredStream.println( "Unexpired counters:" );
desiredStream.println( counters );
}
desiredStream.println();
return;
}
List mainList =
desiredData.equals( "closet" ) ? KoLConstants.closet :
desiredData.equals( "summary" ) ? KoLConstants.tally :
desiredData.equals( "storage" ) ? KoLConstants.storage :
desiredData.equals( "display" ) ? KoLConstants.collection :
desiredData.equals( "outfits" ) ? EquipmentManager.getOutfits() :
desiredData.equals( "familiars" ) ? KoLCharacter.getFamiliarList() :
KoLConstants.inventory;
if ( desiredData.equals( "effects" ) )
{
mainList = KoLConstants.activeEffects;
AdventureResult[] effects = new AdventureResult[ mainList.size() ];
mainList.toArray( effects );
int nBuffs = 0;
for ( int i = 0; i < effects.length; ++i )
{
String skillName = UneffectRequest.effectToSkill( effects[ i ].getName() );
if ( SkillDatabase.contains( skillName ) )
{
int skillId = SkillDatabase.getSkillId( skillName );
if ( SkillDatabase.isAccordionThiefSong( skillId ) )
{
++nBuffs;
}
}
}
desiredStream.println( nBuffs + " of " + UseSkillRequest.songLimit() + " AT buffs active." );
}
if ( desiredData.startsWith( "skills" ) )
{
mainList = KoLConstants.availableSkills;
filter = filter.toLowerCase();
if ( filter.startsWith( "cast" ) )
{
mainList = new ArrayList();
mainList.addAll( KoLConstants.availableSkills );
List intersect = SkillDatabase.getSkillsByType( SkillDatabase.CASTABLE );
mainList.retainAll( intersect );
filter = "";
}
if ( filter.startsWith( "pass" ) )
{
mainList = new ArrayList();
mainList.addAll( KoLConstants.availableSkills );
List intersect = SkillDatabase.getSkillsByType( SkillDatabase.PASSIVE );
mainList.retainAll( intersect );
filter = "";
}
if ( filter.startsWith( "self" ) )
{
mainList = new ArrayList();
mainList.addAll( KoLConstants.availableSkills );
List intersect = SkillDatabase.getSkillsByType( SkillDatabase.SELF_ONLY );
mainList.retainAll( intersect );
filter = "";
}
if ( filter.startsWith( "buff" ) )
{
mainList = new ArrayList();
mainList.addAll( KoLConstants.availableSkills );
List intersect = SkillDatabase.getSkillsByType( SkillDatabase.BUFF );
mainList.retainAll( intersect );
filter = "";
}
if ( filter.startsWith( "combat" ) )
{
mainList = new ArrayList();
mainList.addAll( KoLConstants.availableSkills );
List intersect = SkillDatabase.getSkillsByType( SkillDatabase.COMBAT );
mainList.retainAll( intersect );
filter = "";
}
if ( filter.startsWith( "song" ) )
{
mainList = new ArrayList();
mainList.addAll( KoLConstants.availableSkills );
List intersect = SkillDatabase.getSkillsByType( SkillDatabase.SONG );
mainList.retainAll( intersect );
filter = "";
}
if ( filter.startsWith( "expression" ) )
{
mainList = new ArrayList();
mainList.addAll( KoLConstants.availableSkills );
List intersect = SkillDatabase.getSkillsByType( SkillDatabase.EXPRESSION );
mainList.retainAll( intersect );
filter = "";
}
if ( filter.startsWith( "walk" ) )
{
mainList = new ArrayList();
mainList.addAll( KoLConstants.availableSkills );
List intersect = SkillDatabase.getSkillsByType( SkillDatabase.WALK );
mainList.retainAll( intersect );
filter = "";
}
}
if ( filter.equals( "" ) )
{
RequestLogger.printList( mainList, desiredStream );
return;
}
String currentItem;
List resultList = new ArrayList();
Object[] items = new Object[ mainList.size() ];
mainList.toArray( items );
Matcher m = Pattern.compile( "<.*?>" ).matcher( "" );
for ( int i = 0; i < items.length; ++i )
{
currentItem = StringUtilities.getCanonicalName( items[ i ].toString() );
if ( currentItem.indexOf( filter ) != -1 ||
m.reset( currentItem ).replaceAll( "" ).indexOf( filter ) != -1 )
{
resultList.add( items[ i ] );
}
}
RequestLogger.printList( resultList, desiredStream );
}
private static final String getStatString( final int base, final int adjusted, final int tnp )
{
StringBuffer statString = new StringBuffer();
statString.append( KoLConstants.COMMA_FORMAT.format( adjusted ) );
if ( base != adjusted )
{
statString.append( " (" + KoLConstants.COMMA_FORMAT.format( base ) + ")" );
}
statString.append( ", tnp = " );
statString.append( KoLConstants.COMMA_FORMAT.format( tnp ) );
return statString.toString();
}
private static final String getStickerText( AdventureResult item, final int turns )
{
if ( !item.equals( EquipmentRequest.UNEQUIP ) )
{
item = item.getInstance( turns );
}
return item.toString();
}
}