⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tank.java

📁 MegaMek is a networked Java clone of BattleTech, a turn-based sci-fi boardgame for 2+ players. Fight
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
                typeModifier = 0.7;                break;            case IEntityMovementMode.HOVER:                typeModifier = 0.6;                break;            case IEntityMovementMode.VTOL:                typeModifier = 0.4;                break;            case IEntityMovementMode.NAVAL:                typeModifier = 0.5;                break;            default:                typeModifier = 0.5;        }                dbv *= typeModifier;                // adjust for target movement modifier        int tmmRan = Compute.getTargetMovementModifier(getOriginalRunMP(), false, false, false).getValue();        if (tmmRan > 5) {            tmmRan = 5;        }        double[] tmmFactors = { 1.0, 1.1, 1.2, 1.3, 1.4, 1.5 };        dbv *= tmmFactors[tmmRan];                double weaponBV = 0;        // figure out base weapon bv        double weaponsBVFront = 0;        double weaponsBVRear = 0;        boolean hasTargComp = hasTargComp();        for (Mounted mounted : getWeaponList()) {            WeaponType wtype = (WeaponType)mounted.getType();            double dBV = wtype.getBV(this);            // don't count destroyed equipment            if (mounted.isDestroyed())                continue;            // don't count AMS, it's defensive            if (wtype.hasFlag(WeaponType.F_AMS)) {                continue;            }                        // artemis bumps up the value            if (mounted.getLinkedBy() != null) {                Mounted mLinker = mounted.getLinkedBy();                if (mLinker.getType() instanceof MiscType &&                         mLinker.getType().hasFlag(MiscType.F_ARTEMIS)) {                    dBV *= 1.2;                }            }                         // and we'll add the tcomp here too            if (wtype.hasFlag(WeaponType.F_DIRECT_FIRE) && hasTargComp) {                dBV *= 1.2;            }                        if (mounted.getLocation() == LOC_REAR) {                weaponsBVRear += dBV;            } else {                weaponsBVFront += dBV;            }        }        if (weaponsBVFront > weaponsBVRear) {            weaponBV += weaponsBVFront;            weaponBV += (weaponsBVRear * 0.5);        } else {            weaponBV += weaponsBVRear;            weaponBV += (weaponsBVFront * 0.5);        }                // add ammo bv        double ammoBV = 0;        for (Mounted mounted : getAmmo()) {            AmmoType atype = (AmmoType)mounted.getType();                        // don't count depleted ammo            if (mounted.getShotsLeft() == 0)                continue;            // don't count AMS, it's defensive            if (atype.getAmmoType() == AmmoType.T_AMS) {                continue;            }            ammoBV += atype.getBV(this);        }        weaponBV += ammoBV;        // adjust further for speed factor        double[] speedFactorTable = {0.44,0.54,0.65,0.77,0.88,1,1.12,1.24,1.37,                                     1.5,1.63,1.76,1.89,2.02,2.16,2.3,2.44,2.58,                                     2.72,2.86,3,3.15,3.29,3.44,3.59,3.74};        double speedFactor = 3.74;        if(getOriginalRunMP() < speedFactorTable.length)            speedFactor = speedFactorTable[getOriginalRunMP()];        /* Vehicles don't use the same speed factor calc as 'Mechs!        double speedFactor = getOriginalRunMP() - 5;        speedFactor /= 10;        speedFactor++;        speedFactor = Math.pow(speedFactor, 1.2);        speedFactor = Math.round(speedFactor * 100) / 100.0;        */        obv = weaponBV * speedFactor;        // we get extra bv from c3 networks. a valid network requires at least 2 members        // some hackery and magic numbers here.  could be better        // also, each 'has' loops through all equipment.  inefficient to do it 3 times        double xbv = 0.0;        if ((hasC3MM() && calculateFreeC3MNodes() < 2) ||            (hasC3M() && calculateFreeC3Nodes() < 3) ||            (hasC3S() && C3Master > NONE) ||            (hasC3i() && calculateFreeC3Nodes() < 5) ||            assumeLinkedC3) {                xbv = Math.round(0.35 * weaponsBVFront + (0.5 * weaponsBVRear));        }        // Possibly adjust for TAG and Arrow IV.        if (getsTagBVPenalty()) {            dbv += 200;        }        if (getsHomingBVPenalty()) {            dbv += 200;        }        // and then factor in pilot        double pilotFactor = crew.getBVSkillMultiplier();        //return (int)Math.round((dbv + obv + xbv) * pilotFactor);        int finalBV = (int)Math.round(dbv + obv + xbv);        int retVal = (int)Math.round(finalBV * pilotFactor);        return retVal;    }        public PilotingRollData addEntityBonuses(PilotingRollData prd)    {        if(movementDamage > 0) {            prd.addModifier(movementDamage, "Steering Damage");        }        return prd;    }    public Vector victoryReport() {        Vector vDesc = new Vector();        Report r = new Report(7025);        r.type = Report.PUBLIC;        r.addDesc(this);        vDesc.addElement(r);        r = new Report(7035);        r.type = Report.PUBLIC;        r.newlines = 0;        vDesc.addElement(r);        vDesc.addAll(crew.getDescVector(false));        r = new Report(7070, Report.PUBLIC);        r.add(getKillNumber());        vDesc.addElement(r);                if(isDestroyed()) {            Entity killer = game.getEntity(killerId);            if(killer == null) {                killer = game.getOutOfGameEntity(killerId);            }            if(killer != null) {                r = new Report(7072, Report.PUBLIC);                r.addDesc(killer);            } else {                r = new Report(7073, Report.PUBLIC);            }            vDesc.addElement(r);        }        r.newlines = 2;        return vDesc;    }        public int[] getNoOfSlots()    {        return NUM_OF_SLOTS;    }    /**     * Tanks don't have MASC     */    public int getRunMPwithoutMASC(boolean gravity) {        return getRunMP(gravity);    }        public int getHeatCapacity() {        return 999;    }            public int getHeatCapacityWithWater() {        return getHeatCapacity();    }        public int getEngineCritHeat() {        return 0;    }        public void autoSetInternal()    {        int nInternal = (int)Math.ceil(weight / 10.0);        // No internals in the body location.        this.initializeInternal( IArmorState.ARMOR_NA, LOC_BODY );        for (int x = 1; x < locations(); x++) {            initializeInternal(nInternal, x);        }    }        public int getMaxElevationChange()    {        return 1;    }    /**     * Determine if the unit can be repaired, or only harvested for spares.     *     * @return  A <code>boolean</code> that is <code>true</code> if the unit     *          can be repaired (given enough time and parts); if this value     *          is <code>false</code>, the unit is only a source of spares.     * @see     Entity#isSalvage()     */    public boolean isRepairable() {        // A tank is repairable if it is salvageable,        // and none of its body internals are gone.        boolean retval = this.isSalvage();        int loc = Tank.LOC_FRONT;        while ( retval && loc < Tank.LOC_TURRET ) {            int loc_is = this.getInternal( loc );            loc++;            retval = (loc_is != IArmorState.ARMOR_DOOMED) && (loc_is != IArmorState.ARMOR_DESTROYED);        }        return retval;    }    /**     * Restores the entity after serialization     */    public void restore() {        super.restore();        // Restore our jammed gun, if necessary.        if ( m_nJammedTurns > 0 && null == m_jammedGun ) {            m_jammedGun = this.getMainWeapon();        }    }    public boolean canCharge() {        // Tanks can charge, except Hovers when the option is set        return super.canCharge() && !(game.getOptions().booleanOption("no_hover_charge") && IEntityMovementMode.HOVER==getMovementMode());    }    public boolean canDFA() {        // Tanks can't DFA        return false;    }    public int getArmorType()    {        return armorType;    }    public void setArmorType(int type)    {        armorType = type;    }    public int getStructureType()    {        return structureType;    }    public void setStructureType(int type)    {        structureType = type;    }    /**     * @return suspension factor of vehicle     */    public int getSuspensionFactor () {        switch (movementMode) {            case IEntityMovementMode.HOVER:                if (weight<=10) return 40;                if (weight<=20) return 85;                if (weight<=30) return 130;                if (weight<=40) return 175;                return 235;            case IEntityMovementMode.HYDROFOIL:                if (weight<=10) return 60;                if (weight<=20) return 105;                if (weight<=30) return 150;                if (weight<=40) return 195;                if (weight<=50) return 255;                if (weight<=60) return 300;                if (weight<=70) return 345;                if (weight<=80) return 390;                if (weight<=90) return 435;                return 480;            case IEntityMovementMode.NAVAL:            case IEntityMovementMode.SUBMARINE:                return 30;            case IEntityMovementMode.TRACKED:                return 0;            case IEntityMovementMode.WHEELED:                return 20;            case IEntityMovementMode.VTOL:                if (weight<=10) return 50;                if (weight<=20) return 95;                return 140;        }        return 0;    }        public double getCost() {        double cost = 0;        Engine engine = getEngine();        cost += engine.getBaseCost() * engine.getRating() * weight / 75.0;        double controlWeight = Math.ceil(weight*0.05*2.0)/2.0; //? should be rounded up to nearest half-ton        cost += 10000*controlWeight;        cost += weight/10.0*10000; // IS has no variations, no Endo etc.        double freeHeatSinks = engine.getCountEngineHeatSinks();        int sinks=0;        double turretWeight=0;        double paWeight=0;        for (Mounted m : getWeaponList()) {            WeaponType wt = (WeaponType) m.getType();            if(wt.hasFlag(WeaponType.F_LASER) || wt.hasFlag(WeaponType.F_PPC)) {                sinks+=wt.getHeat();                paWeight+=wt.getTonnage(this)/10.0;            }            if(!hasNoTurret() && m.getLocation()==Tank.LOC_TURRET) {                turretWeight+=wt.getTonnage(this)/10.0;            }        }        paWeight=Math.ceil(paWeight*10.0)/10;        if (engine.isFusion()) {            paWeight=0;        }        turretWeight=Math.ceil(turretWeight*2)/2;        cost+=20000*paWeight;        cost+=2000*Math.max(0,sinks-freeHeatSinks);        cost+=turretWeight*5000;        cost+=getArmorWeight()*EquipmentType.getArmorCost(armorType);//armor        double diveTonnage;        switch (movementMode) {            case IEntityMovementMode.HOVER:            case IEntityMovementMode.HYDROFOIL:            case IEntityMovementMode.VTOL:            case IEntityMovementMode.SUBMARINE:                diveTonnage = weight/10.0;                break;            default:                diveTonnage = 0.0;                break;        }        if (movementMode!=IEntityMovementMode.VTOL) {            cost += diveTonnage*20000;        } else {            cost += diveTonnage*40000;        }        cost += getWeaponsAndEquipmentCost();        double multiplier = 1.0;        switch (movementMode) {            case IEntityMovementMode.HOVER:            case IEntityMovementMode.SUBMARINE:                multiplier += weight/50.0;                break;            case IEntityMovementMode.HYDROFOIL:                multiplier += weight/75.0;                break;            case IEntityMovementMode.NAVAL:            case IEntityMovementMode.WHEELED:                multiplier += weight/200.0;                break;            case IEntityMovementMode.TRACKED:                multiplier += weight/100.0;                break;            case IEntityMovementMode.VTOL:                multiplier += weight/30.0;                break;        }         return Math.round(cost*multiplier);    }    public boolean doomedInVacuum() {        for (Mounted m : getEquipment()) {            if (m.getType() instanceof MiscType && m.getType().hasFlag(MiscType.F_VACUUM_PROTECTION)) {                return false;            }        }        return true;    }    public boolean canGoHullDown () {    	return game.getOptions().booleanOption("hull_down");    }        public void setOnFire(boolean inferno) {        infernoFire |= inferno;        burningLocations = (1<<locations()) - 1;        extinguishLocation(LOC_BODY);    }        public boolean isOnFire() {        return (burningLocations != 0) || infernos.isStillBurning();    }        public boolean isInfernoFire() {        return infernoFire;    }        public boolean isLocationBurning(int location) {        int flag = (1<<location);        return (burningLocations & flag) == flag;    }        public void extinguishLocation(int location) {        int flag = ~(1<<location);        burningLocations &= flag;    }        public void extinguishAll() {        burningLocations = 0;        infernoFire = false;        infernos.clear();    }        public void addMovementDamage(int level) {        movementDamage += level;    }    public void setEngine(Engine e) {        engine = e;        if (e.engineValid) {            setOriginalWalkMP(calculateWalk());        }    }    protected int calculateWalk() {        return (getEngine().getRating() + getSuspensionFactor()) / (int)this.weight;    }    public boolean isNuclearHardened() {        return true;    }        protected void addEquipment(Mounted mounted, int loc, boolean rearMounted)    throws LocationFullException {        super.addEquipment(mounted,loc, rearMounted);        // Add the piece equipment to our slots.        addCritical(loc, new CriticalSlot(CriticalSlot.TYPE_EQUIPMENT,                                           getEquipmentNum(mounted),                                           true));    }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -