#define sjmMoveType int

//used for sending information to the server
#define NIL 0
#define READY_TO_PLACE 1
#define PLAY_MOVE 2
#define SCORE_MOVE 3
#define LOOKUP_WORD 4
#define SUGGEST_MOVE 5
#define DISCARD_TILES 6
#define RATE_MOVE 7
#define CHALLENGE_MOVE 8
#define PASS 9
#define RESIGN 10

//whether a move passed or not
#define MOVE_SUCCESS 0
#define MOVE_FAILURE 1

//used for information retrieval
#define GET_PLAYER_SCORE 60
#define GET_PLAYER_TILES 61
#define GET_PLAYER_MISC 62
#define GET_GAME_STATUS 70

//information responses:
#define GET_PLAYER_INFO_SUCCESS 100
#define GET_PLAYER_INFO_FAILURE 101
#define GAME_OVER 102
#define GAME_RUNNING 103

//maximum length of any data
#define DATA_LENGTH 64

class sjmMove{
 private:
  int playerid;
  unsigned long int playercode;
  int type;
  int datalength;
  char data[DATA_LENGTH];


  //used when constructing data to make sure data is valid length for type
  int
    IsValidLength(int x);

 public:

  //constructor: sets all fields to 0
  sjmMove();

  //destructor: deletes data if necessary
  ~sjmMove();

  void
    setPlayerCode(int code);

  void
    setType(int set);

  int
    setData(char* word);

  void
    setXYZ(int* vector);

  void
    setDirection(int dir);

  unsigned long int 
    getPlayerCode();

  sjmMoveType
    getType();

  char*
    getData();

  //if type has a play, we need to import the information

  int
    getMoveDirection();

  void
    getXYZ(int& x, int& y, int& z);

  int
    getDir();

  char*
    getWord();

};




