contract TTGCoin is ReleasableToken, MintableToken , DistributeToken, RecycleToken{

  /** Name and symbol were updated. */
  event UpdatedTokenInformation(string newName, string newSymbol);

  string public name;

  string public symbol;

  uint public decimals;

  /**
   * Construct the token.
   *
   * This token must be created through a team multisig wallet, so that it is owned by that wallet.
   *
   */
  function TTGCoin() public {
    // Create any address, can be transferred
    // to team multisig via changeOwner(),
    owner = msg.sender;

    addAdmin(owner);

    name  = "TotalGame Coin";
    symbol = "TGC";
    totalSupply = 2000000000*10**18;
    decimals = 18;

    // Create initially all balance on the team multisig
    balances[msg.sender] = totalSupply;

    //Mint feature is not allow  now
    mintingFinished = true;

    //Set the distribute totaltoken strategy
    totalAirDrop = totalSupply.mul(10).div(100);
    totalCrowdCoin = totalSupply.mul(50).div(100);
    totalDevCoin = totalSupply.mul(20).div(100);
    totalFoundCoin = totalSupply.mul(20).div(100);

    emit Minted(owner, totalSupply);
  }


  /**
   * When token is released to be transferable, enforce no new tokens can be created.
   */
  function releaseTokenTransfer() public onlyReleaseAgent {
    super.releaseTokenTransfer();
  }

  /**
   * Owner can update token information here.
   *
   * It is often useful to conceal the actual token association, until
   * the token operations, like central issuance or reissuance have been completed.
   *
   * This function allows the token owner to rename the token after the operations
   * have been completed and then point the audience to use the token contract.
   */
  function setTokenInformation(string _name, string _symbol) public onlyOwner {
    name = _name;
    symbol = _symbol;

    emit UpdatedTokenInformation(name, symbol);
  }

  function getTotalSupply() public view returns (uint) {
    return totalSupply;
  }

  function tokenName() public view returns (string _name) {
    return name;
  }
}
/**
 * A crowdsaled token.
 *
 * An ERC-20 token designed specifically for crowdsales with investor protection and further development path.
 *
 * - The token transfer() is disabled until the crowdsale is over
 * - The token contract gives an opt-in upgrade path to a new contract
 * - The same token can be part of several crowdsales through approve() mechanism
 * - The token can be capped (supply set in the constructor) or uncapped (crowdsale contract can mint new tokens)
 *
 */
function releaseTokenTransfer() public onlyReleaseAgent {
  super.releaseTokenTransfer();
}

/**
 * When token is released to be transferable, enforce no new tokens can be created.
 */