/** * 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; import java.util.List; import net.java.dev.spellcast.utilities.LockableListModel; import net.sourceforge.kolmafia.AdventureResult; import net.sourceforge.kolmafia.CoinmasterData; import net.sourceforge.kolmafia.CoinmasterRegistry; import net.sourceforge.kolmafia.EdServantData; import net.sourceforge.kolmafia.FamiliarData; import net.sourceforge.kolmafia.KoLAdventure; import net.sourceforge.kolmafia.KoLCharacter; import net.sourceforge.kolmafia.KoLConstants.Stat; import net.sourceforge.kolmafia.MonsterData; import net.sourceforge.kolmafia.PastaThrallData; import net.sourceforge.kolmafia.VYKEACompanionData; import net.sourceforge.kolmafia.persistence.AdventureDatabase; import net.sourceforge.kolmafia.persistence.BountyDatabase; import net.sourceforge.kolmafia.persistence.EffectDatabase; import net.sourceforge.kolmafia.persistence.FamiliarDatabase; import net.sourceforge.kolmafia.persistence.ItemDatabase; import net.sourceforge.kolmafia.persistence.ItemFinder; import net.sourceforge.kolmafia.persistence.MonsterDatabase; import net.sourceforge.kolmafia.persistence.MonsterDatabase.Element; import net.sourceforge.kolmafia.persistence.MonsterDatabase.Phylum; import net.sourceforge.kolmafia.persistence.SkillDatabase; import net.sourceforge.kolmafia.preferences.Preferences; import net.sourceforge.kolmafia.request.EquipmentRequest; import net.sourceforge.kolmafia.request.UseSkillRequest; import net.sourceforge.kolmafia.textui.parsetree.AggregateType; import net.sourceforge.kolmafia.textui.parsetree.Type; import net.sourceforge.kolmafia.textui.parsetree.TypeList; import net.sourceforge.kolmafia.textui.parsetree.Value; import net.sourceforge.kolmafia.utilities.InputFieldUtilities; import net.sourceforge.kolmafia.utilities.StringUtilities; public class DataTypes { public static final int TYPE_ANY = 0; public static final int TYPE_VOID = 1; public static final int TYPE_BOOLEAN = 2; public static final int TYPE_INT = 3; public static final int TYPE_FLOAT = 4; public static final int TYPE_STRING = 5; public static final int TYPE_BUFFER = 6; public static final int TYPE_MATCHER = 7; public static final int TYPE_ITEM = 100; public static final int TYPE_LOCATION = 101; public static final int TYPE_CLASS = 102; public static final int TYPE_STAT = 103; public static final int TYPE_SKILL = 104; public static final int TYPE_EFFECT = 105; public static final int TYPE_FAMILIAR = 106; public static final int TYPE_SLOT = 107; public static final int TYPE_MONSTER = 108; public static final int TYPE_ELEMENT = 109; public static final int TYPE_COINMASTER = 110; public static final int TYPE_PHYLUM = 111; public static final int TYPE_THRALL = 112; public static final int TYPE_BOUNTY = 113; public static final int TYPE_SERVANT = 114; public static final int TYPE_VYKEA = 115; public static final int TYPE_STRICT_STRING = 1000; public static final int TYPE_AGGREGATE = 1001; public static final int TYPE_RECORD = 1002; public static final int TYPE_TYPEDEF = 1003; public static final String[] CLASSES = { "", KoLCharacter.SEAL_CLUBBER, KoLCharacter.TURTLE_TAMER, KoLCharacter.PASTAMANCER, KoLCharacter.SAUCEROR, KoLCharacter.DISCO_BANDIT, KoLCharacter.ACCORDION_THIEF, "", "", "", "", KoLCharacter.AVATAR_OF_BORIS, KoLCharacter.ZOMBIE_MASTER, "", KoLCharacter.AVATAR_OF_JARLSBERG, KoLCharacter.AVATAR_OF_SNEAKY_PETE, "", KoLCharacter.ED, KoLCharacter.COWPUNCHER, KoLCharacter.BEANSLINGER, KoLCharacter.SNAKE_OILER, "", "", KoLCharacter.GELATINOUS_NOOB, }; public static final Type ANY_TYPE = new Type( null, DataTypes.TYPE_ANY ); public static final Type VOID_TYPE = new Type( "void", DataTypes.TYPE_VOID ); public static final Type BOOLEAN_TYPE = new Type( "boolean", DataTypes.TYPE_BOOLEAN ); public static final Type INT_TYPE = new Type( "int", DataTypes.TYPE_INT ); public static final Type FLOAT_TYPE = new Type( "float", DataTypes.TYPE_FLOAT ); public static final Type STRING_TYPE = new Type( "string", DataTypes.TYPE_STRING ); public static final Type BUFFER_TYPE = new Type( "buffer", DataTypes.TYPE_BUFFER ); public static final Type MATCHER_TYPE = new Type( "matcher", DataTypes.TYPE_MATCHER ); public static final Type ITEM_TYPE = new Type( "item", DataTypes.TYPE_ITEM ); public static final Type LOCATION_TYPE = new Type( "location", DataTypes.TYPE_LOCATION ); public static final Type CLASS_TYPE = new Type( "class", DataTypes.TYPE_CLASS ); public static final Type STAT_TYPE = new Type( "stat", DataTypes.TYPE_STAT ); public static final Type SKILL_TYPE = new Type( "skill", DataTypes.TYPE_SKILL ); public static final Type EFFECT_TYPE = new Type( "effect", DataTypes.TYPE_EFFECT ); public static final Type FAMILIAR_TYPE = new Type( "familiar", DataTypes.TYPE_FAMILIAR ); public static final Type SLOT_TYPE = new Type( "slot", DataTypes.TYPE_SLOT ); public static final Type MONSTER_TYPE = new Type( "monster", DataTypes.TYPE_MONSTER ); public static final Type ELEMENT_TYPE = new Type( "element", DataTypes.TYPE_ELEMENT ); public static final Type COINMASTER_TYPE = new Type( "coinmaster", DataTypes.TYPE_COINMASTER ); public static final Type PHYLUM_TYPE = new Type( "phylum", DataTypes.TYPE_PHYLUM ); public static final Type BOUNTY_TYPE = new Type( "bounty", DataTypes.TYPE_BOUNTY ); public static final Type THRALL_TYPE = new Type( "thrall", DataTypes.TYPE_THRALL ); public static final Type SERVANT_TYPE = new Type( "servant", DataTypes.TYPE_SERVANT ); public static final Type VYKEA_TYPE = new Type( "vykea", DataTypes.TYPE_VYKEA ); public static final Type STRICT_STRING_TYPE = new Type( "strict_string", DataTypes.TYPE_STRICT_STRING ); public static final Type AGGREGATE_TYPE = new Type( "aggregate", DataTypes.TYPE_AGGREGATE ); // Map from ITEM -> INT public static final AggregateType ITEM_TO_INT_TYPE = new AggregateType( DataTypes.INT_TYPE, DataTypes.ITEM_TYPE ); // Map from STRING -> BOOLEAN public static final AggregateType STRING_TO_BOOLEAN_TYPE = new AggregateType( DataTypes.BOOLEAN_TYPE, DataTypes.STRING_TYPE ); // Map from STRING -> INT public static final AggregateType STRING_TO_INT_TYPE = new AggregateType( DataTypes.INT_TYPE, DataTypes.STRING_TYPE ); // Map from INT -> STRING public static final AggregateType INT_TO_STRING_TYPE = new AggregateType( DataTypes.STRING_TYPE, DataTypes.INT_TYPE ); public static final AggregateType REGEX_GROUP_TYPE = new AggregateType( new AggregateType( DataTypes.STRING_TYPE, DataTypes.INT_TYPE ), DataTypes.INT_TYPE ); // Common values public static final String[] BOOLEANS = { "true", "false" }; public static final String[] STAT_ARRAY = new String[ Stat.values().length ]; static { for ( int i = 0; i < Stat.values().length; i++ ) { STAT_ARRAY[ i ] = Stat.values()[i].toString(); } } public static final Value[] STAT_VALUES = { new Value( DataTypes.STAT_TYPE, Stat.MUSCLE.toString() ), new Value( DataTypes.STAT_TYPE, Stat.MYSTICALITY.toString() ), new Value( DataTypes.STAT_TYPE, Stat.MOXIE.toString() ), new Value( DataTypes.STAT_TYPE, Stat.SUBMUSCLE.toString() ), new Value( DataTypes.STAT_TYPE, Stat.SUBMYST.toString() ), new Value( DataTypes.STAT_TYPE, Stat.SUBMOXIE.toString() ), }; public static final Value VOID_VALUE = new Value(); public static final Value TRUE_VALUE = new Value( true ); public static final Value FALSE_VALUE = new Value( false ); public static final Value ZERO_VALUE = new Value( 0 ); public static final Value ONE_VALUE = new Value( 1 ); public static final Value ZERO_FLOAT_VALUE = new Value( 0.0 ); public static final Value MUSCLE_VALUE = DataTypes.STAT_VALUES[0]; public static final Value MYSTICALITY_VALUE = DataTypes.STAT_VALUES[1]; public static final Value MOXIE_VALUE = DataTypes.STAT_VALUES[2]; // Initial values for uninitialized variables // VOID_TYPE omitted since no variable can have that type public static final Value BOOLEAN_INIT = DataTypes.FALSE_VALUE; public static final Value INT_INIT = DataTypes.ZERO_VALUE; public static final Value FLOAT_INIT = DataTypes.ZERO_FLOAT_VALUE; public static final Value STRING_INIT = new Value( "" ); public static final Value ITEM_INIT = new Value( DataTypes.ITEM_TYPE, -1, "none" ); public static final Value LOCATION_INIT = new Value( DataTypes.LOCATION_TYPE, "none", (Object) null ); public static final Value CLASS_INIT = new Value( DataTypes.CLASS_TYPE, -1, "none" ); public static final Value STAT_INIT = new Value( DataTypes.STAT_TYPE, -1, "none" ); public static final Value SKILL_INIT = new Value( DataTypes.SKILL_TYPE, -1, "none" ); public static final Value EFFECT_INIT = new Value( DataTypes.EFFECT_TYPE, -1, "none" ); public static final Value FAMILIAR_INIT = new Value( DataTypes.FAMILIAR_TYPE, -1, "none" ); public static final Value SLOT_INIT = new Value( DataTypes.SLOT_TYPE, -1, "none" ); public static final Value MONSTER_INIT = new Value( DataTypes.MONSTER_TYPE, 0, "none", (Object) null ); public static final Value ELEMENT_INIT = new Value( DataTypes.ELEMENT_TYPE, "none", Element.NONE ); public static final Value COINMASTER_INIT = new Value( DataTypes.COINMASTER_TYPE, "none", (Object) null ); public static final Value PHYLUM_INIT = new Value( DataTypes.PHYLUM_TYPE, "none", Phylum.NONE ); public static final Value BOUNTY_INIT = new Value( DataTypes.BOUNTY_TYPE, "none", (Object) null ); public static final Value THRALL_INIT = new Value( DataTypes.THRALL_TYPE, 0, "none", (Object) null ); public static final Value SERVANT_INIT = new Value( DataTypes.SERVANT_TYPE, 0, "none", (Object) null ); public static final Value VYKEA_INIT = new Value( DataTypes.VYKEA_TYPE, 0, "none", VYKEACompanionData.NO_COMPANION ); public static final TypeList simpleTypes = new TypeList(); static { simpleTypes.add( DataTypes.VOID_TYPE ); simpleTypes.add( DataTypes.BOOLEAN_TYPE ); simpleTypes.add( DataTypes.INT_TYPE ); simpleTypes.add( DataTypes.FLOAT_TYPE ); simpleTypes.add( DataTypes.STRING_TYPE ); simpleTypes.add( DataTypes.BUFFER_TYPE ); simpleTypes.add( DataTypes.MATCHER_TYPE ); simpleTypes.add( DataTypes.AGGREGATE_TYPE ); simpleTypes.add( DataTypes.ITEM_TYPE ); simpleTypes.add( DataTypes.LOCATION_TYPE ); simpleTypes.add( DataTypes.CLASS_TYPE ); simpleTypes.add( DataTypes.STAT_TYPE ); simpleTypes.add( DataTypes.SKILL_TYPE ); simpleTypes.add( DataTypes.EFFECT_TYPE ); simpleTypes.add( DataTypes.FAMILIAR_TYPE ); simpleTypes.add( DataTypes.SLOT_TYPE ); simpleTypes.add( DataTypes.MONSTER_TYPE ); simpleTypes.add( DataTypes.ELEMENT_TYPE ); simpleTypes.add( DataTypes.COINMASTER_TYPE ); simpleTypes.add( DataTypes.PHYLUM_TYPE ); simpleTypes.add( DataTypes.BOUNTY_TYPE ); simpleTypes.add( DataTypes.THRALL_TYPE ); simpleTypes.add( DataTypes.SERVANT_TYPE ); simpleTypes.add( DataTypes.VYKEA_TYPE ); } // For each simple data type X, we supply: // public static final ScriptValue parseXValue( String name ); public static final Value parseBooleanValue( final String name, final boolean returnDefault ) { if ( name.equalsIgnoreCase( "true" ) ) { return DataTypes.TRUE_VALUE; } if ( name.equalsIgnoreCase( "false" ) ) { return DataTypes.FALSE_VALUE; } if ( returnDefault ) { return makeBooleanValue( StringUtilities.parseInt( name ) ); } return null; } public static final Value parseIntValue( final String name, final boolean returnDefault ) { try { return new Value( StringUtilities.parseLong( name ) ); } catch ( NumberFormatException e ) { return returnDefault ? DataTypes.ZERO_VALUE : null; } } public static final Value parseFloatValue( final String name, final boolean returnDefault ) { try { return new Value( StringUtilities.parseDouble( name ) ); } catch ( NumberFormatException e ) { return returnDefault ? DataTypes.ZERO_FLOAT_VALUE : null; } } public static final Value parseStringValue( final String name ) { return new Value( name ); } public static final Value parseItemValue( String name, final boolean returnDefault ) { return DataTypes.parseItemValue( name, returnDefault, false ); } public static final Value parseItemValue( String name, final boolean returnDefault, final boolean resolveAliases ) { if ( name == null || name.trim().equals( "" ) ) { return returnDefault ? DataTypes.ITEM_INIT : null; } if ( name.equalsIgnoreCase( "none" ) ) { return DataTypes.ITEM_INIT; } // Allow for an item number to be specified // inside of the "item" construct. if ( StringUtilities.isNumeric( name ) ) { int itemId = StringUtilities.parseInt( name ); name = ItemDatabase.getItemDataName( itemId ); if ( name == null ) { return returnDefault ? DataTypes.ITEM_INIT : null; } return DataTypes.makeNormalizedItem( itemId, name ); } // Otherwise, let ItemDatabase parse the name using fuzzy matching. int itemId = ItemDatabase.getItemId( name ); if ( itemId == -1 && resolveAliases ) { AdventureResult item = new AdventureResult( name, itemId, 1, false ); itemId = item.resolveBangPotion().getItemId(); } if ( itemId == -1 ) { return returnDefault ? DataTypes.ITEM_INIT : null; } name = ItemDatabase.getItemDataName( itemId ); return DataTypes.makeNormalizedItem( itemId, name ); } public static final Value parseLocationValue( final String name, final boolean returnDefault ) { if ( name == null || name.equals( "" ) ) { return returnDefault ? DataTypes.LOCATION_INIT : null; } if ( name.equalsIgnoreCase( "none" ) ) { return DataTypes.LOCATION_INIT; } KoLAdventure content = AdventureDatabase.getAdventure( name ); if ( content == null ) { return returnDefault ? DataTypes.LOCATION_INIT : null; } return new Value( DataTypes.LOCATION_TYPE, content.getAdventureName(), (Object) content ); } public static final Value parseLocationValue( final int adv, final boolean returnDefault ) { if ( adv <= 0 ) { return DataTypes.LOCATION_INIT; } KoLAdventure content = AdventureDatabase.getAdventureByURL( "adventure.php?snarfblat=" + adv ); if ( content == null ) { return returnDefault ? DataTypes.LOCATION_INIT : null; } return new Value( DataTypes.LOCATION_TYPE, content.getAdventureName(), (Object) content ); } public static final int classToInt( final String name ) { for ( int i = 0; i < DataTypes.CLASSES.length; ++i ) { if ( name.equalsIgnoreCase( DataTypes.CLASSES[ i ] ) ) { return i; } } return -1; } public static final Value parseClassValue( final String name, final boolean returnDefault ) { if ( name == null || name.equals( "" ) ) { return returnDefault ? DataTypes.CLASS_INIT : null; } if ( name.equalsIgnoreCase( "none" ) ) { return DataTypes.CLASS_INIT; } int num = DataTypes.classToInt( name ); if ( num < 0 ) { return returnDefault ? DataTypes.CLASS_INIT: null; } return new Value( DataTypes.CLASS_TYPE, num, DataTypes.CLASSES[ num ] ); } public static final Value parseStatValue( final String name, final boolean returnDefault ) { if ( name == null || name.equals( "" ) ) { return returnDefault ? DataTypes.STAT_INIT : null; } if ( name.equalsIgnoreCase( "none" ) ) { return DataTypes.STAT_INIT; } for ( int i = 0; i < DataTypes.STAT_VALUES.length; ++i ) { if ( name.equalsIgnoreCase( DataTypes.STAT_VALUES[ i ].toString() ) ) { return STAT_VALUES[ i ]; } } return returnDefault ? DataTypes.STAT_INIT : null; } public static final Value parseSkillValue( String name, final boolean returnDefault ) { if ( name == null || name.equals( "" ) ) { return returnDefault ? DataTypes.SKILL_INIT : null; } if ( name.equalsIgnoreCase( "none" ) ) { return DataTypes.SKILL_INIT; } List<String> skills = SkillDatabase.getMatchingNames( name ); if ( skills.isEmpty() ) { return returnDefault ? DataTypes.SKILL_INIT : null; } int num = SkillDatabase.getSkillId( skills.get( 0 ) ); name = SkillDatabase.getSkillDataName( num ); return new Value( DataTypes.SKILL_TYPE, num, name ); } public static final Value parseEffectValue( String name, final boolean returnDefault ) { if ( name == null || name.equals( "" ) ) { return returnDefault ? DataTypes.EFFECT_INIT : null; } if ( name.equalsIgnoreCase( "none" ) ) { return DataTypes.EFFECT_INIT; } // Allow for an effect number to be specified // inside of the "effect" construct. int effectId; if ( StringUtilities.isNumeric( name ) ) { effectId = StringUtilities.parseInt( name ); name = EffectDatabase.getEffectName( effectId ); if ( name == null ) { return returnDefault ? DataTypes.EFFECT_INIT : null; } return DataTypes.makeNormalizedEffect( effectId, name ); } effectId = EffectDatabase.getEffectId( name ); if ( effectId == -1 ) { return returnDefault ? DataTypes.EFFECT_INIT : null; } name = EffectDatabase.getEffectName( effectId ); return DataTypes.makeNormalizedEffect( effectId, name ); } public static final Value parseFamiliarValue( String name, final boolean returnDefault ) { if ( name == null || name.equals( "" ) ) { return returnDefault ? DataTypes.FAMILIAR_INIT : null; } if ( name.equalsIgnoreCase( "none" ) ) { return DataTypes.FAMILIAR_INIT; } int num = FamiliarDatabase.getFamiliarId( name ); if ( num == -1 ) { return returnDefault ? DataTypes.FAMILIAR_INIT : null; } name = FamiliarDatabase.getFamiliarName( num ); return new Value( DataTypes.FAMILIAR_TYPE, num, name ); } public static final Value parseSlotValue( String name, final boolean returnDefault ) { if ( name == null || name.equals( "" ) ) { return returnDefault ? DataTypes.SLOT_INIT : null; } if ( name.equalsIgnoreCase( "none" ) ) { return DataTypes.SLOT_INIT; } int num = EquipmentRequest.slotNumber( name ); if ( num == -1 ) { return returnDefault ? DataTypes.SLOT_INIT : null; } name = EquipmentRequest.slotNames[ num ]; return new Value( DataTypes.SLOT_TYPE, num, name ); } public static final Value parseMonsterValue( final String name, final boolean returnDefault ) { if ( name == null || name.equals( "" ) ) { return returnDefault ? DataTypes.MONSTER_INIT : null; } if ( name.equalsIgnoreCase( "none" ) ) { return DataTypes.MONSTER_INIT; } MonsterData monster = MonsterDatabase.findMonster( name, true ); if ( monster == null ) { return returnDefault ? DataTypes.MONSTER_INIT : null; } return new Value( DataTypes.MONSTER_TYPE, monster.getId(), monster.getName(), monster ); } public static final Value parseElementValue( String name, final boolean returnDefault ) { if ( name == null || name.equals( "" ) ) { return returnDefault ? DataTypes.ELEMENT_INIT : null; } if ( name.equalsIgnoreCase( "none" ) ) { return DataTypes.ELEMENT_INIT; } Element elem = MonsterDatabase.stringToElement( name ); if ( elem == Element.NONE ) { return returnDefault ? DataTypes.ELEMENT_INIT : null; } name = elem.toString(); return new Value( DataTypes.ELEMENT_TYPE, name, elem ); } public static final Value parsePhylumValue( String name, final boolean returnDefault ) { if ( name == null || name.equals( "" ) ) { return returnDefault ? DataTypes.PHYLUM_INIT : null; } if ( name.equalsIgnoreCase( "none" ) ) { return DataTypes.PHYLUM_INIT; } Phylum phylum = MonsterDatabase.phylumNumber( name ); if ( phylum == Phylum.NONE ) { return returnDefault ? DataTypes.PHYLUM_INIT : null; } name = phylum.toString(); return new Value( DataTypes.PHYLUM_TYPE, name, phylum ); } public static final Value parseThrallValue( String name, final boolean returnDefault ) { if ( name == null || name.equals( "" ) ) { return returnDefault ? DataTypes.THRALL_INIT : null; } if ( name.equalsIgnoreCase( "none" ) ) { return DataTypes.THRALL_INIT; } Object [] data = PastaThrallData.typeToData( name ); if ( data == null ) { return returnDefault ? DataTypes.THRALL_INIT : null; } int id = PastaThrallData.dataToId( data ); name = PastaThrallData.dataToType( data ); return new Value( DataTypes.THRALL_TYPE, id, name, data ); } public static final Value parseServantValue( String name, final boolean returnDefault ) { if ( name == null || name.equals( "" ) ) { return returnDefault ? DataTypes.SERVANT_INIT : null; } if ( name.equalsIgnoreCase( "none" ) ) { return DataTypes.SERVANT_INIT; } Object [] data = EdServantData.typeToData( name ); if ( data == null ) { return returnDefault ? DataTypes.SERVANT_INIT : null; } int id = EdServantData.dataToId( data ); name = EdServantData.dataToType( data ); return new Value( DataTypes.SERVANT_TYPE, id, name, data ); } public static final Value parseVykeaValue( String name, final boolean returnDefault ) { if ( name == null || name.equals( "" ) ) { return returnDefault ? DataTypes.VYKEA_INIT : null; } if ( name.equalsIgnoreCase( "none" ) ) { return DataTypes.VYKEA_INIT; } VYKEACompanionData companion = VYKEACompanionData.fromString( name ); if ( companion == null ) { return returnDefault ? DataTypes.VYKEA_INIT : null; } return new Value( DataTypes.VYKEA_TYPE, companion.getType(), name, companion ); } public static final Value parseBountyValue( String name, final boolean returnDefault ) { if ( name == null || name.equals( "" ) ) { return returnDefault ? DataTypes.BOUNTY_INIT : null; } if ( name.equals( "none" ) ) { return DataTypes.BOUNTY_INIT; } List<String> bounties = BountyDatabase.getMatchingNames( name ); if ( bounties.size() != 1 ) { return returnDefault ? DataTypes.BOUNTY_INIT : null; } String canonical = bounties.get( 0 ); return new Value( DataTypes.BOUNTY_TYPE, BountyDatabase.canonicalToName( canonical ) ); } public static final Value parseCoinmasterValue( String name, final boolean returnDefault ) { if ( name == null || name.equals( "" ) ) { return returnDefault ? DataTypes.COINMASTER_INIT : null; } if ( name.equalsIgnoreCase( "none" ) ) { return DataTypes.COINMASTER_INIT; } CoinmasterData content = CoinmasterRegistry.findCoinmaster( name ); if ( content == null ) { return returnDefault ? DataTypes.COINMASTER_INIT : null; } return new Value( DataTypes.COINMASTER_TYPE, content.getMaster(), (Object) content ); } public static final Value makeCoinmasterValue( final CoinmasterData data ) { if ( data == null ) { return DataTypes.COINMASTER_INIT; } return new Value( DataTypes.COINMASTER_TYPE, data.getMaster(), (Object) data ); } public static final Value parseValue( final Type type, final String name, final boolean returnDefault ) { return type.parseValue( name, returnDefault ); } public static final Value coerceValue( final Type type, final Object object, final boolean returnDefault ) { return type.coerceValue( object, returnDefault ); } // For data types which map to integers, also supply: // public static final ScriptValue makeXValue( int num ) public static final Value makeIntValue( final boolean val ) { return val ? ONE_VALUE : ZERO_VALUE; } public static final Value makeIntValue( final long val ) { return val == 0 ? ZERO_VALUE : val == 1 ? ONE_VALUE : new Value( val ); } public static final Value makeFloatValue( final double val ) { return val == 0.0 ? ZERO_FLOAT_VALUE : new Value( val ); } public static final Value makeStringValue( final String val ) { return val == null || val.equals( "" ) ? STRING_INIT : new Value( val ); } public static final Value makeBooleanValue( final int num ) { return makeBooleanValue( num != 0 ); } public static final Value makeBooleanValue( final boolean value ) { return value ? DataTypes.TRUE_VALUE : DataTypes.FALSE_VALUE; } private static final Value makeNormalizedItem( final int num, String name ) { if ( num == -1 ) { return DataTypes.ITEM_INIT; } if ( name == null ) { name = "[" + String.valueOf( num ) + "]"; } int[] itemIds = ItemDatabase.getItemIds( name, 1, false ); if ( itemIds != null && itemIds.length > 1 ) { name = "[" + String.valueOf( num ) + "]" + name; } return new Value( DataTypes.ITEM_TYPE, num, name ); } public static final Value makeItemValue( final int num, final boolean returnDefault ) { String name = ItemDatabase.getItemDataName( num ); if ( name == null ) { return returnDefault ? DataTypes.ITEM_INIT : null; } return DataTypes.makeNormalizedItem( num, name ); } public static final Value makeItemValue( String name ) { if ( name == null ) { return DataTypes.ITEM_INIT; } int num = ItemDatabase.getItemId( name ); if ( num == -1 ) { return DataTypes.ITEM_INIT; } name = ItemDatabase.getItemDataName( num ); return DataTypes.makeNormalizedItem( num, name ); } public static final Value makeItemValue( final AdventureResult ar ) { int num = ar.getItemId(); String name = ItemDatabase.getItemDataName( num ); return DataTypes.makeNormalizedItem( num, name ); } public static final Value makeClassValue( final String name ) { return new Value( DataTypes.CLASS_TYPE, DataTypes.classToInt( name ), name ); } public static final Value makeSkillValue( final int num, final boolean returnDefault ) { String name = SkillDatabase.getSkillDataName( num ); if ( name == null ) { return returnDefault ? DataTypes.SKILL_INIT : null; } return new Value( DataTypes.SKILL_TYPE, num, name ); } private static final Value makeNormalizedEffect( final int num, String name ) { if ( num == -1 ) { return DataTypes.EFFECT_INIT; } if ( name == null ) { name = "[" + String.valueOf( num ) + "]"; } int[] effectIds = EffectDatabase.getEffectIds( name, false ); if ( effectIds != null && effectIds.length > 1 ) { name = "[" + String.valueOf( num ) + "]" + name; } return new Value( DataTypes.EFFECT_TYPE, num, name ); } public static final Value makeEffectValue( final int num, final boolean returnDefault ) { String name = EffectDatabase.getEffectName( num ); if ( name == null ) { return returnDefault ? DataTypes.EFFECT_INIT : null; } return DataTypes.makeNormalizedEffect( num, name ); } public static final Value makeFamiliarValue( final int num, final boolean returnDefault ) { String name = FamiliarDatabase.getFamiliarName( num ); if ( name == null ) { return returnDefault ? DataTypes.FAMILIAR_INIT : null; } return new Value( DataTypes.FAMILIAR_TYPE, num, name ); } public static final Value makeMonsterValue( final int num, final boolean returnDefault ) { MonsterData monster = MonsterDatabase.findMonsterById( num ); if ( monster == null ) { return returnDefault? DataTypes.MONSTER_INIT : null; } return new Value( DataTypes.MONSTER_TYPE, monster.getId(), monster.getName(), monster ); } public static final Value makeElementValue( Element elem, final boolean returnDefault ) { if ( elem == Element.NONE ) { return returnDefault ? DataTypes.ELEMENT_INIT : null; } return new Value( DataTypes.ELEMENT_TYPE, elem.toString(), elem ); } public static final Value makeThrallValue( final PastaThrallData thrall, final boolean returnDefault ) { if ( thrall == null || thrall == PastaThrallData.NO_THRALL ) { return returnDefault ? DataTypes.THRALL_INIT : null; } return new Value( DataTypes.THRALL_TYPE, thrall.getId(), thrall.getType(), thrall.getData() ); } public static final Value makeThrallValue( final int num, final boolean returnDefault ) { Object [] data = PastaThrallData.idToData( num ); if ( data == null ) { return returnDefault ? DataTypes.THRALL_INIT : null; } String name = PastaThrallData.dataToType( data ); return new Value( DataTypes.THRALL_TYPE, num, name, data ); } public static final Value makeServantValue( final EdServantData servant, final boolean returnDefault ) { if ( servant == null || servant == EdServantData.NO_SERVANT ) { return returnDefault ? DataTypes.SERVANT_INIT : null; } return new Value( DataTypes.SERVANT_TYPE, servant.getId(), servant.getType(), servant.getData() ); } public static final Value makeServantValue( final int num, final boolean returnDefault ) { Object [] data = EdServantData.idToData( num ); if ( data == null ) { return returnDefault ? DataTypes.SERVANT_INIT : null; } String name = EdServantData.dataToType( data ); return new Value( DataTypes.SERVANT_TYPE, num, name, data ); } public static final Value makeVykeaValue( final VYKEACompanionData companion, final boolean returnDefault ) { if ( companion == null || companion == VYKEACompanionData.NO_COMPANION ) { return returnDefault ? DataTypes.VYKEA_INIT : null; } return new Value( DataTypes.VYKEA_TYPE, companion.getType(), companion.toString(), companion ); } public static final Value makeMonsterValue( final MonsterData monster ) { if ( monster == null ) { return DataTypes.MONSTER_INIT; } return new Value( DataTypes.MONSTER_TYPE, monster.getId(), monster.getName(), monster ); } // Also supply: // public static final String promptForValue() public static String promptForValue( final Type type, final String name ) { return DataTypes.promptForValue( type, "Please input a value for " + type + " " + name, name ); } private static String promptForValue( final Type type, final String message, final String name ) { switch ( type.getType() ) { case TYPE_BOOLEAN: return (String) InputFieldUtilities.input( message, DataTypes.BOOLEANS ); case TYPE_LOCATION: { LockableListModel<KoLAdventure> inputs = AdventureDatabase.getAsLockableListModel(); KoLAdventure initial = AdventureDatabase.getAdventure( Preferences.getString( "lastAdventure" ) ); KoLAdventure value = (KoLAdventure) InputFieldUtilities.input( message, inputs, initial ); return value == null ? null : value.getAdventureName(); } case TYPE_SKILL: { Object [] inputs = SkillDatabase.getSkillsByType( SkillDatabase.CASTABLE ).toArray(); UseSkillRequest value = (UseSkillRequest) InputFieldUtilities.input( message, inputs ); return value == null ? null : value.getSkillName(); } case TYPE_FAMILIAR: { Object [] inputs = KoLCharacter.getFamiliarList().toArray(); FamiliarData initial = KoLCharacter.getFamiliar(); FamiliarData value = (FamiliarData) InputFieldUtilities.input( message, inputs, initial ); return value == null ? null : value.getRace(); } case TYPE_SLOT: return (String) InputFieldUtilities.input( message, EquipmentRequest.slotNames ); case TYPE_ELEMENT: return (String) InputFieldUtilities.input( message, MonsterDatabase.ELEMENT_ARRAY ); case TYPE_COINMASTER: return (String) InputFieldUtilities.input( message, CoinmasterRegistry.MASTERS ); case TYPE_PHYLUM: return (String) InputFieldUtilities.input( message, MonsterDatabase.PHYLUM_ARRAY ); case TYPE_THRALL: return (String) InputFieldUtilities.input( message, PastaThrallData.THRALL_ARRAY ); case TYPE_SERVANT: return (String) InputFieldUtilities.input( message, EdServantData.SERVANT_ARRAY ); case TYPE_VYKEA: return (String) InputFieldUtilities.input( message, VYKEACompanionData.VYKEA ); case TYPE_CLASS: return (String) InputFieldUtilities.input( message, DataTypes.CLASSES ); case TYPE_STAT: return (String) InputFieldUtilities.input( message, DataTypes.STAT_ARRAY ); case TYPE_INT: case TYPE_FLOAT: case TYPE_STRING: case TYPE_ITEM: case TYPE_EFFECT: case TYPE_MONSTER: return InputFieldUtilities.input( message ); default: throw new ScriptException( "Internal error: Illegal type for main() parameter" ); } } }