@Override
 public EbRegistration getMyRegistration(Game p_game) {
   EbRegistration registration = p_game.getRegistration(getRegistrationId());
   if (registration != null) {
     return registration;
   }
   return super.getMyRegistration(p_game);
 }
 /* (non-Javadoc)
  * @see com.fullmetalgalaxy.model.persist.AnAction#exec()
  */
 @Override
 public void exec(Game p_game) throws RpcFmpException {
   super.exec(p_game);
   EbRegistration registration = getMyRegistration(p_game);
   if (registration != null) {
     registration.setPtAction(registration.getPtAction() - getCost());
     // registration.setLastUpdate( getLastUpdate() );
     if (p_game.isParallel()) {
       registration.getTeam(p_game).setLockedPosition(getLockedPosition());
       registration
           .getTeam(p_game)
           .setEndTurnDate(
               new Date(
                   SharedMethods.currentTimeMillis()
                       + p_game.getEbConfigGameTime().getLockGameInMillis()));
     }
   }
 }
 /**
  * @param p_game game to apply event
  * @return the tokenDestroyer2
  */
 public EbToken getTokenDestroyer2(Game p_game) {
   if (m_tokenDestroyer2 == null && getPackedTokenDestroyer2() != null) {
     m_tokenDestroyer2 = p_game.getToken(getPackedTokenDestroyer2().getId());
   }
   return m_tokenDestroyer2;
 }
 /**
  * @param p_game game to apply event
  * @return the newTokenCarrier
  */
 public EbToken getNewTokenCarrier(Game p_game) {
   if (m_newTokenCarrier == null && getPackedNewTokenCarrier() != null) {
     m_newTokenCarrier = p_game.getToken(getPackedNewTokenCarrier().getId());
   }
   return m_newTokenCarrier;
 }
 /**
  * @param p_game game to apply event
  * @return the token
  */
 public EbToken getToken(Game p_game) {
   if (m_token == null && getPackedToken() != null) {
     m_token = p_game.getToken(getPackedToken().getId());
   }
   return m_token;
 }
  /* (non-Javadoc)
   * @see com.fullmetalgalaxy.model.persist.AnAction#check()
   */
  @Override
  public void check(Game p_game) throws RpcFmpException {
    super.check(p_game);
    if (isAuto()) {
      // if event is auto generated, assume everything are correct
      return;
    }
    EbRegistration myRegistration = getMyRegistration(p_game);
    if (myRegistration == null) {
      // no i18n ?
      throw new RpcFmpException("you didn't join this game.", this);
    }
    if (myRegistration.getPtAction() < getCost() && p_game.getGameType() != GameType.Practice) {
      throw new RpcFmpException(errMsg().NotEnouthActionPt(), this);
    }
    if ((!p_game.isParallel() || (p_game.getCurrentTimeStep() <= 1))
        && (!p_game.getCurrentPlayerIds().contains(myRegistration.getId()))
        && p_game.getGameType() != GameType.Practice) {
      throw new RpcFmpException(errMsg().NotYourTurn(), this);
    }
    if ((p_game.getStatus() == GameStatus.Open || p_game.getStatus() == GameStatus.Pause)
        && p_game.getGameType() != GameType.Practice) {
      throw new RpcFmpException(errMsg().gameNotStarted(), this);
    }

    if (p_game.isParallel()
        && p_game.getCurrentTimeStep() > p_game.getEbConfigGameTime().getDeploymentTimeStep()) {
      EbTeam team =
          p_game.getOtherTeamBoardLocked(
              myRegistration, getLockedPosition(), SharedMethods.currentTimeMillis());
      if (team != null) {
        throw new RpcFmpException(errMsg().boardLocked(), this);
      }
    }
  }
  @Override
  public ModelFmpInit loadGame(InputStream p_input) {
    Game game = new Game();
    game.setName("upload");
    game.setPlanetType(PlanetType.Desert);
    game.setConfigGameTime(ConfigGameTime.Standard);
    game.setMaxNumberOfPlayer(4);

    String str = readln(p_input);
    if (str == null || !str.startsWith("<FMP Format=4 Version=\"2.3.7")) {
      LOG.error("Bad format");
      return null;
    }
    // lecture de la carte
    str = readln(p_input);
    if (str == null || !str.startsWith("<CARTE Lignes=")) {
      LOG.error("<CARTE Lignes= not found");
      return null;
    }
    int height = Integer.parseInt(str.substring(14, 16));
    int width = Integer.parseInt(str.substring(26, 28));
    game.setLandSize(width, height);
    for (int iy = 0; iy < height; iy++) {
      str = readln(p_input);
      for (int ix = 0; ix < width; ix++) {
        switch (str.charAt(ix)) {
          case '.':
            game.setLand(ix, iy, LandType.Sea);
            break;
          case '*':
            game.setLand(ix, iy, LandType.Reef);
            break;
          case '%':
            game.setLand(ix, iy, LandType.Marsh);
            break;
          case '$':
            game.setLand(ix, iy, LandType.Plain);
            break;
          case '#':
            game.setLand(ix, iy, LandType.Montain);
            break;
          case '?':
          default:
            game.setLand(ix, iy, LandType.None);
            break;
        }
      }
    }
    str = readln(p_input);
    if (str == null || !str.startsWith("</CARTE>")) {
      LOG.error("</CARTE> not found");
    }
    // lecture des minerais
    str = readln(p_input);
    if (str != null && str.startsWith("<REPARTITION Lignes=")) {
      height = Integer.parseInt(str.substring(20, 22));
      width = Integer.parseInt(str.substring(32, 34));
      for (int iy = 0; iy < height; iy++) {
        str = readln(p_input);
        for (int ix = 0; ix < width; ix++) {
          if (str.charAt(ix) != '.') {
            EbToken token = new EbToken(TokenType.Ore);
            game.addToken(token);
            game.moveToken(token, new AnBoardPosition(ix, iy));
          }
        }
      }
      str = readln(p_input);
      if (str == null || !str.startsWith("</REPARTITION>")) {
        LOG.error("</REPARTITION> not found");
      }
    }

    try {
      p_input.close();
    } catch (IOException e) {
      LOG.error(e);
    }

    return game2Model(game);
  }