📄 tank.java
字号:
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 + -