📄 clubattackaction.java
字号:
if (ae.weaponFiredFrom(Mech.LOC_RARM) || ae.weaponFiredFrom(Mech.LOC_LARM)) { return new ToHitData(ToHitData.IMPOSSIBLE, "Weapons fired from arm this turn"); } // need shoulder and hand actuators if (!ae.hasWorkingSystem(Mech.ACTUATOR_SHOULDER, Mech.LOC_RARM) || !ae.hasWorkingSystem(Mech.ACTUATOR_SHOULDER, Mech.LOC_LARM)) { return new ToHitData(ToHitData.IMPOSSIBLE, "Shoulder actuator destroyed"); } if ( (!ae.hasWorkingSystem(Mech.ACTUATOR_HAND, Mech.LOC_RARM) || !ae.hasWorkingSystem(Mech.ACTUATOR_HAND, Mech.LOC_LARM)) && needsHand) { return new ToHitData(ToHitData.IMPOSSIBLE, "Hand actuator destroyed"); } } else if (shield) { if (!ae.hasPassiveShield(club.getLocation())) { return new ToHitData(ToHitData.IMPOSSIBLE, "Shield not in passive mode"); } } else if (((MiscType)club.getType()).hasSubType(MiscType.S_FLAIL)){ if (!ae.hasWorkingSystem(Mech.ACTUATOR_UPPER_ARM, club.getLocation())) { return new ToHitData(ToHitData.IMPOSSIBLE, "Upper actuator destroyed"); } if (!ae.hasWorkingSystem(Mech.ACTUATOR_LOWER_ARM, club.getLocation())) { return new ToHitData(ToHitData.IMPOSSIBLE, "Lower actuator destroyed"); } } else { // check if arm is present if (ae.isLocationBad(club.getLocation())) { return new ToHitData(ToHitData.IMPOSSIBLE, "Arm missing"); } // check if attacker has fired arm-mounted weapons if (ae.weaponFiredFrom(club.getLocation())) { return new ToHitData(ToHitData.IMPOSSIBLE, "Weapons fired from arm this turn"); } // need shoulder and hand actuators if (!ae.hasWorkingSystem(Mech.ACTUATOR_SHOULDER, club.getLocation())) { return new ToHitData(ToHitData.IMPOSSIBLE, "Shoulder actuator destroyed"); } if (!ae.hasWorkingSystem(Mech.ACTUATOR_HAND, club.getLocation()) && needsHand) { return new ToHitData(ToHitData.IMPOSSIBLE, "Hand actuator destroyed"); } } // club must not be damaged if (!shield && ae.getBadCriticals(CriticalSlot.TYPE_EQUIPMENT, ae.getEquipmentNum(club), club.getLocation()) > 0) { return new ToHitData(ToHitData.IMPOSSIBLE, "Club is damaged"); } // check elevation (target must be within one level, except for VTOL) int targetMaxElevation = attackerHeight; if(target instanceof VTOL) { targetMaxElevation ++; } if (targetHeight < attackerElevation || targetElevation > targetMaxElevation) { return new ToHitData(ToHitData.IMPOSSIBLE, "Target elevation not in range"); } // check facing int clubArc = bothArms ? Compute.ARC_FORWARD : (club.getLocation() == Mech.LOC_LARM ? Compute.ARC_LEFTARM : Compute.ARC_RIGHTARM); if ( !Compute.isInArc( ae.getPosition(), ae.getSecondaryFacing(), target.getPosition(), clubArc ) ) { return new ToHitData(ToHitData.IMPOSSIBLE, "Target not in arc"); } // can't club while prone if (ae.isProne()) { return new ToHitData(ToHitData.IMPOSSIBLE, "Attacker is prone"); } // Attacks against adjacent buildings automatically hit. if (target.getTargetType() == Targetable.TYPE_BUILDING || target.getTargetType() == Targetable.TYPE_FUEL_TANK || target instanceof GunEmplacement) { return new ToHitData( ToHitData.AUTOMATIC_SUCCESS, "Targeting adjacent building." ); } //Set the base BTH int base = 4; if ( game.getOptions().booleanOption("maxtech_physical_BTH") ) { base = ae.getCrew().getPiloting() - 1; } // Various versions of physical weapons have different base bonuses and penalties. if (((MiscType)club.getType()).hasSubType(MiscType.S_SWORD) || ((MiscType)club.getType()).isVibroblade()) { base -= 1; } else if ((((MiscType)club.getType()).hasSubType(MiscType.S_DUAL_SAW)) || (((MiscType)club.getType()).hasSubType(MiscType.S_CHAINSAW)) || (((MiscType)club.getType()).hasSubType(MiscType.S_FLAIL))) { base += 1; } else if ((((MiscType)club.getType()).hasSubType(MiscType.S_MACE_THB)) || (((MiscType)club.getType()).hasSubType(MiscType.S_MACE)) || (((MiscType)club.getType()).hasSubType(MiscType.S_BACKHOE)) || (((MiscType)club.getType()).hasSubType(MiscType.S_LANCE)) || (((MiscType)club.getType()).hasSubType(MiscType.S_BACKHOE)) || (((MiscType)club.getType()).hasSubType(MiscType.S_WRECKING_BALL))) { base += 2; } else if (((MiscType)club.getType()).hasSubType(MiscType.S_PILE_DRIVER)) { base += 3; } else if (((MiscType)club.getType()).hasSubType(MiscType.S_SHIELD_LARGE)) { base -= 3; } else if (((MiscType)club.getType()).hasSubType(MiscType.S_SHIELD_MEDIUM)) { base -= 2; } else if (((MiscType)club.getType()).hasSubType(MiscType.S_SHIELD_SMALL)) { base -= 1; } toHit = new ToHitData(base, "base"); setCommonModifiers(toHit, game, ae, target); // damaged or missing actuators if (bothArms) { if (!ae.hasWorkingSystem(Mech.ACTUATOR_UPPER_ARM, Mech.LOC_RARM)) { toHit.addModifier(2, "Upper arm actuator destroyed"); } if (!ae.hasWorkingSystem(Mech.ACTUATOR_UPPER_ARM, Mech.LOC_LARM)) { toHit.addModifier(2, "Upper arm actuator destroyed"); } if (!ae.hasWorkingSystem(Mech.ACTUATOR_LOWER_ARM, Mech.LOC_RARM)) { toHit.addModifier(2, "Lower arm actuator missing or destroyed"); } if (!ae.hasWorkingSystem(Mech.ACTUATOR_LOWER_ARM, Mech.LOC_LARM)) { toHit.addModifier(2, "Lower arm actuator missing or destroyed"); } if (hasClaws) { toHit.addModifier(2, "Mek has claws"); } } else { if (!ae.hasWorkingSystem(Mech.ACTUATOR_UPPER_ARM, club.getLocation())) { toHit.addModifier(2, "Upper arm actuator destroyed"); if ( (((MiscType)club.getType()).hasSubType(MiscType.S_LANCE)) ) return new ToHitData(ToHitData.IMPOSSIBLE, "Unable to use lance with upper arm actuator missing or destroyed"); } if (!ae.hasWorkingSystem(Mech.ACTUATOR_LOWER_ARM, club.getLocation())) { toHit.addModifier(2, "Lower arm actuator missing or destroyed"); if ( (((MiscType)club.getType()).hasSubType(MiscType.S_LANCE)) ) return new ToHitData(ToHitData.IMPOSSIBLE, "Unable to use lance with lower arm actuator missing or destroyed"); } //Rules state +2 bth if your using a club with claws. if (hasClaws) { toHit.addModifier(2, "Mek has claws"); } if ( (((MiscType)club.getType()).hasSubType(MiscType.S_LANCE)) && (!ae.hasWorkingSystem(Mech.ACTUATOR_LOWER_ARM, club.getLocation()) || !ae.hasWorkingSystem(Mech.ACTUATOR_UPPER_ARM, club.getLocation()))){ } } // elevation if (attackerElevation == targetElevation) { if (shield) toHit.setHitTable(ToHitData.HIT_PUNCH); else toHit.setHitTable(ToHitData.HIT_NORMAL); } else if (attackerElevation < targetElevation) { if (target.getHeight() == 0) { if (shield ) toHit.setHitTable(ToHitData.HIT_PUNCH); else toHit.setHitTable(ToHitData.HIT_NORMAL); } else { toHit.setHitTable(ToHitData.HIT_KICK); } } else { toHit.setHitTable(ToHitData.HIT_PUNCH); } // factor in target side toHit.setSideTable(Compute.targetSideTable(ae,target)); // done! return toHit; } public Mounted getClub() { return club; } public void setClub(Mounted club) { this.club = club; }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -