function _challengePart2(uint _dungeonId, uint _requiredFee) private {
        uint floorNumber;
        uint rewards;
        uint floorGenes;
        (,,,floorNumber,,rewards,,floorGenes) = dungeonTokenContract.dungeons(_dungeonId);

        
        uint _addedRewards = rewards + uint128(_requiredFee);

        
        
        uint heroGenes = _getFirstHeroGenesAndInitialize(_dungeonId);

        bool success = _getChallengeSuccess(heroGenes, floorGenes);

        uint newFloorGenes;
        uint successRewards;
        uint masterRewards;

        
        if (success) {
            newFloorGenes = _getNewFloorGene(_dungeonId);
            successRewards = _addedRewards * challengeRewardsPercent / 100;
            masterRewards = _addedRewards * masterRewardsPercent / 100;

            
            uint newRewards = _addedRewards * (100 - challengeRewardsPercent - masterRewardsPercent) / 100;

            
            
            dungeonTokenContract.addDungeonNewFloor(_dungeonId, newRewards, newFloorGenes);

            
            asyncSend(msg.sender, _addedRewards * challengeRewardsPercent / 100);

            
            asyncSend(owner, _addedRewards * masterRewardsPercent / 100);
        }

        
        DungeonChallenged(now, msg.sender, _dungeonId, heroGenes, floorNumber, floorGenes, success, newFloorGenes, successRewards, masterRewards);
    }