function joinPillar(uint256 _kittyId, uint8 _pillarIdx, uint256 _rId) external payable {
		require(!paused_, "game is paused");

        require(msg.value == joinFee_, "incorrect join fee");
		
		require((_pillarIdx>=0)&&(_pillarIdx<=2), "there is no such pillar here");
		
        require(msg.sender == kittyCore.ownerOf(_kittyId), "sender not owner of kitty");
		
		require(kittyRounds_[_kittyId][currentRId_].contribution==0, "kitty has already joined a pillar this round");
		
		require(_rId == currentRId_, "round has ended, wait for next round");
		
		uint256 _pId = pIdByAddress_[msg.sender];
		
        if (_pId == 0) {
			currentPId_ = currentPId_.add(1);
			pIdByAddress_[msg.sender] = currentPId_;
			players_[currentPId_].ownerAddr = msg.sender;
			_pId = currentPId_;
			
			emit PlayerJoined
			(
				msg.sender,
				_pId,
				now
			);
		}
		
		joinPillarCore(_pId, _kittyId, _pillarIdx);	
	}