All Downloads are FREE. Search and download functionalities are using the official Maven repository.

chesspresso.position.NAG Maven / Gradle / Ivy

/*
 * Chessplorer-Lib - an open source chess library written in Java
 * Copyright (C) 2016 Chessplorer.org
 * Copyright (C) 2012-2016 Gerhard Kalab
 * Copyright (C) 2002-2003 Bernhard Seybold
 *
 * This software is published under the terms of the LGPL Software License,
 * a copy of which has been included with this distribution in the LICENSE.txt
 * file.
 *
 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
 */
package chesspresso.position;

import java.util.Locale;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.xnap.commons.i18n.I18n;
import org.xnap.commons.i18n.I18nFactory;


/**
 * Support for NAG (Numeric Annotation Glyphs).
 *
 * @author Bernhard Seybold
 * @author Andreas Rudolph
 */
public enum NAG
{
    /**
     * null annotation
     */
    NULL_ANNOTATION( (short) 0, null ),

    /**
     * good move
     */
    GOOD_MOVE( (short) 1, "!" ),

    /**
     * poor move
     */
    POOR_MOVE( (short) 2, "?" ),

    /**
     * very good move
     */
    VERY_GOOD_MOVE( (short) 3, "!!" ),

    /**
     * very poor move
     */
    VERY_POOR_MOVE( (short) 4, "??" ),

    /**
     * speculative move
     */
    SPECULATIVE_MOVE( (short) 5, "!?" ),

    /**
     * questionable move
     */
    QUESTIONABLE_MOVE( (short) 6, "?!" ),

    /**
     * forced move (all others lose quickly)
     */
    FORCED_MOVE( (short) 7, null ),

    /**
     * only move (no reasonable alternatives)
     */
    ONLY_MOVE( (short) 8, null ),

    /**
     * worst move
     */
    WORST_MOVE( (short) 9, null ),

    /**
     * drawish position
     */
    DRAWISH_POSITION( (short) 10, null ),

    /**
     * equal chances, quiet position
     */
    EQUAL_CHANCES_QUIET_POSITION( (short) 11, null ),

    /**
     * equal chances, active position
     */
    EQUAL_CHANCES_ACTIVE_POSITION( (short) 12, null ),

    /**
     * unclear position
     */
    UNCLEAR_POSITION( (short) 13, null ),

    /**
     * White has a slight advantage
     */
    WHITE_HAS_SLIGHT_ADVANTAGE( (short) 14, "+=" ),

    /**
     * Black has a slight advantage
     */
    BLACK_HAS_SLIGHT_ADVANTAGE( (short) 15, "=+" ),

    /**
     * White has a moderate advantage
     */
    WHITE_HAS_MODERATE_ADVANTAGE( (short) 16, null ),

    /**
     * Black has a moderate advantage
     */
    BLACK_HAS_MODERATE_ADVANTAGE( (short) 17, null ),

    /**
     * White has a decisive advantage
     */
    WHITE_HAS_DECISIVE_ADVANTAGE( (short) 18, "+-" ),

    /**
     * Black has a decisive advantage
     */
    BLACK_HAS_DECISIVE_ADVANTAGE( (short) 19, "-+" ),

    /**
     * White has a crushing advantage (Black should resign)
     */
    WHITE_HAS_CRUSHING_ADVANTAGE( (short) 20, null ),

    /**
     * Black has a crushing advantage (White should resign)
     */
    BLACK_HAS_CRUSHING_ADVANTAGE( (short) 21, null ),

    /**
     * White is in zugzwang
     */
    WHITE_IN_ZUGZWANG( (short) 22, null ),

    /**
     * Black is in zugzwang
     */
    BLACK_IN_ZUGZWANG( (short) 23, null ),

    /**
     * White has a slight space advantage
     */
    WHITE_HAS_SLIGHT_SPACE_ADVANTAGE( (short) 24, null ),

    /**
     * Black has a slight space advantage
     */
    BLACK_HAS_SLIGHT_SPACE_ADVANTAGE( (short) 25, null ),

    /**
     * White has a moderate space advantage
     */
    WHITE_HAS_MODERATE_SPACE_ADVANTAGE( (short) 26, null ),

    /**
     * Black has a moderate space advantage
     */
    BLACK_HAS_MODERATE_SPACE_ADVANTAGE( (short) 27, null ),

    /**
     * White has a decisive space advantage
     */
    WHITE_HAS_DECISIVE_SPACE_ADVANTAGE( (short) 28, null ),

    /**
     * Black has a decisive space advantage
     */
    BLACK_HAS_DECISIVE_SPACE_ADVANTAGE( (short) 29, null ),

    /**
     * White has a slight time (development) advantage
     */
    WHITE_HAS_SLIGHT_DEVELOPMENT_ADVANTAGE( (short) 30, null ),

    /**
     * Black has a slight time (development) advantage
     */
    BLACK_HAS_SLIGHT_DEVELOPMENT_ADVANTAGE( (short) 31, null ),

    /**
     * White has a moderate time (development) advantage
     */
    WHITE_HAS_MODERATE_DEVELOPMENT_ADVANTAGE( (short) 32, null ),

    /**
     * Black has a moderate time (development) advantage
     */
    BLACK_HAS_MODERATE_DEVELOPMENT_ADVANTAGE( (short) 33, null ),

    /**
     * White has a decisive time (development) advantage
     */
    WHITE_HAS_DECISIVE_DEVELOPMENT_ADVANTAGE( (short) 34, null ),

    /**
     * Black has a decisive time (development) advantage
     */
    BLACK_HAS_DECISIVE_DEVELOPMENT_ADVANTAGE( (short) 35, null ),

    /**
     * White has the initiative
     */
    WHITE_HAS_INITIAVE( (short) 36, null ),

    /**
     * Black has the initiative
     */
    BLACK_HAS_INITIAVE( (short) 37, null ),

    /**
     * White has a lasting initiative
     */
    WHITE_HAS_LASTING_INITIAVE( (short) 38, null ),

    /**
     * Black has a lasting initiative
     */
    BLACK_HAS_LASTING_INITIAVE( (short) 39, null ),

    /**
     * White has the attack
     */
    WHITE_HAS_ATTACK( (short) 40, null ),

    /**
     * Black has the attack
     */
    BLACK_HAS_ATTACK( (short) 41, null ),

    /**
     * White has insufficient compensation for material deficit
     */
    WHITE_HAS_INSUFFICIENT_COMPENSATION_FOR_MATERIAL_DEFICIT( (short) 42, null ),

    /**
     * Black has insufficient compensation for material deficit
     */
    BLACK_HAS_INSUFFICIENT_COMPENSATION_FOR_MATERIAL_DEFICIT( (short) 43, null ),

    /**
     * White has sufficient compensation for material deficit
     */
    WHITE_HAS_SUFFICIENT_COMPENSATION_FOR_MATERIAL_DEFICIT( (short) 44, null ),

    /**
     * Black has sufficient compensation for material deficit
     */
    BLACK_HAS_SUFFICIENT_COMPENSATION_FOR_MATERIAL_DEFICIT( (short) 45, null ),

    /**
     * White has more than adequate compensation for material deficit
     */
    WHITE_HAS_ADEQUATE_COMPENSATION_FOR_MATERIAL_DEFICIT( (short) 46, null ),

    /**
     * Black has more than adequate compensation for material deficit
     */
    BLACK_HAS_ADEQUATE_COMPENSATION_FOR_MATERIAL_DEFICIT( (short) 47, null ),

    /**
     * White has a slight center control advantage
     */
    WHITE_HAS_SLIGHT_CENTER_CONTROL_ADVANTAGE( (short) 48, null ),

    /**
     * Black has a slight center control advantage
     */
    BLACK_HAS_SLIGHT_CENTER_CONTROL_ADVANTAGE( (short) 49, null ),

    /**
     * White has a moderate center control advantage
     */
    WHITE_HAS_MODERATE_CENTER_CONTROL_ADVANTAGE( (short) 50, null ),

    /**
     * Black has a moderate center control advantage
     */
    BLACK_HAS_MODERATE_CENTER_CONTROL_ADVANTAGE( (short) 51, null ),

    /**
     * White has a decisive center control advantage
     */
    WHITE_HAS_DECISIVE_CENTER_CONTROL_ADVANTAGE( (short) 52, null ),

    /**
     * Black has a decisive center control advantage
     */
    BLACK_HAS_DECISIVE_CENTER_CONTROL_ADVANTAGE( (short) 53, null ),

    /**
     * White has a slight kingside control advantage
     */
    WHITE_HAS_SLIGHT_KINGSIDE_CONTROL_ADVANTAGE( (short) 54, null ),

    /**
     * Black has a slight kingside control advantage
     */
    BLACK_HAS_SLIGHT_KINGSIDE_CONTROL_ADVANTAGE( (short) 55, null ),

    /**
     * White has a moderate kingside control advantage
     */
    WHITE_HAS_MODERATE_KINGSIDE_CONTROL_ADVANTAGE( (short) 56, null ),

    /**
     * Black has a moderate kingside control advantage
     */
    BLACK_HAS_MODERATE_KINGSIDE_CONTROL_ADVANTAGE( (short) 57, null ),

    /**
     * White has a decisive kingside control advantage
     */
    WHITE_HAS_DECISIVE_KINGSIDE_CONTROL_ADVANTAGE( (short) 58, null ),

    /**
     * Black has a decisive kingside control advantage
     */
    BLACK_HAS_DECISIVE_KINGSIDE_CONTROL_ADVANTAGE( (short) 59, null ),

    /**
     * White has a slight queenside control advantage
     */
    WHITE_HAS_SLIGHT_QUEENSIDE_CONTROL_ADVANTAGE( (short) 60, null ),

    /**
     * Black has a slight queenside control advantage
     */
    BLACK_HAS_SLIGHT_QUEENSIDE_CONTROL_ADVANTAGE( (short) 61, null ),

    /**
     * White has a moderate queenside control advantage
     */
    WHITE_HAS_MODERATE_QUEENSIDE_CONTROL_ADVANTAGE( (short) 62, null ),

    /**
     * Black has a moderate queenside control advantage
     */
    BLACK_HAS_MODERATE_QUEENSIDE_CONTROL_ADVANTAGE( (short) 63, null ),

    /**
     * White has a decisive queenside control advantage
     */
    WHITE_HAS_DECISIVE_QUEENSIDE_CONTROL_ADVANTAGE( (short) 64, null ),

    /**
     * Black has a decisive queenside control advantage
     */
    BLACK_HAS_DECISIVE_QUEENSIDE_CONTROL_ADVANTAGE( (short) 65, null ),

    /**
     * White has a vulnerable first rank
     */
    WHITE_HAS_VULNERABLE_FIRST_RANK( (short) 66, null ),

    /**
     * Black has a vulnerable first rank
     */
    BLACK_HAS_VULNERABLE_FIRST_RANK( (short) 67, null ),

    /**
     * White has a well protected first rank
     */
    WHITE_HAS_WELL_PROTECTED_FIRST_RANK( (short) 68, null ),

    /**
     * Black has a well protected first rank
     */
    BLACK_HAS_WELL_PROTECTED_FIRST_RANK( (short) 69, null ),

    /**
     * White has a poorly protected king
     */
    WHITE_HAS_POORLY_PROTECTED_KING( (short) 70, null ),

    /**
     * Black has a poorly protected king
     */
    BLACK_HAS_POORLY_PROTECTED_KING( (short) 71, null ),

    /**
     * White has a well protected king
     */
    WHITE_HAS_WELL_PROTECTED_KING( (short) 72, null ),

    /**
     * Black has a well protected king
     */
    BLACK_HAS_WELL_PROTECTED_KING( (short) 73, null ),

    /**
     * White has a poorly placed king
     */
    WHITE_HAS_POOR_KING_PLACEMENT( (short) 74, null ),

    /**
     * Black has a poorly placed king
     */
    BLACK_HAS_POOR_KING_PLACEMENT( (short) 75, null ),

    /**
     * White has a well placed king
     */
    WHITE_HAS_GOOD_KING_PLACEMENT( (short) 76, null ),

    /**
     * Black has a well placed king
     */
    BLACK_HAS_GOOD_KING_PLACEMENT( (short) 77, null ),

    /**
     * White has a very weak pawn structure
     */
    WHITE_HAS_VERY_WEAK_PAWN_STRUCTURE( (short) 78, null ),

    /**
     * Black has a very weak pawn structure
     */
    BLACK_HAS_VERY_WEAK_PAWN_STRUCTURE( (short) 79, null ),

    /**
     * White has a moderately weak pawn structure
     */
    WHITE_HAS_MODERATELY_WEAK_PAWN_STRUCTURE( (short) 80, null ),

    /**
     * Black has a moderately weak pawn structure
     */
    BLACK_HAS_MODERATELY_WEAK_PAWN_STRUCTURE( (short) 81, null ),

    /**
     * White has a moderately strong pawn structure
     */
    WHITE_HAS_MODERATELY_STRONG_PAWN_STRUCTURE( (short) 82, null ),

    /**
     * Black has a moderately strong pawn structure
     */
    BLACK_HAS_MODERATELY_STRONG_PAWN_STRUCTURE( (short) 83, null ),

    /**
     * White has a very strong pawn structure
     */
    WHITE_HAS_VERY_STRONG_PAWN_STRUCTURE( (short) 84, null ),

    /**
     * Black has a very strong pawn structure
     */
    BLACK_HAS_VERY_STRONG_PAWN_STRUCTURE( (short) 85, null ),

    /**
     * White has poor knight placement
     */
    WHITE_HAS_POOR_KNIGHT_PLACEMENT( (short) 86, null ),

    /**
     * Black has poor knight placement
     */
    BLACK_HAS_POOR_KNIGHT_PLACEMENT( (short) 87, null ),

    /**
     * White has good knight placement
     */
    WHITE_HAS_GOOD_KNIGHT_PLACEMENT( (short) 88, null ),

    /**
     * Black has good knight placement
     */
    BLACK_HAS_GOOD_KNIGHT_PLACEMENT( (short) 89, null ),

    /**
     * White has poor bishop placement
     */
    WHITE_HAS_POOR_BISHOP_PLACEMENT( (short) 90, null ),

    /**
     * Black has poor bishop placement
     */
    BLACK_HAS_POOR_BISHOP_PLACEMENT( (short) 91, null ),

    /**
     * White has good bishop placement
     */
    WHITE_HAS_GOOD_BISHOP_PLACEMENT( (short) 92, null ),

    /**
     * Black has good bishop placement
     */
    BLACK_HAS_GOOD_BISHOP_PLACEMENT( (short) 93, null ),

    /**
     * White has poor rook placement
     */
    WHITE_HAS_POOR_ROOK_PLACEMENT( (short) 94, null ),

    /**
     * Black has poor rook placement
     */
    BLACK_HAS_POOR_ROOK_PLACEMENT( (short) 95, null ),

    /**
     * White has good rook placement
     */
    WHITE_HAS_GOOD_ROOK_PLACEMENT( (short) 96, null ),

    /**
     * Black has good rook placement
     */
    BLACK_HAS_GOOD_ROOK_PLACEMENT( (short) 97, null ),

    /**
     * White has poor queen placement
     */
    WHITE_HAS_POOR_QUEEN_PLACEMENT( (short) 98, null ),

    /**
     * Black has poor queen placement
     */
    BLACK_HAS_POOR_QUEEN_PLACEMENT( (short) 99, null ),

    /**
     * White has good queen placement
     */
    WHITE_HAS_GOOD_QUEEN_PLACEMENT( (short) 100, null ),

    /**
     * Black has good queen placement
     */
    BLACK_HAS_GOOD_QUEEN_PLACEMENT( (short) 101, null ),

    /**
     * White has poor piece coordination
     */
    WHITE_HAS_POOR_PIECE_COORDINATION( (short) 102, null ),

    /**
     * Black has poor piece coordination
     */
    BLACK_HAS_POOR_PIECE_COORDINATION( (short) 103, null ),

    /**
     * White has good piece coordination
     */
    WHITE_HAS_GOOD_PIECE_COORDINATION( (short) 104, null ),

    /**
     * Black has good piece coordination
     */
    BLACK_HAS_GOOD_PIECE_COORDINATION( (short) 105, null ),

    /**
     * White has played the opening very poorly
     */
    WHITE_PLAYED_OPENING_VERY_POORLY( (short) 106, null ),

    /**
     * Black has played the opening very poorly
     */
    BLACK_PLAYED_OPENING_VERY_POORLY( (short) 107, null ),

    /**
     * White has played the opening poorly
     */
    WHITE_PLAYED_OPENING_POORLY( (short) 108, null ),

    /**
     * Black has played the opening poorly
     */
    BLACK_PLAYED_OPENING_POORLY( (short) 109, null ),

    /**
     * White has played the opening well
     */
    WHITE_PLAYED_OPENING_WELL( (short) 110, null ),

    /**
     * Black has played the opening well
     */
    BLACK_PLAYED_OPENING_WELL( (short) 111, null ),

    /**
     * White has played the opening very well
     */
    WHITE_PLAYED_OPENING_VERY_WELL( (short) 112, null ),

    /**
     * Black has played the opening very well
     */
    BLACK_PLAYED_OPENING_VERY_WELL( (short) 113, null ),

    /**
     * White has played the middlegame very poorly
     */
    WHITE_PLAYED_MIDDLEGAME_VERY_POORLY( (short) 114, null ),

    /**
     * Black has played the middlegame very poorly
     */
    BLACK_PLAYED_MIDDLEGAME_VERY_POORLY( (short) 115, null ),

    /**
     * White has played the middlegame poorly
     */
    WHITE_PLAYED_MIDDLEGAME_POORLY( (short) 116, null ),

    /**
     * Black has played the middlegame poorly
     */
    BLACK_PLAYED_MIDDLEGAME_POORLY( (short) 117, null ),

    /**
     * White has played the middlegame well
     */
    WHITE_PLAYED_MIDDLEGAME_WELL( (short) 118, null ),

    /**
     * Black has played the middlegame well
     */
    BLACK_PLAYED_MIDDLEGAME_WELL( (short) 119, null ),

    /**
     * White has played the middlegame very well
     */
    WHITE_PLAYED_MIDDLEGAME_VERY_WELL( (short) 120, null ),

    /**
     * Black has played the middlegame very well
     */
    BLACK_PLAYED_MIDDLEGAME_VERY_WELL( (short) 121, null ),

    /**
     * White has played the ending very poorly
     */
    WHITE_PLAYED_ENDGAME_VERY_POORLY( (short) 122, null ),

    /**
     * Black has played the ending very poorly
     */
    BLACK_PLAYED_ENDGAME_VERY_POORLY( (short) 123, null ),

    /**
     * White has played the ending poorly
     */
    WHITE_PLAYED_ENDGAME_POORLY( (short) 124, null ),

    /**
     * Black has played the ending poorly
     */
    BLACK_PLAYED_ENDGAME_POORLY( (short) 125, null ),

    /**
     * White has played the ending well
     */
    WHITE_PLAYED_ENDGAME_WELL( (short) 126, null ),

    /**
     * Black has played the ending well
     */
    BLACK_PLAYED_ENDGAME_WELL( (short) 127, null ),

    /**
     * White has played the ending very well
     */
    WHITE_PLAYED_ENDGAME_VERY_WELL( (short) 128, null ),

    /**
     * Black has played the ending very well
     */
    BLACK_PLAYED_ENDGAME_VERY_WELL( (short) 129, null ),

    /**
     * White has slight counterplay
     */
    WHITE_HAS_SLIGHT_COUNTERPLAY( (short) 130, null ),

    /**
     * Black has slight counterplay
     */
    BLACK_HAS_SLIGHT_COUNTERPLAY( (short) 131, null ),

    /**
     * White has moderate counterplay
     */
    WHITE_HAS_MODERATE_COUNTERPLAY( (short) 132, null ),

    /**
     * Black has moderate counterplay
     */
    BLACK_HAS_MODERATE_COUNTERPLAY( (short) 133, null ),

    /**
     * White has decisive counterplay
     */
    WHITE_HAS_DECISIVE_COUNTERPLAY( (short) 134, null ),

    /**
     * Black has decisive counterplay
     */
    BLACK_HAS_DECISIVE_COUNTERPLAY( (short) 135, null ),

    /**
     * White has moderate time control pressure
     */
    WHITE_HAS_MODERATE_TIME_PRESSURE( (short) 136, null ),

    /**
     * Black has moderate time control pressure
     */
    BLACK_HAS_MODERATE_TIME_PRESSURE( (short) 137, null ),

    /**
     * White has severe time control pressure
     */
    WHITE_HAS_SEVERE_TIME_PRESSURE( (short) 138, null ),

    /**
     * Black has severe time control pressure
     */
    BLACK_HAS_SEVERE_TIME_PRESSURE( (short) 139, null );

    private final static Logger LOGGER = LoggerFactory.getLogger( NAG.class );
    private final short nag;
    private final String shortDescription;

    // TODO add short NAG chars for chess fonts

    // allow higher nags
    public static short NUM_OF_NAGS = 256;

    private NAG( short nag, String shortDescription )
    {
      this.nag = nag;
      this.shortDescription = shortDescription;
    }

    public String getLongDescription()
    {
      return getLongDescription( null );
    }

    public String getLongDescription( Locale locale )
    {
      final I18n I18N = (locale!=null)?
        I18nFactory.getI18n( NAG.class, locale ):
        I18nFactory.getI18n( NAG.class );

      final String white = I18N.tr( "White" );
      final String black = I18N.tr( "Black" );

      switch (this)
      {
        case NULL_ANNOTATION:
          return I18N.tr( "no annotation" );  // 0

        case GOOD_MOVE:
          return I18N.tr( "good move" );  // 1

        case POOR_MOVE:
          return I18N.tr( "poor move" );  // 2

        case VERY_GOOD_MOVE:
          return I18N.tr( "very good move" );  // 3

        case VERY_POOR_MOVE:
          return I18N.tr( "very poor move" );  // 4

        case SPECULATIVE_MOVE:
          return I18N.tr( "speculative move" );  // 5

        case QUESTIONABLE_MOVE:
          return I18N.tr( "questionable move" );  // 6

        case FORCED_MOVE:
          return I18N.tr( "forced move (all others lose quickly)" );  // 7

        case ONLY_MOVE:
          return I18N.tr( "only move (no reasonable alternatives)" );  // 8

        case WORST_MOVE:
          return I18N.tr( "worst move" );  // 9

        case DRAWISH_POSITION:
          return I18N.tr( "drawish position" );  // 10

        case EQUAL_CHANCES_QUIET_POSITION:
          return I18N.tr( "equal chances" ) + "; " + I18N.tr( "quiet position" );  // 11

        case EQUAL_CHANCES_ACTIVE_POSITION:
          return I18N.tr( "equal chances" ) + "; " + I18N.tr( "active position" );  // 12

        case UNCLEAR_POSITION:
          return I18N.tr( "unclear position" );  // 13

        case WHITE_HAS_SLIGHT_ADVANTAGE:
          return I18N.tr( "{0} has a slight advantage", white );  // 14

        case BLACK_HAS_SLIGHT_ADVANTAGE:
          return I18N.tr( "{0} has a slight advantage", black );  // 15

        case WHITE_HAS_MODERATE_ADVANTAGE:
          return I18N.tr( "{0} has a moderate advantage", white );  // 16

        case BLACK_HAS_MODERATE_ADVANTAGE:
          return I18N.tr( "{0} has a moderate advantage", black );  // 17

        case WHITE_HAS_DECISIVE_ADVANTAGE:
          return I18N.tr( "{0} has a decisive advantage", white );  // 18

        case BLACK_HAS_DECISIVE_ADVANTAGE:
          return I18N.tr( "{0} has a decisive advantage", black );  // 19

        case WHITE_HAS_CRUSHING_ADVANTAGE:
          return I18N.tr( "{0} has a crushing advantage ({1} should resign)", white, black );  // 20

        case BLACK_HAS_CRUSHING_ADVANTAGE:
          return I18N.tr( "{0} has a crushing advantage ({1} should resign)", black, white );  // 21

        case WHITE_IN_ZUGZWANG:
          return I18N.tr( "{0} is in zugzwang", white );  // 22

        case BLACK_IN_ZUGZWANG:
          return I18N.tr( "{0} is in zugzwang", black );  // 23

        case WHITE_HAS_SLIGHT_SPACE_ADVANTAGE:
          return I18N.tr( "{0} has a slight space advantage", white );  // 24

        case BLACK_HAS_SLIGHT_SPACE_ADVANTAGE:
          return I18N.tr( "{0} has a slight space advantage", black );  // 25

        case WHITE_HAS_MODERATE_SPACE_ADVANTAGE:
          return I18N.tr( "{0} has a moderate space advantage", white );  // 26

        case BLACK_HAS_MODERATE_SPACE_ADVANTAGE:
          return I18N.tr( "{0} has a moderate space advantage", black );  // 27

        case WHITE_HAS_DECISIVE_SPACE_ADVANTAGE:
          return I18N.tr( "{0} has a decisive space advantage", white );  // 28

        case BLACK_HAS_DECISIVE_SPACE_ADVANTAGE:
          return I18N.tr( "{0} has a decisive space advantage", black );  // 29

        case WHITE_HAS_SLIGHT_DEVELOPMENT_ADVANTAGE:
          return I18N.tr( "{0} has a slight time (development) advantage", white );  // 30

        case BLACK_HAS_SLIGHT_DEVELOPMENT_ADVANTAGE:
          return I18N.tr( "{0} has a slight time (development) advantage", black );  // 31

        case WHITE_HAS_MODERATE_DEVELOPMENT_ADVANTAGE:
          return I18N.tr( "{0} has a moderate time (development) advantage", white );  // 32

        case BLACK_HAS_MODERATE_DEVELOPMENT_ADVANTAGE:
          return I18N.tr( "{0} has a moderate time (development) advantage", black );  // 33

        case WHITE_HAS_DECISIVE_DEVELOPMENT_ADVANTAGE:
          return I18N.tr( "{0} has a decisive time (development) advantage", white );  // 34

        case BLACK_HAS_DECISIVE_DEVELOPMENT_ADVANTAGE:
          return I18N.tr( "{0} has a decisive time (development) advantage", black );  // 35

        case WHITE_HAS_INITIAVE:
          return I18N.tr( "{0} has the initiative", white );  // 36

        case BLACK_HAS_INITIAVE:
          return I18N.tr( "{0} has the initiative", black );  // 37

        case WHITE_HAS_LASTING_INITIAVE:
          return I18N.tr( "{0} has a lasting initiative", white );  // 38

        case BLACK_HAS_LASTING_INITIAVE:
          return I18N.tr( "{0} has a lasting initiative", black );  // 39

        case WHITE_HAS_ATTACK:
          return I18N.tr( "{0} has the attack", white );  // 40

        case BLACK_HAS_ATTACK:
          return I18N.tr( "{0} has the attack", black );  // 41

        case WHITE_HAS_INSUFFICIENT_COMPENSATION_FOR_MATERIAL_DEFICIT:
          return I18N.tr( "{0} has insufficient compensation for material deficit", white );  // 42

        case BLACK_HAS_INSUFFICIENT_COMPENSATION_FOR_MATERIAL_DEFICIT:
          return I18N.tr( "{0} has insufficient compensation for material deficit", black );  // 43

        case WHITE_HAS_SUFFICIENT_COMPENSATION_FOR_MATERIAL_DEFICIT:
          return I18N.tr( "{0} has sufficient compensation for material deficit", white );  // 44

        case BLACK_HAS_SUFFICIENT_COMPENSATION_FOR_MATERIAL_DEFICIT:
          return I18N.tr( "{0} has sufficient compensation for material deficit", black );  // 45

        case WHITE_HAS_ADEQUATE_COMPENSATION_FOR_MATERIAL_DEFICIT:
          return I18N.tr( "{0} has more than adequate compensation for material deficit", white );  // 46

        case BLACK_HAS_ADEQUATE_COMPENSATION_FOR_MATERIAL_DEFICIT:
          return I18N.tr( "{0} has more than adequate compensation for material deficit", black );  // 47

        case WHITE_HAS_SLIGHT_CENTER_CONTROL_ADVANTAGE:
          return I18N.tr( "{0} has a slight center control advantage", white );  // 48

        case BLACK_HAS_SLIGHT_CENTER_CONTROL_ADVANTAGE:
          return I18N.tr( "{0} has a slight center control advantage", black );  // 49

        case WHITE_HAS_MODERATE_CENTER_CONTROL_ADVANTAGE:
          return I18N.tr( "{0} has a moderate center control advantage", white );  // 50

        case BLACK_HAS_MODERATE_CENTER_CONTROL_ADVANTAGE:
          return I18N.tr( "{0} has a moderate center control advantage", black );  // 51

        case WHITE_HAS_DECISIVE_CENTER_CONTROL_ADVANTAGE:
          return I18N.tr( "{0} has a decisive center control advantage", white );  // 52

        case BLACK_HAS_DECISIVE_CENTER_CONTROL_ADVANTAGE:
          return I18N.tr( "{0} has a decisive center control advantage", black );  // 53

        case WHITE_HAS_SLIGHT_KINGSIDE_CONTROL_ADVANTAGE:
          return I18N.tr( "{0} has a slight kingside control advantage", white );  // 54

        case BLACK_HAS_SLIGHT_KINGSIDE_CONTROL_ADVANTAGE:
          return I18N.tr( "{0} has a slight kingside control advantage", black );  // 55

        case WHITE_HAS_MODERATE_KINGSIDE_CONTROL_ADVANTAGE:
          return I18N.tr( "{0} has a moderate kingside control advantage", white );  // 56

        case BLACK_HAS_MODERATE_KINGSIDE_CONTROL_ADVANTAGE:
          return I18N.tr( "{0} has a moderate kingside control advantage", black );  // 57

        case WHITE_HAS_DECISIVE_KINGSIDE_CONTROL_ADVANTAGE:
          return I18N.tr( "{0} has a decisive kingside control advantage", white );  // 58

        case BLACK_HAS_DECISIVE_KINGSIDE_CONTROL_ADVANTAGE:
          return I18N.tr( "{0} has a decisive kingside control advantage", black );  // 59

        case WHITE_HAS_SLIGHT_QUEENSIDE_CONTROL_ADVANTAGE:
          return I18N.tr( "{0} has a slight queenside control advantage", white );  // 60

        case BLACK_HAS_SLIGHT_QUEENSIDE_CONTROL_ADVANTAGE:
          return I18N.tr( "{0} has a slight queenside control advantage", black );  // 61

        case WHITE_HAS_MODERATE_QUEENSIDE_CONTROL_ADVANTAGE:
          return I18N.tr( "{0} has a moderate queenside control advantage", white );  // 62

        case BLACK_HAS_MODERATE_QUEENSIDE_CONTROL_ADVANTAGE:
          return I18N.tr( "{0} has a moderate queenside control advantage", black );  // 63

        case WHITE_HAS_DECISIVE_QUEENSIDE_CONTROL_ADVANTAGE:
          return I18N.tr( "{0} has a decisive queenside control advantage", white );  // 64

        case BLACK_HAS_DECISIVE_QUEENSIDE_CONTROL_ADVANTAGE:
          return I18N.tr( "{0} has a decisive queenside control advantage", black );  // 65

        case WHITE_HAS_VULNERABLE_FIRST_RANK:
          return I18N.tr( "{0} has a vulnerable first rank", white );  // 66

        case BLACK_HAS_VULNERABLE_FIRST_RANK:
          return I18N.tr( "{0} has a vulnerable first rank", black );  // 67

        case WHITE_HAS_WELL_PROTECTED_FIRST_RANK:
          return I18N.tr( "{0} has a well protected first rank", white );  // 68

        case BLACK_HAS_WELL_PROTECTED_FIRST_RANK:
          return I18N.tr( "{0} has a well protected first rank", black );  // 69

        case WHITE_HAS_POORLY_PROTECTED_KING:
          return I18N.tr( "{0} has a poorly protected king", white );  // 70

        case BLACK_HAS_POORLY_PROTECTED_KING:
          return I18N.tr( "{0} has a poorly protected king", black );  // 71

        case WHITE_HAS_WELL_PROTECTED_KING:
          return I18N.tr( "{0} has a well protected king", white );  // 72

        case BLACK_HAS_WELL_PROTECTED_KING:
          return I18N.tr( "{0} has a well protected king", black );  // 73

        case WHITE_HAS_POOR_KING_PLACEMENT:
          return I18N.tr( "{0} has a poorly placed king", white );  // 74

        case BLACK_HAS_POOR_KING_PLACEMENT:
          return I18N.tr( "{0} has a poorly placed king", black );  // 75

        case WHITE_HAS_GOOD_KING_PLACEMENT:
          return I18N.tr( "{0} has a well placed king", white );  // 76

        case BLACK_HAS_GOOD_KING_PLACEMENT:
          return I18N.tr( "{0} has a well placed king", black );  // 77

        case WHITE_HAS_VERY_WEAK_PAWN_STRUCTURE:
          return I18N.tr( "{0} has a very weak pawn structure", white );  // 78

        case BLACK_HAS_VERY_WEAK_PAWN_STRUCTURE:
          return I18N.tr( "{0} has a very weak pawn structure", black );  // 79

        case WHITE_HAS_MODERATELY_WEAK_PAWN_STRUCTURE:
          return I18N.tr( "{0} has a moderately weak pawn structure", white );  // 80

        case BLACK_HAS_MODERATELY_WEAK_PAWN_STRUCTURE:
          return I18N.tr( "{0} has a moderately weak pawn structure", black );  // 81

        case WHITE_HAS_MODERATELY_STRONG_PAWN_STRUCTURE:
          return I18N.tr( "{0} has a moderately strong pawn structure", white );  // 82

        case BLACK_HAS_MODERATELY_STRONG_PAWN_STRUCTURE:
          return I18N.tr( "{0} has a moderately strong pawn structure", black );  // 83

        case WHITE_HAS_VERY_STRONG_PAWN_STRUCTURE:
          return I18N.tr( "{0} has a very strong pawn structure", white );  // 84

        case BLACK_HAS_VERY_STRONG_PAWN_STRUCTURE:
          return I18N.tr( "{0} has a very strong pawn structure", black );  // 85

        case WHITE_HAS_POOR_KNIGHT_PLACEMENT:
          return I18N.tr( "{0} has poor knight placement", white );  // 86

        case BLACK_HAS_POOR_KNIGHT_PLACEMENT:
          return I18N.tr( "{0} has poor knight placement", black );  // 87

        case WHITE_HAS_GOOD_KNIGHT_PLACEMENT:
          return I18N.tr( "{0} has good knight placement", white );  // 88

        case BLACK_HAS_GOOD_KNIGHT_PLACEMENT:
          return I18N.tr( "{0} has good knight placement", black );  // 89

        case WHITE_HAS_POOR_BISHOP_PLACEMENT:
          return I18N.tr( "{0} has poor bishop placement", white );  // 90

        case BLACK_HAS_POOR_BISHOP_PLACEMENT:
          return I18N.tr( "{0} has poor bishop placement", black );  // 91

        case WHITE_HAS_GOOD_BISHOP_PLACEMENT:
          return I18N.tr( "{0} has good bishop placement", white );  // 92

        case BLACK_HAS_GOOD_BISHOP_PLACEMENT:
          return I18N.tr( "{0} has good bishop placement", black );  // 93

        case WHITE_HAS_POOR_ROOK_PLACEMENT:
          return I18N.tr( "{0} has poor rook placement", white );  // 94

        case BLACK_HAS_POOR_ROOK_PLACEMENT:
          return I18N.tr( "{0} has poor rook placement", black );  // 95

        case WHITE_HAS_GOOD_ROOK_PLACEMENT:
          return I18N.tr( "{0} has good rook placement", white );  // 96

        case BLACK_HAS_GOOD_ROOK_PLACEMENT:
          return I18N.tr( "{0} has good rook placement", black );  // 97

        case WHITE_HAS_POOR_QUEEN_PLACEMENT:
          return I18N.tr( "{0} has poor queen placement", white );  // 98

        case BLACK_HAS_POOR_QUEEN_PLACEMENT:
          return I18N.tr( "{0} has poor queen placement", black );  // 99

        case WHITE_HAS_GOOD_QUEEN_PLACEMENT:
          return I18N.tr( "{0} has good queen placement", white );  // 100

        case BLACK_HAS_GOOD_QUEEN_PLACEMENT:
          return I18N.tr( "{0} has good queen placement", black );  // 101

        case WHITE_HAS_POOR_PIECE_COORDINATION:
          return I18N.tr( "{0} has poor piece coordination", white );  // 102

        case BLACK_HAS_POOR_PIECE_COORDINATION:
          return I18N.tr( "{0} has poor piece coordination", black );  // 103

        case WHITE_HAS_GOOD_PIECE_COORDINATION:
          return I18N.tr( "{0} has good piece coordination", white );  // 104

        case BLACK_HAS_GOOD_PIECE_COORDINATION:
          return I18N.tr( "{0} has good piece coordination", black );  // 105

        case WHITE_PLAYED_OPENING_VERY_POORLY:
          return I18N.tr( "{0} has played the opening very poorly", white );  // 106

        case BLACK_PLAYED_OPENING_VERY_POORLY:
          return I18N.tr( "{0} has played the opening very poorly", black );  // 107

        case WHITE_PLAYED_OPENING_POORLY:
          return I18N.tr( "{0} has played the opening poorly", white );  // 108

        case BLACK_PLAYED_OPENING_POORLY:
          return I18N.tr( "{0} has played the opening poorly", black );  // 109

        case WHITE_PLAYED_OPENING_WELL:
          return I18N.tr( "{0} has played the opening well", white );  // 110

        case BLACK_PLAYED_OPENING_WELL:
          return I18N.tr( "{0} has played the opening well", black );  // 111

        case WHITE_PLAYED_OPENING_VERY_WELL:
          return I18N.tr( "{0} has played the opening very well", white );  // 112

        case BLACK_PLAYED_OPENING_VERY_WELL:
          return I18N.tr( "{0} has played the opening very well", black );  // 113

        case WHITE_PLAYED_MIDDLEGAME_VERY_POORLY:
          return I18N.tr( "{0} has played the middlegame very poorly", white );  // 114

        case BLACK_PLAYED_MIDDLEGAME_VERY_POORLY:
          return I18N.tr( "{0} has played the middlegame very poorly", black );  // 115

        case WHITE_PLAYED_MIDDLEGAME_POORLY:
          return I18N.tr( "{0} has played the middlegame poorly", white );  // 116

        case BLACK_PLAYED_MIDDLEGAME_POORLY:
          return I18N.tr( "{0} has played the middlegame poorly", black );  // 117

        case WHITE_PLAYED_MIDDLEGAME_WELL:
          return I18N.tr( "{0} has played the middlegame well", white );  // 118

        case BLACK_PLAYED_MIDDLEGAME_WELL:
          return I18N.tr( "{0} has played the middlegame well", black );  // 119

        case WHITE_PLAYED_MIDDLEGAME_VERY_WELL:
          return I18N.tr( "{0} has played the middlegame very well", white );  // 120

        case BLACK_PLAYED_MIDDLEGAME_VERY_WELL:
          return I18N.tr( "{0} has played the middlegame very well", black );  // 121

        case WHITE_PLAYED_ENDGAME_VERY_POORLY:
          return I18N.tr( "{0} has played the ending very poorly", white );  // 122

        case BLACK_PLAYED_ENDGAME_VERY_POORLY:
          return I18N.tr( "{0} has played the ending very poorly", black );  // 123

        case WHITE_PLAYED_ENDGAME_POORLY:
          return I18N.tr( "{0} has played the ending poorly", white );  // 124

        case BLACK_PLAYED_ENDGAME_POORLY:
          return I18N.tr( "{0} has played the ending poorly", black );  // 125

        case WHITE_PLAYED_ENDGAME_WELL:
          return I18N.tr( "{0} has played the ending well", white );  // 126

        case BLACK_PLAYED_ENDGAME_WELL:
          return I18N.tr( "{0} has played the ending well", black );  // 127

        case WHITE_PLAYED_ENDGAME_VERY_WELL:
          return I18N.tr( "{0} has played the ending very well", white );  // 128

        case BLACK_PLAYED_ENDGAME_VERY_WELL:
          return I18N.tr( "{0} has played the ending very well", black );  // 129

        case WHITE_HAS_SLIGHT_COUNTERPLAY:
          return I18N.tr( "{0} has slight counterplay", white );  // 130

        case BLACK_HAS_SLIGHT_COUNTERPLAY:
          return I18N.tr( "{0} has slight counterplay", black );  // 131

        case WHITE_HAS_MODERATE_COUNTERPLAY:
          return I18N.tr( "{0} has moderate counterplay", white );  // 132

        case BLACK_HAS_MODERATE_COUNTERPLAY:
          return I18N.tr( "{0} has moderate counterplay", black );  // 133

        case WHITE_HAS_DECISIVE_COUNTERPLAY:
          return I18N.tr( "{0} has decisive counterplay", white );  // 134

        case BLACK_HAS_DECISIVE_COUNTERPLAY:
          return I18N.tr( "{0} has decisive counterplay", black );  // 135

        case WHITE_HAS_MODERATE_TIME_PRESSURE:
          return I18N.tr( "{0} has moderate time control pressure", white );  // 136

        case BLACK_HAS_MODERATE_TIME_PRESSURE:
          return I18N.tr( "{0} has moderate time control pressure", black );  // 137

        case WHITE_HAS_SEVERE_TIME_PRESSURE:
          return I18N.tr( "{0} has severe time control pressure", white );  // 138

        case BLACK_HAS_SEVERE_TIME_PRESSURE:
          return I18N.tr( "{0} has severe time control pressure", black );  // 139

        default:
          return null;
      }
    }

    public short getNag()
    {
      return this.nag;
    }

    public String getShortDescription()
    {
      return this.shortDescription;
    }

    public static NAG valueOf( short nag )
    {
      if (nag<0) return null;
      for (NAG n : NAG.values())
      {
        if (n.nag==nag) return n;
      }
      return null;
    }

    /*================================================================================*/

    public static String[] getDefinedShortNags()
    {
      int num=0;
      for (NAG nag : NAG.values())
      {
        if (nag.shortDescription!=null)
        {
          num++;
        }
      }
      String[] res = new String[num];
      num=0;
      for (NAG nag : NAG.values())
      {
        if (nag.shortDescription!=null)
        {
          res[num++] = nag.shortDescription;
        }
      }
      return res;
    }

    /*================================================================================*/

    public static String getLongString( short nag )
    {
      NAG n = NAG.valueOf( nag );
      return (n!=null)?
        n.getLongDescription():
        "";
    }

    public static String getShortString( short nag )
    {
      return getShortString( nag, true );
    }

    public static String getShortString( short nag, boolean takeLongIfNull )
    {
      NAG n = NAG.valueOf( nag );
      if (n==null)
      {
        return "$" + nag;
      }
      else if (n.shortDescription!=null)
      {
        return n.shortDescription;
      }
      else
      {
        return (takeLongIfNull)?
          n.getLongDescription():
          "$" + nag;
      }
    }

    public static short ofString( String description ) throws IllegalArgumentException
    {
      if (description!=null)
      {
        for (NAG nag : NAG.values())
        {
          if (description.equals( nag.shortDescription ))
            return nag.nag;
          if (description.equals( nag.getLongDescription( Locale.ENGLISH ) ))
            return nag.nag;
        }
      }
      throw new IllegalArgumentException( "Nag unknown " + description );
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy