public org.bwapi.proxy.messages.GameMessages.UnitTypeData buildPartial() {
        org.bwapi.proxy.messages.GameMessages.UnitTypeData result = new org.bwapi.proxy.messages.GameMessages.UnitTypeData(this);
        int from_bitField0_ = bitField0_;
        int from_bitField1_ = bitField1_;
        int from_bitField2_ = bitField2_;
        int to_bitField0_ = 0;
        int to_bitField1_ = 0;
        if (((from_bitField0_ & 0x00000001) == 0x00000001)) {
          to_bitField0_ |= 0x00000001;
        }
        result.id_ = id_;
        if (((from_bitField0_ & 0x00000002) == 0x00000002)) {
          to_bitField0_ |= 0x00000002;
        }
        result.name_ = name_;
        if (((from_bitField0_ & 0x00000004) == 0x00000004)) {
          to_bitField0_ |= 0x00000004;
        }
        result.sublabel_ = sublabel_;
        if (((from_bitField0_ & 0x00000008) == 0x00000008)) {
          to_bitField0_ |= 0x00000008;
        }
        result.race_ = race_;
        if (((from_bitField0_ & 0x00000010) == 0x00000010)) {
          to_bitField0_ |= 0x00000010;
        }
        if (whatBuildsTypeBuilder_ == null) {
          result.whatBuildsType_ = whatBuildsType_;
        } else {
          result.whatBuildsType_ = whatBuildsTypeBuilder_.build();
        }
        if (((from_bitField0_ & 0x00000020) == 0x00000020)) {
          to_bitField0_ |= 0x00000020;
        }
        result.whatBuildsNumber_ = whatBuildsNumber_;
        if (requiredUnitsBuilder_ == null) {
          if (((bitField0_ & 0x00000040) == 0x00000040)) {
            requiredUnits_ = java.util.Collections.unmodifiableList(requiredUnits_);
            bitField0_ = (bitField0_ & ~0x00000040);
          }
          result.requiredUnits_ = requiredUnits_;
        } else {
          result.requiredUnits_ = requiredUnitsBuilder_.build();
        }
        if (((from_bitField0_ & 0x00000080) == 0x00000080)) {
          to_bitField0_ |= 0x00000040;
        }
        if (requiredTechBuilder_ == null) {
          result.requiredTech_ = requiredTech_;
        } else {
          result.requiredTech_ = requiredTechBuilder_.build();
        }
        if (abilitiesBuilder_ == null) {
          if (((bitField0_ & 0x00000100) == 0x00000100)) {
            abilities_ = java.util.Collections.unmodifiableList(abilities_);
            bitField0_ = (bitField0_ & ~0x00000100);
          }
          result.abilities_ = abilities_;
        } else {
          result.abilities_ = abilitiesBuilder_.build();
        }
        if (upgradesBuilder_ == null) {
          if (((bitField0_ & 0x00000200) == 0x00000200)) {
            upgrades_ = java.util.Collections.unmodifiableList(upgrades_);
            bitField0_ = (bitField0_ & ~0x00000200);
          }
          result.upgrades_ = upgrades_;
        } else {
          result.upgrades_ = upgradesBuilder_.build();
        }
        if (((from_bitField0_ & 0x00000400) == 0x00000400)) {
          to_bitField0_ |= 0x00000080;
        }
        if (armorUpgradeBuilder_ == null) {
          result.armorUpgrade_ = armorUpgrade_;
        } else {
          result.armorUpgrade_ = armorUpgradeBuilder_.build();
        }
        if (((from_bitField0_ & 0x00000800) == 0x00000800)) {
          to_bitField0_ |= 0x00000100;
        }
        result.maxHitPoints_ = maxHitPoints_;
        if (((from_bitField0_ & 0x00001000) == 0x00001000)) {
          to_bitField0_ |= 0x00000200;
        }
        result.maxShields_ = maxShields_;
        if (((from_bitField0_ & 0x00002000) == 0x00002000)) {
          to_bitField0_ |= 0x00000400;
        }
        result.maxEnergy_ = maxEnergy_;
        if (((from_bitField0_ & 0x00004000) == 0x00004000)) {
          to_bitField0_ |= 0x00000800;
        }
        result.armor_ = armor_;
        if (((from_bitField0_ & 0x00008000) == 0x00008000)) {
          to_bitField0_ |= 0x00001000;
        }
        result.mineralPrice_ = mineralPrice_;
        if (((from_bitField0_ & 0x00010000) == 0x00010000)) {
          to_bitField0_ |= 0x00002000;
        }
        result.gasPrice_ = gasPrice_;
        if (((from_bitField0_ & 0x00020000) == 0x00020000)) {
          to_bitField0_ |= 0x00004000;
        }
        result.buildTime_ = buildTime_;
        if (((from_bitField0_ & 0x00040000) == 0x00040000)) {
          to_bitField0_ |= 0x00008000;
        }
        result.supplyRequired_ = supplyRequired_;
        if (((from_bitField0_ & 0x00080000) == 0x00080000)) {
          to_bitField0_ |= 0x00010000;
        }
        result.supplyProvided_ = supplyProvided_;
        if (((from_bitField0_ & 0x00100000) == 0x00100000)) {
          to_bitField0_ |= 0x00020000;
        }
        result.spaceRequired_ = spaceRequired_;
        if (((from_bitField0_ & 0x00200000) == 0x00200000)) {
          to_bitField0_ |= 0x00040000;
        }
        result.spaceProvided_ = spaceProvided_;
        if (((from_bitField0_ & 0x00400000) == 0x00400000)) {
          to_bitField0_ |= 0x00080000;
        }
        result.buildScore_ = buildScore_;
        if (((from_bitField0_ & 0x00800000) == 0x00800000)) {
          to_bitField0_ |= 0x00100000;
        }
        result.destroyScore_ = destroyScore_;
        if (((from_bitField0_ & 0x01000000) == 0x01000000)) {
          to_bitField0_ |= 0x00200000;
        }
        result.size_ = size_;
        if (((from_bitField0_ & 0x02000000) == 0x02000000)) {
          to_bitField0_ |= 0x00400000;
        }
        result.tileWidth_ = tileWidth_;
        if (((from_bitField0_ & 0x04000000) == 0x04000000)) {
          to_bitField0_ |= 0x00800000;
        }
        result.tileHeight_ = tileHeight_;
        if (((from_bitField0_ & 0x08000000) == 0x08000000)) {
          to_bitField0_ |= 0x01000000;
        }
        result.dimensionLeft_ = dimensionLeft_;
        if (((from_bitField0_ & 0x10000000) == 0x10000000)) {
          to_bitField0_ |= 0x02000000;
        }
        result.dimensionUp_ = dimensionUp_;
        if (((from_bitField0_ & 0x20000000) == 0x20000000)) {
          to_bitField0_ |= 0x04000000;
        }
        result.dimensionRight_ = dimensionRight_;
        if (((from_bitField0_ & 0x40000000) == 0x40000000)) {
          to_bitField0_ |= 0x08000000;
        }
        result.dimensionDown_ = dimensionDown_;
        if (((from_bitField0_ & 0x80000000) == 0x80000000)) {
          to_bitField0_ |= 0x10000000;
        }
        result.seekRange_ = seekRange_;
        if (((from_bitField1_ & 0x00000001) == 0x00000001)) {
          to_bitField0_ |= 0x20000000;
        }
        result.sightRange_ = sightRange_;
        if (((from_bitField1_ & 0x00000002) == 0x00000002)) {
          to_bitField0_ |= 0x40000000;
        }
        if (groundWeaponBuilder_ == null) {
          result.groundWeapon_ = groundWeapon_;
        } else {
          result.groundWeapon_ = groundWeaponBuilder_.build();
        }
        if (((from_bitField1_ & 0x00000004) == 0x00000004)) {
          to_bitField0_ |= 0x80000000;
        }
        result.maxGroundHits_ = maxGroundHits_;
        if (((from_bitField1_ & 0x00000008) == 0x00000008)) {
          to_bitField1_ |= 0x00000001;
        }
        if (airWeaponBuilder_ == null) {
          result.airWeapon_ = airWeapon_;
        } else {
          result.airWeapon_ = airWeaponBuilder_.build();
        }
        if (((from_bitField1_ & 0x00000010) == 0x00000010)) {
          to_bitField1_ |= 0x00000002;
        }
        result.maxAirHits_ = maxAirHits_;
        if (((from_bitField1_ & 0x00000020) == 0x00000020)) {
          to_bitField1_ |= 0x00000004;
        }
        result.topSpeed_ = topSpeed_;
        if (((from_bitField1_ & 0x00000040) == 0x00000040)) {
          to_bitField1_ |= 0x00000008;
        }
        result.acceleration_ = acceleration_;
        if (((from_bitField1_ & 0x00000080) == 0x00000080)) {
          to_bitField1_ |= 0x00000010;
        }
        result.haltDistance_ = haltDistance_;
        if (((from_bitField1_ & 0x00000100) == 0x00000100)) {
          to_bitField1_ |= 0x00000020;
        }
        result.turnRadius_ = turnRadius_;
        if (((from_bitField1_ & 0x00000200) == 0x00000200)) {
          to_bitField1_ |= 0x00000040;
        }
        result.canProduce_ = canProduce_;
        if (((from_bitField1_ & 0x00000400) == 0x00000400)) {
          to_bitField1_ |= 0x00000080;
        }
        result.canAttack_ = canAttack_;
        if (((from_bitField1_ & 0x00000800) == 0x00000800)) {
          to_bitField1_ |= 0x00000100;
        }
        result.canMove_ = canMove_;
        if (((from_bitField1_ & 0x00001000) == 0x00001000)) {
          to_bitField1_ |= 0x00000200;
        }
        result.isFlyer_ = isFlyer_;
        if (((from_bitField1_ & 0x00002000) == 0x00002000)) {
          to_bitField1_ |= 0x00000400;
        }
        result.regeneratesHP_ = regeneratesHP_;
        if (((from_bitField1_ & 0x00004000) == 0x00004000)) {
          to_bitField1_ |= 0x00000800;
        }
        result.isSpellcaster_ = isSpellcaster_;
        if (((from_bitField1_ & 0x00008000) == 0x00008000)) {
          to_bitField1_ |= 0x00001000;
        }
        result.hasPermanentCloak_ = hasPermanentCloak_;
        if (((from_bitField1_ & 0x00010000) == 0x00010000)) {
          to_bitField1_ |= 0x00002000;
        }
        result.isInvincible_ = isInvincible_;
        if (((from_bitField1_ & 0x00020000) == 0x00020000)) {
          to_bitField1_ |= 0x00004000;
        }
        result.isOrganic_ = isOrganic_;
        if (((from_bitField1_ & 0x00040000) == 0x00040000)) {
          to_bitField1_ |= 0x00008000;
        }
        result.isMechanical_ = isMechanical_;
        if (((from_bitField1_ & 0x00080000) == 0x00080000)) {
          to_bitField1_ |= 0x00010000;
        }
        result.isRobotic_ = isRobotic_;
        if (((from_bitField1_ & 0x00100000) == 0x00100000)) {
          to_bitField1_ |= 0x00020000;
        }
        result.isDetector_ = isDetector_;
        if (((from_bitField1_ & 0x00200000) == 0x00200000)) {
          to_bitField1_ |= 0x00040000;
        }
        result.isResourceContainer_ = isResourceContainer_;
        if (((from_bitField1_ & 0x00400000) == 0x00400000)) {
          to_bitField1_ |= 0x00080000;
        }
        result.isResourceDepot_ = isResourceDepot_;
        if (((from_bitField1_ & 0x00800000) == 0x00800000)) {
          to_bitField1_ |= 0x00100000;
        }
        result.isRefinery_ = isRefinery_;
        if (((from_bitField1_ & 0x01000000) == 0x01000000)) {
          to_bitField1_ |= 0x00200000;
        }
        result.isWorker_ = isWorker_;
        if (((from_bitField1_ & 0x02000000) == 0x02000000)) {
          to_bitField1_ |= 0x00400000;
        }
        result.requiresPsi_ = requiresPsi_;
        if (((from_bitField1_ & 0x04000000) == 0x04000000)) {
          to_bitField1_ |= 0x00800000;
        }
        result.requiresCreep_ = requiresCreep_;
        if (((from_bitField1_ & 0x08000000) == 0x08000000)) {
          to_bitField1_ |= 0x01000000;
        }
        result.isTwoUnitsInOneEgg_ = isTwoUnitsInOneEgg_;
        if (((from_bitField1_ & 0x10000000) == 0x10000000)) {
          to_bitField1_ |= 0x02000000;
        }
        result.isBurrowable_ = isBurrowable_;
        if (((from_bitField1_ & 0x20000000) == 0x20000000)) {
          to_bitField1_ |= 0x04000000;
        }
        result.isCloakable_ = isCloakable_;
        if (((from_bitField1_ & 0x40000000) == 0x40000000)) {
          to_bitField1_ |= 0x08000000;
        }
        result.isBuilding_ = isBuilding_;
        if (((from_bitField1_ & 0x80000000) == 0x80000000)) {
          to_bitField1_ |= 0x10000000;
        }
        result.isAddon_ = isAddon_;
        if (((from_bitField2_ & 0x00000001) == 0x00000001)) {
          to_bitField1_ |= 0x20000000;
        }
        result.isFlyingBuilding_ = isFlyingBuilding_;
        if (((from_bitField2_ & 0x00000002) == 0x00000002)) {
          to_bitField1_ |= 0x40000000;
        }
        result.isNeutral_ = isNeutral_;
        result.bitField0_ = to_bitField0_;
        result.bitField1_ = to_bitField1_;
        onBuilt();
        return result;
      }