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

📄 testmech.java

📁 MegaMek is a networked Java clone of BattleTech, a turn-based sci-fi boardgame for 2+ players. Fight
💻 JAVA
字号:
/* * MegaMek - * Copyright (C) 2000,2001,2002,2003,2004,2005 Ben Mazur (bmazur@sev.org) * *  This program is free software; you can redistribute it and/or modify it *  under the terms of the GNU General Public License as published by the Free *  Software Foundation; either version 2 of the License, or (at your option) *  any later version. * *  This program is distributed in the hope that it will be useful, but *  WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY *  or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License *  for more details. *//* * Author: Reinhard Vicinus */package megamek.common.verifier;import megamek.common.Entity;import megamek.common.Mech;import megamek.common.CriticalSlot;import megamek.common.Mounted;import megamek.common.EquipmentType;import megamek.common.WeaponType;import megamek.common.AmmoType;import megamek.common.MiscType;import megamek.common.TechConstants;import megamek.common.util.StringUtil;import java.util.Vector;import java.util.Enumeration;import java.lang.StringBuffer;public class TestMech extends TestEntity {    private Mech mech = null;    public TestMech(Mech mech, TestEntityOption option, String fileString) {        super(option, mech.getEngine(), getArmor(mech), getStructure(mech));        this.mech = mech;        this.fileString = fileString;    }    private static Structure getStructure(Mech mech) {        int type = mech.getStructureType();        int flag = 0;        if (mech.isClan())            flag |= Structure.CLAN_STRUCTURE;        return new Structure(type, flag);    }    private static Armor getArmor(Mech mech) {        int type = mech.getArmorType();        int flag = 0;        if (mech.isClanArmor())            flag |= Armor.CLAN_ARMOR;        return new Armor(type, flag);    }    public Entity getEntity() {        return mech;    }    public boolean isTank() {        return false;    }    public boolean isMech() {        return true;    }    public float getWeightMisc() {        return 0.0f;    }    public float getWeightCockpit() {        if (mech.getCockpitType() == Mech.COCKPIT_SMALL) {            return 2.0f;        } else if (mech.getCockpitType() == Mech.COCKPIT_TORSO_MOUNTED) {            return 4.0f;        } else if (mech.getCockpitType() == Mech.COCKPIT_COMMAND_CONSOLE) {            // Technically, it's two separate 3-ton pieces of equipment.            // We're ignoring that and returning the total, because it's easier.            return 6.0f;        } else if (mech.getCockpitType() == Mech.COCKPIT_DUAL) {            // This is wrong; I just don't remember the correct weight.            //FIXME            return 3.0f;        } else {            return 3.0f;        }    }    public float getWeightGyro() {        float retVal = ceil(engine.getRating() / 100.0f, getWeightCeilingGyro());        if (mech.getGyroType() == Mech.GYRO_XL)            retVal /= 2;        else if (mech.getGyroType() == Mech.GYRO_COMPACT)            retVal *= 1.5;        else if (mech.getGyroType() == Mech.GYRO_HEAVY_DUTY)            retVal *= 2;        return retVal;    }    public float getWeightControls() {        return getWeightCockpit()+getWeightGyro();    }    public int getCountHeatSinks() {        return mech.heatSinks();    }    public int getWeightHeatSinks() {        return mech.heatSinks() - engine.getCountEngineHeatSinks();    }    public boolean hasDoubleHeatSinks() {        if (mech.heatSinks() != mech.getHeatCapacity())            return true;        return false;    }    public String printWeightMisc() {        return "";    }    public String printWeightControls() {        StringBuffer retVal = new StringBuffer(StringUtil.makeLength(mech.getCockpitTypeString()+":", getPrintSize()-5));        retVal.append(makeWeightString(getWeightCockpit()));        retVal.append("\n");        retVal.append(StringUtil.makeLength(mech.getGyroTypeString()+":", getPrintSize()-5));        retVal.append(makeWeightString(getWeightGyro()));        retVal.append("\n");        return retVal.toString();    }    public Mech getMech()    {        return mech;    }    public int countCriticalSlotsFromEquipInLocation(Entity entity,            int eNum, int location)    {        int count = 0;        for(int slots=0; slots<entity.getNumberOfCriticals(location); slots++)        {            CriticalSlot slot = entity.getCritical(location, slots);            if (slot==null || slot.getType()==CriticalSlot.TYPE_SYSTEM)            {                continue;            }            else if (slot.getType()==CriticalSlot.TYPE_EQUIPMENT)            {                if (slot.getIndex()==eNum)                    count++;            }            else            {                // Ignore this?            }        }        return count;    }    public boolean criticalSlotsAllocated(Entity entity, Mounted mounted,            Vector allocation)    {        int eNum = entity.getEquipmentNum(mounted);        int location = mounted.getLocation();        EquipmentType et = mounted.getType();        int criticals = 0;        if (et instanceof MiscType)        {            criticals = calcMiscCrits((MiscType) et);        } else            criticals = et.getCriticals(entity);        int count = 0;        if (location == Entity.LOC_NONE)            return true;        if (et.isSpreadable() && !et.getName().equals("Targeting Computer"))        {            for(int locations = 0; locations < entity.locations(); locations++)            {                count += countCriticalSlotsFromEquipInLocation(entity, eNum,                         locations);            }        }        else            count = countCriticalSlotsFromEquipInLocation(entity, eNum,                    location);        if (et instanceof WeaponType && mounted.isSplit())        {            int secCound = 0;            for(int locations = 0; locations < entity.locations(); locations++)            {                if (locations==location)                    continue;                                secCound = countCriticalSlotsFromEquipInLocation(entity,                        eNum, locations);                if (secCound!=0 &&                       location == Mech.mostRestrictiveLoc(locations, location))                {                    count += secCound;                    break;                }            }        }        if (count==criticals)            return true;        allocation.addElement(mounted);        allocation.addElement(new Integer(criticals));        allocation.addElement(new Integer(count));        return false;    }    public void checkCriticalSlotsForEquipment(Entity entity,            Vector unallocated, Vector allocation, Vector heatSinks)    {        int countInternalHeatSinks = 0;        for (Mounted m : entity.getEquipment()) {            if (m.getLocation()==Entity.LOC_NONE)            {                if (m.getType() instanceof AmmoType &&                        m.getShotsLeft()==1)                {                    continue;                }                if (!(m.getType() instanceof MiscType))                {                    unallocated.addElement(m);                    continue;                }                MiscType mt = (MiscType) m.getType();                if (mt.hasFlag(MiscType.F_HEAT_SINK) ||                         mt.hasFlag(MiscType.F_DOUBLE_HEAT_SINK))                    countInternalHeatSinks++;                else                {                    unallocated.addElement(m);                    continue;                }            } else if (!criticalSlotsAllocated(entity, m, allocation))            {            }        }        if ((countInternalHeatSinks > engine.integralHeatSinkCapacity()) ||             (countInternalHeatSinks < engine.integralHeatSinkCapacity() &&              countInternalHeatSinks != ((Mech)entity).heatSinks() &&              !entity.isOmni()))        {            heatSinks.addElement(new Integer(countInternalHeatSinks));        }    }    public void checkCriticals()    {        Vector unallocated = new Vector();        Vector allocation = new Vector();        Vector heatSinks = new Vector();        checkCriticalSlotsForEquipment(mech, unallocated, allocation,                 heatSinks);    }    public boolean correctCriticals(StringBuffer buff)    {        Vector unallocated = new Vector();        Vector allocation = new Vector();        Vector heatSinks = new Vector();        checkCriticalSlotsForEquipment(mech, unallocated, allocation,                 heatSinks);        boolean correct = true;        if (!unallocated.isEmpty())        {            buff.append("Unallocated Equipment:\n");            for(Enumeration e = unallocated.elements(); e.hasMoreElements(); )            {                Mounted m = (Mounted) e.nextElement();                buff.append(m.getType().getInternalName())                    .append("\n");            }            correct = false;        }        if (!allocation.isEmpty())        {            buff.append("Allocated Equipment:\n");            for(Enumeration e = allocation.elements(); e.hasMoreElements(); )            {                Mounted m = (Mounted) e.nextElement();                int needCrits = ((Integer) e.nextElement()).intValue();                int aktCrits = ((Integer) e.nextElement()).intValue();                buff.append(m.getType().getInternalName())                    .append(" has ").append(needCrits)                    .append(" Slots, but ").append(aktCrits)                    .append(" Slots are allocated!").append("\n");            }            correct = false;        }        if (!heatSinks.isEmpty())        {            int sinks = ((Integer) heatSinks.elements().nextElement())                .intValue();            buff.append(sinks).append(" of ")                .append(engine.integralHeatSinkCapacity())                .append(" possible Internal Heat Sinks!").append("\n");            correct = false;        }        if (!checkSystemCriticals(buff)) {            correct = false;        }        return correct;    }    private boolean checkSystemCriticals(StringBuffer buff) {        //Engine criticals        boolean engineCorrect = true;        int requiredSideCrits = engine.getSideTorsoCriticalSlots().length;        if ((requiredSideCrits !=             mech.getNumberOfCriticals(CriticalSlot.TYPE_SYSTEM,                                       Mech.SYSTEM_ENGINE, Mech.LOC_LT)) ||            (requiredSideCrits !=             mech.getNumberOfCriticals(CriticalSlot.TYPE_SYSTEM,                                       Mech.SYSTEM_ENGINE, Mech.LOC_RT)))            engineCorrect = false;        if (engine.getCenterTorsoCriticalSlots().length !=            mech.getNumberOfCriticals(CriticalSlot.TYPE_SYSTEM,                                      Mech.SYSTEM_ENGINE, Mech.LOC_CT))            engineCorrect = false;        if (!engineCorrect)            buff.append("Engine: Incorrect number of criticals allocated.\n");        if (!engineCorrect)            return false;        return true;    }    public String printArmorLocProp(int loc, int wert)    {        return " is greater then "+Integer.toString(wert)+"!";    }    public boolean correctArmor(StringBuffer buff)    {        boolean correct = true;        for(int loc = 0; loc < mech.locations(); loc++)        {            if (loc == Mech.LOC_HEAD)            {                if (mech.getOArmor(Mech.LOC_HEAD)>9)                {                    buff.append(printArmorLocation(Mech.LOC_HEAD))                        .append(printArmorLocProp(Mech.LOC_HEAD, 9))                        .append("\n");                    correct = false;                }            } else if ((mech.getOArmor(loc) +                        ( mech.hasRearArmor(loc)?mech.getOArmor(loc,true):0 ))                    > 2*mech.getOInternal(loc))            {                 buff.append(printArmorLocation(loc))                     .append(printArmorLocProp(loc, 2*mech.getOInternal(loc)))                     .append("\n");                 correct = false;            }        }        return correct;    }    public boolean correctMovement(StringBuffer buff) {        if(mech.getOriginalJumpMP() > mech.getOriginalRunMPwithoutMASC()) {            buff.append("Jump MP exceeds run MP\n");            return false;        }        if(mech.getOriginalJumpMP() > mech.getOriginalWalkMP()                && mech.getTechLevel() != TechConstants.T_CLAN_LEVEL_3                && mech.getTechLevel() != TechConstants.T_IS_LEVEL_3) {            buff.append("Jump MP exceeds walk MP for level 2 construction");            return false;        }        return true;    }        public boolean correctEntity(StringBuffer buff) {        return correctEntity(buff, true);    }    public boolean correctEntity(StringBuffer buff, boolean ignoreAmmo)    {        boolean correct = true;        if (skip())            return true;        if (!correctWeight(buff))        {            buff.insert(0, printTechLevel()+printShortMovement());            buff.append(printWeightCalculation());            correct = false;        }        if (!engine.engineValid)        {            buff.append(engine.problem.toString()).append("\n\n");            correct = false;        }        if (showCorrectArmor() && !correctArmor(buff))            correct = false;        if (showCorrectCritical() && !correctCriticals(buff))            correct = false;        if (showFailedEquip() && hasFailedEquipment(buff))            correct = false;        if (hasIllegalTechLevels(buff, ignoreAmmo))            correct = false;        correct = correct && correctMovement(buff);        return correct;    }    public StringBuffer printEntity()    {        StringBuffer buff = new StringBuffer();        buff.append("Mech: ").append(mech.getDisplayName()).append("\n");        buff.append("Found in: ").append(this.fileString).append("\n");        buff.append(printTechLevel());        buff.append(printShortMovement());        if (correctWeight(buff, true, true))            buff.append("Weight: ").append(getWeight())                .append(" (").append(calculateWeight())                .append(")\n");        buff.append(printWeightCalculation()).append("\n");        buff.append(printArmorPlacement());        correctArmor(buff);        buff.append(printLocations());        correctCriticals(buff);//        printArmor(buff);        printFailedEquipment(buff);        return buff;    }    public String getName()    {        return "Mech: "+mech.getDisplayName();    }}

⌨️ 快捷键说明

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