public org.bwapi.proxy.messages.Messages.FrameMessage buildPartial() {
        org.bwapi.proxy.messages.Messages.FrameMessage result = new org.bwapi.proxy.messages.Messages.FrameMessage(this);
        int from_bitField0_ = bitField0_;
        int to_bitField0_ = 0;
        if (((from_bitField0_ & 0x00000001) == 0x00000001)) {
          to_bitField0_ |= 0x00000001;
        }
        result.frameCount_ = frameCount_;
        if (((from_bitField0_ & 0x00000002) == 0x00000002)) {
          to_bitField0_ |= 0x00000002;
        }
        result.mouseX_ = mouseX_;
        if (((from_bitField0_ & 0x00000004) == 0x00000004)) {
          to_bitField0_ |= 0x00000004;
        }
        result.mouseY_ = mouseY_;
        if (((from_bitField0_ & 0x00000008) == 0x00000008)) {
          to_bitField0_ |= 0x00000008;
        }
        result.screenX_ = screenX_;
        if (((from_bitField0_ & 0x00000010) == 0x00000010)) {
          to_bitField0_ |= 0x00000010;
        }
        result.screenY_ = screenY_;
        if (unitsBuilder_ == null) {
          if (((bitField0_ & 0x00000020) == 0x00000020)) {
            units_ = java.util.Collections.unmodifiableList(units_);
            bitField0_ = (bitField0_ & ~0x00000020);
          }
          result.units_ = units_;
        } else {
          result.units_ = unitsBuilder_.build();
        }
        if (bulletsBuilder_ == null) {
          if (((bitField0_ & 0x00000040) == 0x00000040)) {
            bullets_ = java.util.Collections.unmodifiableList(bullets_);
            bitField0_ = (bitField0_ & ~0x00000040);
          }
          result.bullets_ = bullets_;
        } else {
          result.bullets_ = bulletsBuilder_.build();
        }
        if (playersBuilder_ == null) {
          if (((bitField0_ & 0x00000080) == 0x00000080)) {
            players_ = java.util.Collections.unmodifiableList(players_);
            bitField0_ = (bitField0_ & ~0x00000080);
          }
          result.players_ = players_;
        } else {
          result.players_ = playersBuilder_.build();
        }
        if (createdUnitsBuilder_ == null) {
          if (((bitField0_ & 0x00000100) == 0x00000100)) {
            createdUnits_ = java.util.Collections.unmodifiableList(createdUnits_);
            bitField0_ = (bitField0_ & ~0x00000100);
          }
          result.createdUnits_ = createdUnits_;
        } else {
          result.createdUnits_ = createdUnitsBuilder_.build();
        }
        if (destroyedUnitsBuilder_ == null) {
          if (((bitField0_ & 0x00000200) == 0x00000200)) {
            destroyedUnits_ = java.util.Collections.unmodifiableList(destroyedUnits_);
            bitField0_ = (bitField0_ & ~0x00000200);
          }
          result.destroyedUnits_ = destroyedUnits_;
        } else {
          result.destroyedUnits_ = destroyedUnitsBuilder_.build();
        }
        if (morphedUnitsBuilder_ == null) {
          if (((bitField0_ & 0x00000400) == 0x00000400)) {
            morphedUnits_ = java.util.Collections.unmodifiableList(morphedUnits_);
            bitField0_ = (bitField0_ & ~0x00000400);
          }
          result.morphedUnits_ = morphedUnits_;
        } else {
          result.morphedUnits_ = morphedUnitsBuilder_.build();
        }
        if (shownUnitsBuilder_ == null) {
          if (((bitField0_ & 0x00000800) == 0x00000800)) {
            shownUnits_ = java.util.Collections.unmodifiableList(shownUnits_);
            bitField0_ = (bitField0_ & ~0x00000800);
          }
          result.shownUnits_ = shownUnits_;
        } else {
          result.shownUnits_ = shownUnitsBuilder_.build();
        }
        if (hiddenUnitsBuilder_ == null) {
          if (((bitField0_ & 0x00001000) == 0x00001000)) {
            hiddenUnits_ = java.util.Collections.unmodifiableList(hiddenUnits_);
            bitField0_ = (bitField0_ & ~0x00001000);
          }
          result.hiddenUnits_ = hiddenUnits_;
        } else {
          result.hiddenUnits_ = hiddenUnitsBuilder_.build();
        }
        if (renegadedUnitsBuilder_ == null) {
          if (((bitField0_ & 0x00002000) == 0x00002000)) {
            renegadedUnits_ = java.util.Collections.unmodifiableList(renegadedUnits_);
            bitField0_ = (bitField0_ & ~0x00002000);
          }
          result.renegadedUnits_ = renegadedUnits_;
        } else {
          result.renegadedUnits_ = renegadedUnitsBuilder_.build();
        }
        if (((bitField0_ & 0x00004000) == 0x00004000)) {
          leftplayers_ = java.util.Collections.unmodifiableList(leftplayers_);
          bitField0_ = (bitField0_ & ~0x00004000);
        }
        result.leftplayers_ = leftplayers_;
        if (receivedTextsBuilder_ == null) {
          if (((bitField0_ & 0x00008000) == 0x00008000)) {
            receivedTexts_ = java.util.Collections.unmodifiableList(receivedTexts_);
            bitField0_ = (bitField0_ & ~0x00008000);
          }
          result.receivedTexts_ = receivedTexts_;
        } else {
          result.receivedTexts_ = receivedTextsBuilder_.build();
        }
        if (selectedUnitsBuilder_ == null) {
          if (((bitField0_ & 0x00010000) == 0x00010000)) {
            selectedUnits_ = java.util.Collections.unmodifiableList(selectedUnits_);
            bitField0_ = (bitField0_ & ~0x00010000);
          }
          result.selectedUnits_ = selectedUnits_;
        } else {
          result.selectedUnits_ = selectedUnitsBuilder_.build();
        }
        if (((bitField0_ & 0x00020000) == 0x00020000)) {
          sentText_ = new com.google.protobuf.UnmodifiableLazyStringList(
              sentText_);
          bitField0_ = (bitField0_ & ~0x00020000);
        }
        result.sentText_ = sentText_;
        if (((from_bitField0_ & 0x00040000) == 0x00040000)) {
          to_bitField0_ |= 0x00000020;
        }
        if (nukeDetectBuilder_ == null) {
          result.nukeDetect_ = nukeDetect_;
        } else {
          result.nukeDetect_ = nukeDetectBuilder_.build();
        }
        if (((from_bitField0_ & 0x00080000) == 0x00080000)) {
          to_bitField0_ |= 0x00000040;
        }
        result.paused_ = paused_;
        if (((from_bitField0_ & 0x00100000) == 0x00100000)) {
          to_bitField0_ |= 0x00000080;
        }
        result.replay_ = replay_;
        if (((from_bitField0_ & 0x00200000) == 0x00200000)) {
          to_bitField0_ |= 0x00000100;
        }
        result.multiplayer_ = multiplayer_;
        if (((from_bitField0_ & 0x00400000) == 0x00400000)) {
          to_bitField0_ |= 0x00000200;
        }
        result.gameover_ = gameover_;
        if (((from_bitField0_ & 0x00800000) == 0x00800000)) {
          to_bitField0_ |= 0x00000400;
        }
        result.isWinner_ = isWinner_;
        if (((from_bitField0_ & 0x01000000) == 0x01000000)) {
          to_bitField0_ |= 0x00000800;
        }
        if (screenPositionBuilder_ == null) {
          result.screenPosition_ = screenPosition_;
        } else {
          result.screenPosition_ = screenPositionBuilder_.build();
        }
        if (((from_bitField0_ & 0x02000000) == 0x02000000)) {
          to_bitField0_ |= 0x00001000;
        }
        result.latency_ = latency_;
        if (((from_bitField0_ & 0x04000000) == 0x04000000)) {
          to_bitField0_ |= 0x00002000;
        }
        if (dynamicTerrainInfoBuilder_ == null) {
          result.dynamicTerrainInfo_ = dynamicTerrainInfo_;
        } else {
          result.dynamicTerrainInfo_ = dynamicTerrainInfoBuilder_.build();
        }
        if (((from_bitField0_ & 0x08000000) == 0x08000000)) {
          to_bitField0_ |= 0x00004000;
        }
        if (terrainInfoBuilder_ == null) {
          result.terrainInfo_ = terrainInfo_;
        } else {
          result.terrainInfo_ = terrainInfoBuilder_.build();
        }
        result.bitField0_ = to_bitField0_;
        onBuilt();
        return result;
      }