diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 2a9b274f97a..e1e09b0e916 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -24,7 +24,7 @@ jobs: matrix: os: [ ubuntu-latest ] # For CI/CD running on *nix is sufficient java-distribution: [ temurin ] - java-version: [ 11 ] + java-version: [ 11, 17 ] fail-fast: false steps: diff --git a/.github/workflows/code-coverage.yml b/.github/workflows/code-coverage.yml index 660dcd3a799..da70ad66814 100644 --- a/.github/workflows/code-coverage.yml +++ b/.github/workflows/code-coverage.yml @@ -24,7 +24,7 @@ jobs: matrix: os: [ ubuntu-latest ] # For Code QL running on *nix is sufficient java-distribution: [ temurin ] - java-version: [ 11 ] + java-version: [ 17 ] steps: # Checkout the Pull Request source and put it in: ./megamek diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index 354db19e486..4d5e0a49f34 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -30,7 +30,7 @@ jobs: os: [ ubuntu-latest ] # For Code QL running on *nix is sufficient language: [ 'java' ] java-distribution: [ temurin ] - java-version: [ 11 ] + java-version: [ 17 ] fail-fast: false steps: diff --git a/.github/workflows/nightly-ci.yml b/.github/workflows/nightly-ci.yml index 151d183c4c5..c856f09421d 100644 --- a/.github/workflows/nightly-ci.yml +++ b/.github/workflows/nightly-ci.yml @@ -23,7 +23,7 @@ jobs: matrix: os: [ ubuntu-latest, windows-latest ] java-distribution: [ temurin ] - java-version: [ 11 ] + java-version: [ 11, 17 ] fail-fast: false name: Nightly MegaMek CI ${{ matrix.os }} on ${{ matrix.java-distribution }} JDK ${{ matrix.java-version }} diff --git a/.github/workflows/update-maven-repo.yml b/.github/workflows/update-maven-repo.yml index f038f76f317..6faa3cf95b5 100644 --- a/.github/workflows/update-maven-repo.yml +++ b/.github/workflows/update-maven-repo.yml @@ -18,7 +18,7 @@ jobs: matrix: os: [ ubuntu-latest ] # For Maven Repository Update running on *nix is sufficient java-distribution: [ temurin ] - java-version: [ 11 ] + java-version: [ 17 ] steps: # Put the MM repo in a subfolder to make updating the Maven repo easier diff --git a/.github/workflows/validate-boards.yml b/.github/workflows/validate-boards.yml index 681518fd974..db29469cff3 100644 --- a/.github/workflows/validate-boards.yml +++ b/.github/workflows/validate-boards.yml @@ -36,7 +36,7 @@ jobs: matrix: os: [ ubuntu-latest ] # For Board Validation running on *nix is sufficient java-distribution: [ temurin ] - java-version: [ 11 ] + java-version: [ 17 ] steps: - uses: actions/checkout@v2 diff --git a/build.gradle b/build.gradle index 44a5e006ae7..29bbbd3efd2 100644 --- a/build.gradle +++ b/build.gradle @@ -16,7 +16,7 @@ allprojects { subprojects { group = 'org.megamek' - version = '0.49.11-SNAPSHOT' + version = '0.49.12-SNAPSHOT' } ext { diff --git a/megamek/build.gradle b/megamek/build.gradle index 84b7edd3a64..eb97a2ba420 100644 --- a/megamek/build.gradle +++ b/megamek/build.gradle @@ -31,7 +31,7 @@ dependencies { implementation 'com.formdev:flatlaf:2.6' implementation 'com.github.ikkisoft:SerialKiller:master-SNAPSHOT' implementation 'com.sun.mail:jakarta.mail:2.0.1' - implementation 'com.thoughtworks.xstream:xstream:1.4.14' + implementation 'com.thoughtworks.xstream:xstream:1.4.19' implementation 'jakarta.xml.bind:jakarta.xml.bind-api:4.0.0' implementation 'org.apache.commons:commons-text:1.10.0' implementation 'org.apache.logging.log4j:log4j-core:2.19.0' @@ -40,13 +40,13 @@ dependencies { runtimeOnly 'org.glassfish.jaxb:jaxb-runtime:4.0.1' testImplementation 'org.junit.jupiter:junit-jupiter:5.9.1' - testImplementation 'org.mockito:mockito-core:4.9.0' + testImplementation 'org.mockito:mockito-core:4.10.0' } mainClassName = 'megamek.MegaMek' ext { - mmJvmOptions = ['-Xmx2048m'] + mmJvmOptions = ['-Xmx2048m', '--add-opens', 'java.base/java.util=ALL-UNNAMED', '--add-opens', 'java.base/java.util.concurrent=ALL-UNNAMED'] data = 'data' unitFiles = "${data}/mechfiles" rats = "${data}/rat" @@ -64,12 +64,17 @@ ext { scriptTemplate = "${scriptsDir}/startScriptTemplate.txt" } +run { + jvmArgs = mmJvmOptions +} + jar { archiveFileName = 'MegaMek.jar' manifest { attributes "Main-Class" : mainClassName attributes "Class-Path" : project.sourceSets.main.runtimeClasspath.files .findAll { it.name.endsWith(".jar") }.collect { "${lib}/${it.name}" }.join(' ') + attributes "Add-Opens" : 'java.base/java.util java.base/java.util.concurrent' attributes "Build-Date" : LocalDateTime.now() } } diff --git a/megamek/data/canonUnitQuirks.xml b/megamek/data/canonUnitQuirks.xml index 7037c5d76fc..63fb7552404 100644 --- a/megamek/data/canonUnitQuirks.xml +++ b/megamek/data/canonUnitQuirks.xml @@ -3808,6 +3808,12 @@ Example: You can define quirks that affect all units of a given chassis and then easy_pilot non_standard + + + Chameleon + Mech + easy_pilot + Chameleon @@ -3818,14 +3824,24 @@ Example: You can define quirks that affect all units of a given chassis and then Chameleon + CLN-7V Mech easy_pilot Chameleon - CLN-7V + CLN-8V Mech + distracting + easy_pilot + + + + Chameleon + CLN-9V + Mech + distracting easy_pilot @@ -10480,6 +10496,270 @@ Example: You can define quirks that affect all units of a given chassis and then bad_rep_clan no_arms + + + Naga II + Prime + Mech + ext_twist + bad_rep_clan + + stable_weapon + CT + 10 + CLERSmallLaser + + + stable_weapon + RT + 2 + CLLRM20 + + + stable_weapon + RA + 2 + CLUltraAC10 + + + stable_weapon + LA + 2 + CLLBXAC10 + + + + + Naga II + A + Mech + ext_twist + bad_rep_clan + + stable_weapon + CT + 10 + CLERSmallLaser + + + stable_weapon + LT + 2 + CLStreakSRM6 + + + stable_weapon + RA + 10 + CLERLargeLaser + + + stable_weapon + RA + 11 + CLERLargeLaser + + + stable_weapon + LA + 2 + CLLBXAC20 + + + + + Naga II + B + Mech + ext_twist + bad_rep_clan + + stable_weapon + RT + 2 + CLNarcBeacon + + + stable_weapon + LT + 2 + CLAntiMissileSystem + + + stable_weapon + RA + 2 + CLLRM20 + + + stable_weapon + RA + 6 + CLLRM20 + + + stable_weapon + LA + 2 + CLLRM20 + + + stable_weapon + LA + 6 + CLLRM20 + + + + + Naga II + C + Mech + ext_twist + bad_rep_clan + + stable_weapon + RT + 4 + CLMG + + + stable_weapon + RT + 5 + CLMG + + + stable_weapon + LT + 2 + CLLRM15 + + + stable_weapon + LT + 4 + CLMG + + + stable_weapon + LT + 5 + CLMG + + + stable_weapon + RA + 2 + CLUltraAC5 + + + stable_weapon + RA + 5 + CLMediumPulseLaser + + + stable_weapon + LA + 2 + CLStreakSRM6 + + + stable_weapon + LA + 4 + CLLargePulseLaser + + + stable_weapon + LA + 6 + CLMediumPulseLaser + + + + + Naga II + H + Mech + ext_twist + bad_rep_clan + + stable_weapon + CT + 10 + CLHeavySmallLaser + + + stable_weapon + LT + 2 + CLLRM20 + + + stable_weapon + RA + 4 + CLHeavyLargeLaser + + + stable_weapon + RA + 7 + CLHeavyMediumLaser + + + stable_weapon + RA + 9 + CLHeavyMediumLaser + + + stable_weapon + LA + 2 + CLGaussRifle + + + + + Naga II + W + Mech + ext_twist + bad_rep_clan + + stable_weapon + CT + 10 + CLERSmallLaser + + + stable_weapon + RT + 2 + CLStreakLRM15 + + + stable_weapon + LT + 4 + CLERMediumLaser + + + stable_weapon + RA + 2 + CLERPPC + + + stable_weapon + LA + 2 + CLRotaryAC5 + + Naginata diff --git a/megamek/data/images/fluff/mech/Thorn THE-S.jpg b/megamek/data/images/fluff/Mech/Thorn THE-S.jpg similarity index 100% rename from megamek/data/images/fluff/mech/Thorn THE-S.jpg rename to megamek/data/images/fluff/Mech/Thorn THE-S.jpg diff --git a/megamek/data/images/units/battle armor/Tinstar_4.png b/megamek/data/images/units/battle armor/Tinstar_4.png index 40de3fbd746..b8025d159fa 100644 Binary files a/megamek/data/images/units/battle armor/Tinstar_4.png and b/megamek/data/images/units/battle armor/Tinstar_4.png differ diff --git a/megamek/data/images/units/battle armor/Tinstar_5.png b/megamek/data/images/units/battle armor/Tinstar_5.png index 11f2ceec41a..1c23e57f60b 100644 Binary files a/megamek/data/images/units/battle armor/Tinstar_5.png and b/megamek/data/images/units/battle armor/Tinstar_5.png differ diff --git a/megamek/data/images/units/battle armor/Tinstar_6.png b/megamek/data/images/units/battle armor/Tinstar_6.png index fb4ae733bfa..7681d0c12b4 100644 Binary files a/megamek/data/images/units/battle armor/Tinstar_6.png and b/megamek/data/images/units/battle armor/Tinstar_6.png differ diff --git a/megamek/data/images/units/mechs/BattleCobra-CO.png b/megamek/data/images/units/mechs/BattleCobra-CO.png deleted file mode 100644 index 5374f4f01bc..00000000000 Binary files a/megamek/data/images/units/mechs/BattleCobra-CO.png and /dev/null differ diff --git a/megamek/data/images/units/mechs/BattleCobra.png b/megamek/data/images/units/mechs/BattleCobra.png index d8c2a20bc65..68f6edebdd4 100644 Binary files a/megamek/data/images/units/mechs/BattleCobra.png and b/megamek/data/images/units/mechs/BattleCobra.png differ diff --git a/megamek/data/images/units/mechs/BattleCobraCS-CO.png b/megamek/data/images/units/mechs/BattleCobraCS-CO.png deleted file mode 100644 index 3dbf3b5df71..00000000000 Binary files a/megamek/data/images/units/mechs/BattleCobraCS-CO.png and /dev/null differ diff --git a/megamek/data/images/units/mechs/BattleCobraCS.png b/megamek/data/images/units/mechs/BattleCobraCS.png index bb0316c13d2..52b4ff0c441 100644 Binary files a/megamek/data/images/units/mechs/BattleCobraCS.png and b/megamek/data/images/units/mechs/BattleCobraCS.png differ diff --git a/megamek/data/images/units/mechs/BattleCobraCS_A-CO.png b/megamek/data/images/units/mechs/BattleCobraCS_A-CO.png deleted file mode 100644 index 765d4ac43b3..00000000000 Binary files a/megamek/data/images/units/mechs/BattleCobraCS_A-CO.png and /dev/null differ diff --git a/megamek/data/images/units/mechs/BattleCobraCS_A.png b/megamek/data/images/units/mechs/BattleCobraCS_A.png index 921a0c55e8b..cf14efac2ce 100644 Binary files a/megamek/data/images/units/mechs/BattleCobraCS_A.png and b/megamek/data/images/units/mechs/BattleCobraCS_A.png differ diff --git a/megamek/data/images/units/mechs/BattleCobraCS_B-CO.png b/megamek/data/images/units/mechs/BattleCobraCS_B-CO.png deleted file mode 100644 index ee58ebfd869..00000000000 Binary files a/megamek/data/images/units/mechs/BattleCobraCS_B-CO.png and /dev/null differ diff --git a/megamek/data/images/units/mechs/BattleCobraCS_B.png b/megamek/data/images/units/mechs/BattleCobraCS_B.png index e0a11a93d2d..ee9396e7832 100644 Binary files a/megamek/data/images/units/mechs/BattleCobraCS_B.png and b/megamek/data/images/units/mechs/BattleCobraCS_B.png differ diff --git a/megamek/data/images/units/mechs/BattleCobraCS_C-CO.png b/megamek/data/images/units/mechs/BattleCobraCS_C-CO.png deleted file mode 100644 index a6ba04a61bb..00000000000 Binary files a/megamek/data/images/units/mechs/BattleCobraCS_C-CO.png and /dev/null differ diff --git a/megamek/data/images/units/mechs/BattleCobraCS_C.png b/megamek/data/images/units/mechs/BattleCobraCS_C.png index c54261f21f3..90e7d724c11 100644 Binary files a/megamek/data/images/units/mechs/BattleCobraCS_C.png and b/megamek/data/images/units/mechs/BattleCobraCS_C.png differ diff --git a/megamek/data/images/units/mechs/BattleCobraCS_D-CO.png b/megamek/data/images/units/mechs/BattleCobraCS_D-CO.png deleted file mode 100644 index ddb61c65a38..00000000000 Binary files a/megamek/data/images/units/mechs/BattleCobraCS_D-CO.png and /dev/null differ diff --git a/megamek/data/images/units/mechs/BattleCobraCS_D.png b/megamek/data/images/units/mechs/BattleCobraCS_D.png index 87f24c3229f..d5e6bde88b0 100644 Binary files a/megamek/data/images/units/mechs/BattleCobraCS_D.png and b/megamek/data/images/units/mechs/BattleCobraCS_D.png differ diff --git a/megamek/data/images/units/mechs/BattleCobraCS_F-CO.png b/megamek/data/images/units/mechs/BattleCobraCS_F-CO.png deleted file mode 100644 index 85bcdc783b4..00000000000 Binary files a/megamek/data/images/units/mechs/BattleCobraCS_F-CO.png and /dev/null differ diff --git a/megamek/data/images/units/mechs/BattleCobraCS_F.png b/megamek/data/images/units/mechs/BattleCobraCS_F.png index bcd88bc5948..fe012db2f5c 100644 Binary files a/megamek/data/images/units/mechs/BattleCobraCS_F.png and b/megamek/data/images/units/mechs/BattleCobraCS_F.png differ diff --git a/megamek/data/images/units/mechs/BattleCobraCS_G.png b/megamek/data/images/units/mechs/BattleCobraCS_G.png new file mode 100644 index 00000000000..76f7dcf44aa Binary files /dev/null and b/megamek/data/images/units/mechs/BattleCobraCS_G.png differ diff --git a/megamek/data/images/units/mechs/BattleCobraCS_H.png b/megamek/data/images/units/mechs/BattleCobraCS_H.png new file mode 100644 index 00000000000..5f94f14d492 Binary files /dev/null and b/megamek/data/images/units/mechs/BattleCobraCS_H.png differ diff --git a/megamek/data/images/units/mechs/BattleCobraCS_I.png b/megamek/data/images/units/mechs/BattleCobraCS_I.png new file mode 100644 index 00000000000..d4b3441f72f Binary files /dev/null and b/megamek/data/images/units/mechs/BattleCobraCS_I.png differ diff --git a/megamek/data/images/units/mechs/BattleCobraCS_J.png b/megamek/data/images/units/mechs/BattleCobraCS_J.png new file mode 100644 index 00000000000..a88820825ac Binary files /dev/null and b/megamek/data/images/units/mechs/BattleCobraCS_J.png differ diff --git a/megamek/data/images/units/mechs/BattleCobra_A-CO.png b/megamek/data/images/units/mechs/BattleCobra_A-CO.png deleted file mode 100644 index 828394b36f2..00000000000 Binary files a/megamek/data/images/units/mechs/BattleCobra_A-CO.png and /dev/null differ diff --git a/megamek/data/images/units/mechs/BattleCobra_A.png b/megamek/data/images/units/mechs/BattleCobra_A.png index 957063dfc6b..9c03673caa8 100644 Binary files a/megamek/data/images/units/mechs/BattleCobra_A.png and b/megamek/data/images/units/mechs/BattleCobra_A.png differ diff --git a/megamek/data/images/units/mechs/BattleCobra_B-CO.png b/megamek/data/images/units/mechs/BattleCobra_B-CO.png deleted file mode 100644 index 88dd2a80bed..00000000000 Binary files a/megamek/data/images/units/mechs/BattleCobra_B-CO.png and /dev/null differ diff --git a/megamek/data/images/units/mechs/BattleCobra_B.png b/megamek/data/images/units/mechs/BattleCobra_B.png index 07358db2126..03cca733f82 100644 Binary files a/megamek/data/images/units/mechs/BattleCobra_B.png and b/megamek/data/images/units/mechs/BattleCobra_B.png differ diff --git a/megamek/data/images/units/mechs/BattleCobra_C-CO.png b/megamek/data/images/units/mechs/BattleCobra_C-CO.png deleted file mode 100644 index c76d877bc97..00000000000 Binary files a/megamek/data/images/units/mechs/BattleCobra_C-CO.png and /dev/null differ diff --git a/megamek/data/images/units/mechs/BattleCobra_C.png b/megamek/data/images/units/mechs/BattleCobra_C.png index 80d8dc20dc0..684cd6d6489 100644 Binary files a/megamek/data/images/units/mechs/BattleCobra_C.png and b/megamek/data/images/units/mechs/BattleCobra_C.png differ diff --git a/megamek/data/images/units/mechs/BattleCobra_F-CO.png b/megamek/data/images/units/mechs/BattleCobra_F-CO.png deleted file mode 100644 index 633d5de0385..00000000000 Binary files a/megamek/data/images/units/mechs/BattleCobra_F-CO.png and /dev/null differ diff --git a/megamek/data/images/units/mechs/BattleCobra_F.png b/megamek/data/images/units/mechs/BattleCobra_F.png index 0f6c8f4903d..4bb71cd2236 100644 Binary files a/megamek/data/images/units/mechs/BattleCobra_F.png and b/megamek/data/images/units/mechs/BattleCobra_F.png differ diff --git a/megamek/data/images/units/mechs/BattleCobra_G-CO.png b/megamek/data/images/units/mechs/BattleCobra_G-CO.png deleted file mode 100644 index 2dbf752b9d3..00000000000 Binary files a/megamek/data/images/units/mechs/BattleCobra_G-CO.png and /dev/null differ diff --git a/megamek/data/images/units/mechs/BattleCobra_G.png b/megamek/data/images/units/mechs/BattleCobra_G.png index 2dbf752b9d3..bfbe1336813 100644 Binary files a/megamek/data/images/units/mechs/BattleCobra_G.png and b/megamek/data/images/units/mechs/BattleCobra_G.png differ diff --git a/megamek/data/images/units/mechs/BattleCobra_I-CO.png b/megamek/data/images/units/mechs/BattleCobra_I-CO.png deleted file mode 100644 index be99c2344b7..00000000000 Binary files a/megamek/data/images/units/mechs/BattleCobra_I-CO.png and /dev/null differ diff --git a/megamek/data/images/units/mechs/BattleCobra_I.png b/megamek/data/images/units/mechs/BattleCobra_I.png index 684dd6bb732..2471244a217 100644 Binary files a/megamek/data/images/units/mechs/BattleCobra_I.png and b/megamek/data/images/units/mechs/BattleCobra_I.png differ diff --git a/megamek/data/images/units/mechs/BattleCobra_J-CO.png b/megamek/data/images/units/mechs/BattleCobra_J-CO.png deleted file mode 100644 index 0e3babcc52c..00000000000 Binary files a/megamek/data/images/units/mechs/BattleCobra_J-CO.png and /dev/null differ diff --git a/megamek/data/images/units/mechs/BattleCobra_J.png b/megamek/data/images/units/mechs/BattleCobra_J.png index 8e1654ce7ad..f8cc1022710 100644 Binary files a/megamek/data/images/units/mechs/BattleCobra_J.png and b/megamek/data/images/units/mechs/BattleCobra_J.png differ diff --git a/megamek/data/images/units/mechs/BattleCobra_X-CO.png b/megamek/data/images/units/mechs/BattleCobra_X-CO.png deleted file mode 100644 index 2450adb1eca..00000000000 Binary files a/megamek/data/images/units/mechs/BattleCobra_X-CO.png and /dev/null differ diff --git a/megamek/data/images/units/mechs/BattleCobra_X.png b/megamek/data/images/units/mechs/BattleCobra_X.png index 17f7964411d..c01add9fb74 100644 Binary files a/megamek/data/images/units/mechs/BattleCobra_X.png and b/megamek/data/images/units/mechs/BattleCobra_X.png differ diff --git a/megamek/data/images/units/mechs/Caesar.png b/megamek/data/images/units/mechs/Caesar.png index f0574206e76..ab2524b8212 100644 Binary files a/megamek/data/images/units/mechs/Caesar.png and b/megamek/data/images/units/mechs/Caesar.png differ diff --git a/megamek/data/images/units/mechs/Caesar_3S.png b/megamek/data/images/units/mechs/Caesar_3S.png index 5cb1c7741fd..a994facaf1f 100644 Binary files a/megamek/data/images/units/mechs/Caesar_3S.png and b/megamek/data/images/units/mechs/Caesar_3S.png differ diff --git a/megamek/data/images/units/mechs/Caesar_4R.png b/megamek/data/images/units/mechs/Caesar_4R.png index fb5a72c2aba..32e281f4479 100644 Binary files a/megamek/data/images/units/mechs/Caesar_4R.png and b/megamek/data/images/units/mechs/Caesar_4R.png differ diff --git a/megamek/data/images/units/mechs/Caesar_4S.png b/megamek/data/images/units/mechs/Caesar_4S.png index 4ef658f3931..125f43506fb 100644 Binary files a/megamek/data/images/units/mechs/Caesar_4S.png and b/megamek/data/images/units/mechs/Caesar_4S.png differ diff --git a/megamek/data/images/units/mechs/Caesar_5D.png b/megamek/data/images/units/mechs/Caesar_5D.png index 0cd61c60bb7..4484079d47e 100644 Binary files a/megamek/data/images/units/mechs/Caesar_5D.png and b/megamek/data/images/units/mechs/Caesar_5D.png differ diff --git a/megamek/data/images/units/mechs/Caesar_Gertrude.png b/megamek/data/images/units/mechs/Caesar_Gertrude.png index 23e4c7c75a9..ff5c5411884 100644 Binary files a/megamek/data/images/units/mechs/Caesar_Gertrude.png and b/megamek/data/images/units/mechs/Caesar_Gertrude.png differ diff --git a/megamek/data/images/units/mechs/Cicada CDA-2B.png b/megamek/data/images/units/mechs/Cicada CDA-2B.png deleted file mode 100644 index f816eb01911..00000000000 Binary files a/megamek/data/images/units/mechs/Cicada CDA-2B.png and /dev/null differ diff --git a/megamek/data/images/units/mechs/Cicada CDA-3C.png b/megamek/data/images/units/mechs/Cicada CDA-3C.png deleted file mode 100644 index 385d25763e6..00000000000 Binary files a/megamek/data/images/units/mechs/Cicada CDA-3C.png and /dev/null differ diff --git a/megamek/data/images/units/mechs/Cicada CDA-3F.png b/megamek/data/images/units/mechs/Cicada CDA-3F.png deleted file mode 100644 index 7a5c16aa76c..00000000000 Binary files a/megamek/data/images/units/mechs/Cicada CDA-3F.png and /dev/null differ diff --git a/megamek/data/images/units/mechs/Cicada CDA-3G.png b/megamek/data/images/units/mechs/Cicada CDA-3G.png deleted file mode 100644 index a3fb9db8723..00000000000 Binary files a/megamek/data/images/units/mechs/Cicada CDA-3G.png and /dev/null differ diff --git a/megamek/data/images/units/mechs/Cicada CDA-3M.png b/megamek/data/images/units/mechs/Cicada CDA-3M.png deleted file mode 100644 index 6d1f5d33e1c..00000000000 Binary files a/megamek/data/images/units/mechs/Cicada CDA-3M.png and /dev/null differ diff --git a/megamek/data/images/units/mechs/Cicada CDA-3MA.png b/megamek/data/images/units/mechs/Cicada CDA-3MA.png deleted file mode 100644 index a06b996a033..00000000000 Binary files a/megamek/data/images/units/mechs/Cicada CDA-3MA.png and /dev/null differ diff --git a/megamek/data/images/units/mechs/Cicada CDA-3P.png b/megamek/data/images/units/mechs/Cicada CDA-3P.png deleted file mode 100644 index 13a356919ae..00000000000 Binary files a/megamek/data/images/units/mechs/Cicada CDA-3P.png and /dev/null differ diff --git a/megamek/data/images/units/mechs/Cicada.png b/megamek/data/images/units/mechs/Cicada.png index 9f858a64cda..c51ac706eaa 100644 Binary files a/megamek/data/images/units/mechs/Cicada.png and b/megamek/data/images/units/mechs/Cicada.png differ diff --git a/megamek/data/images/units/mechs/Cicada_3C.png b/megamek/data/images/units/mechs/Cicada_3C.png new file mode 100644 index 00000000000..746eee274b9 Binary files /dev/null and b/megamek/data/images/units/mechs/Cicada_3C.png differ diff --git a/megamek/data/images/units/mechs/Cicada_3F.png b/megamek/data/images/units/mechs/Cicada_3F.png new file mode 100644 index 00000000000..95b3d7378d9 Binary files /dev/null and b/megamek/data/images/units/mechs/Cicada_3F.png differ diff --git a/megamek/data/images/units/mechs/Cicada_3G.png b/megamek/data/images/units/mechs/Cicada_3G.png new file mode 100644 index 00000000000..67baea539b6 Binary files /dev/null and b/megamek/data/images/units/mechs/Cicada_3G.png differ diff --git a/megamek/data/images/units/mechs/Cicada_3M.png b/megamek/data/images/units/mechs/Cicada_3M.png new file mode 100644 index 00000000000..81bfa0daf14 Binary files /dev/null and b/megamek/data/images/units/mechs/Cicada_3M.png differ diff --git a/megamek/data/images/units/mechs/Cicada_3MA.png b/megamek/data/images/units/mechs/Cicada_3MA.png new file mode 100644 index 00000000000..ef96d0fe22e Binary files /dev/null and b/megamek/data/images/units/mechs/Cicada_3MA.png differ diff --git a/megamek/data/images/units/mechs/Cicada_3P.png b/megamek/data/images/units/mechs/Cicada_3P.png new file mode 100644 index 00000000000..9855c12fd61 Binary files /dev/null and b/megamek/data/images/units/mechs/Cicada_3P.png differ diff --git a/megamek/data/images/units/mechs/Devastator.png b/megamek/data/images/units/mechs/Devastator.png index 76b9e87329f..835bff55079 100644 Binary files a/megamek/data/images/units/mechs/Devastator.png and b/megamek/data/images/units/mechs/Devastator.png differ diff --git a/megamek/data/images/units/mechs/Devastator_10.png b/megamek/data/images/units/mechs/Devastator_10.png index 9fdad74108a..b815b789e7f 100644 Binary files a/megamek/data/images/units/mechs/Devastator_10.png and b/megamek/data/images/units/mechs/Devastator_10.png differ diff --git a/megamek/data/images/units/mechs/Devastator_1D.png b/megamek/data/images/units/mechs/Devastator_1D.png index ccae70a891b..f225345c7c5 100644 Binary files a/megamek/data/images/units/mechs/Devastator_1D.png and b/megamek/data/images/units/mechs/Devastator_1D.png differ diff --git a/megamek/data/images/units/mechs/Devastator_2EC.png b/megamek/data/images/units/mechs/Devastator_2EC.png index 2008419f287..eafdcd81ad0 100644 Binary files a/megamek/data/images/units/mechs/Devastator_2EC.png and b/megamek/data/images/units/mechs/Devastator_2EC.png differ diff --git a/megamek/data/images/units/mechs/Devastator_3.png b/megamek/data/images/units/mechs/Devastator_3.png index 61b94038f8d..3e607da0402 100644 Binary files a/megamek/data/images/units/mechs/Devastator_3.png and b/megamek/data/images/units/mechs/Devastator_3.png differ diff --git a/megamek/data/images/units/mechs/Devastator_X10.png b/megamek/data/images/units/mechs/Devastator_X10.png index 116a239247c..990659ffabe 100644 Binary files a/megamek/data/images/units/mechs/Devastator_X10.png and b/megamek/data/images/units/mechs/Devastator_X10.png differ diff --git a/megamek/data/images/units/mechs/Firestarter FS9-A.png b/megamek/data/images/units/mechs/Firestarter FS9-A.png deleted file mode 100644 index 725e4fff9ec..00000000000 Binary files a/megamek/data/images/units/mechs/Firestarter FS9-A.png and /dev/null differ diff --git a/megamek/data/images/units/mechs/Firestarter FS9-B.png b/megamek/data/images/units/mechs/Firestarter FS9-B.png deleted file mode 100644 index c1ae7cf4030..00000000000 Binary files a/megamek/data/images/units/mechs/Firestarter FS9-B.png and /dev/null differ diff --git a/megamek/data/images/units/mechs/Firestarter FS9-C.png b/megamek/data/images/units/mechs/Firestarter FS9-C.png deleted file mode 100644 index 73b3d9243bf..00000000000 Binary files a/megamek/data/images/units/mechs/Firestarter FS9-C.png and /dev/null differ diff --git a/megamek/data/images/units/mechs/Firestarter FS9-K.png b/megamek/data/images/units/mechs/Firestarter FS9-K.png deleted file mode 100644 index 4e40137eb08..00000000000 Binary files a/megamek/data/images/units/mechs/Firestarter FS9-K.png and /dev/null differ diff --git a/megamek/data/images/units/mechs/Firestarter FS9-M.png b/megamek/data/images/units/mechs/Firestarter FS9-M.png deleted file mode 100644 index 6bc51ae3bf9..00000000000 Binary files a/megamek/data/images/units/mechs/Firestarter FS9-M.png and /dev/null differ diff --git a/megamek/data/images/units/mechs/Firestarter FS9-M2.png b/megamek/data/images/units/mechs/Firestarter FS9-M2.png deleted file mode 100644 index 039e1d15ec2..00000000000 Binary files a/megamek/data/images/units/mechs/Firestarter FS9-M2.png and /dev/null differ diff --git a/megamek/data/images/units/mechs/Firestarter FS9-M3.png b/megamek/data/images/units/mechs/Firestarter FS9-M3.png deleted file mode 100644 index 169acfd6d24..00000000000 Binary files a/megamek/data/images/units/mechs/Firestarter FS9-M3.png and /dev/null differ diff --git a/megamek/data/images/units/mechs/Firestarter FS9-M4.png b/megamek/data/images/units/mechs/Firestarter FS9-M4.png deleted file mode 100644 index 8e377431c9a..00000000000 Binary files a/megamek/data/images/units/mechs/Firestarter FS9-M4.png and /dev/null differ diff --git a/megamek/data/images/units/mechs/Firestarter FS9-P.png b/megamek/data/images/units/mechs/Firestarter FS9-P.png deleted file mode 100644 index 47fdf8fed8a..00000000000 Binary files a/megamek/data/images/units/mechs/Firestarter FS9-P.png and /dev/null differ diff --git a/megamek/data/images/units/mechs/Firestarter FS9-S.png b/megamek/data/images/units/mechs/Firestarter FS9-S.png deleted file mode 100644 index 726727122b7..00000000000 Binary files a/megamek/data/images/units/mechs/Firestarter FS9-S.png and /dev/null differ diff --git a/megamek/data/images/units/mechs/Firestarter.png b/megamek/data/images/units/mechs/Firestarter.png index 4a55c67e6e7..eb100fef880 100644 Binary files a/megamek/data/images/units/mechs/Firestarter.png and b/megamek/data/images/units/mechs/Firestarter.png differ diff --git a/megamek/data/images/units/mechs/Firestarter_81X.png b/megamek/data/images/units/mechs/Firestarter_81X.png new file mode 100644 index 00000000000..8bbca262915 Binary files /dev/null and b/megamek/data/images/units/mechs/Firestarter_81X.png differ diff --git a/megamek/data/images/units/mechs/Firestarter_A.png b/megamek/data/images/units/mechs/Firestarter_A.png new file mode 100644 index 00000000000..ac6c4955226 Binary files /dev/null and b/megamek/data/images/units/mechs/Firestarter_A.png differ diff --git a/megamek/data/images/units/mechs/Firestarter_B.png b/megamek/data/images/units/mechs/Firestarter_B.png new file mode 100644 index 00000000000..86673b4e5c3 Binary files /dev/null and b/megamek/data/images/units/mechs/Firestarter_B.png differ diff --git a/megamek/data/images/units/mechs/Firestarter_C.png b/megamek/data/images/units/mechs/Firestarter_C.png new file mode 100644 index 00000000000..e2086ca026e Binary files /dev/null and b/megamek/data/images/units/mechs/Firestarter_C.png differ diff --git a/megamek/data/images/units/mechs/Firestarter_K.png b/megamek/data/images/units/mechs/Firestarter_K.png new file mode 100644 index 00000000000..2c6c4675487 Binary files /dev/null and b/megamek/data/images/units/mechs/Firestarter_K.png differ diff --git a/megamek/data/images/units/mechs/Firestarter_M.png b/megamek/data/images/units/mechs/Firestarter_M.png new file mode 100644 index 00000000000..fcd21dff701 Binary files /dev/null and b/megamek/data/images/units/mechs/Firestarter_M.png differ diff --git a/megamek/data/images/units/mechs/Firestarter_M2.png b/megamek/data/images/units/mechs/Firestarter_M2.png new file mode 100644 index 00000000000..16b6c144bd5 Binary files /dev/null and b/megamek/data/images/units/mechs/Firestarter_M2.png differ diff --git a/megamek/data/images/units/mechs/Firestarter_M3.png b/megamek/data/images/units/mechs/Firestarter_M3.png new file mode 100644 index 00000000000..3b4de093efd Binary files /dev/null and b/megamek/data/images/units/mechs/Firestarter_M3.png differ diff --git a/megamek/data/images/units/mechs/Firestarter_M4.png b/megamek/data/images/units/mechs/Firestarter_M4.png new file mode 100644 index 00000000000..1afebce046e Binary files /dev/null and b/megamek/data/images/units/mechs/Firestarter_M4.png differ diff --git a/megamek/data/images/units/mechs/Firestarter_P.png b/megamek/data/images/units/mechs/Firestarter_P.png new file mode 100644 index 00000000000..ba19094098c Binary files /dev/null and b/megamek/data/images/units/mechs/Firestarter_P.png differ diff --git a/megamek/data/images/units/mechs/Firestarter_S.png b/megamek/data/images/units/mechs/Firestarter_S.png new file mode 100644 index 00000000000..edc5a0930de Binary files /dev/null and b/megamek/data/images/units/mechs/Firestarter_S.png differ diff --git a/megamek/data/images/units/mechs/Flea 'Fire Ant'.png b/megamek/data/images/units/mechs/Flea 'Fire Ant'.png deleted file mode 100644 index 99be170c63b..00000000000 Binary files a/megamek/data/images/units/mechs/Flea 'Fire Ant'.png and /dev/null differ diff --git a/megamek/data/images/units/mechs/Flea FLE-14.png b/megamek/data/images/units/mechs/Flea FLE-14.png deleted file mode 100644 index 9b8d8db72f4..00000000000 Binary files a/megamek/data/images/units/mechs/Flea FLE-14.png and /dev/null differ diff --git a/megamek/data/images/units/mechs/Flea FLE-15.png b/megamek/data/images/units/mechs/Flea FLE-15.png deleted file mode 100644 index feaee9b0c36..00000000000 Binary files a/megamek/data/images/units/mechs/Flea FLE-15.png and /dev/null differ diff --git a/megamek/data/images/units/mechs/Flea FLE-16.png b/megamek/data/images/units/mechs/Flea FLE-16.png deleted file mode 100644 index 20429959820..00000000000 Binary files a/megamek/data/images/units/mechs/Flea FLE-16.png and /dev/null differ diff --git a/megamek/data/images/units/mechs/Flea FLE-19.png b/megamek/data/images/units/mechs/Flea FLE-19.png deleted file mode 100644 index 3c1370df916..00000000000 Binary files a/megamek/data/images/units/mechs/Flea FLE-19.png and /dev/null differ diff --git a/megamek/data/images/units/mechs/Flea FLE-20.png b/megamek/data/images/units/mechs/Flea FLE-20.png deleted file mode 100644 index 1072d5b5de5..00000000000 Binary files a/megamek/data/images/units/mechs/Flea FLE-20.png and /dev/null differ diff --git a/megamek/data/images/units/mechs/Flea.png b/megamek/data/images/units/mechs/Flea.png index ea11a43ca48..e52965c501c 100644 Binary files a/megamek/data/images/units/mechs/Flea.png and b/megamek/data/images/units/mechs/Flea.png differ diff --git a/megamek/data/images/units/mechs/Flea_14.png b/megamek/data/images/units/mechs/Flea_14.png new file mode 100644 index 00000000000..0f5707d8a84 Binary files /dev/null and b/megamek/data/images/units/mechs/Flea_14.png differ diff --git a/megamek/data/images/units/mechs/Flea_15.png b/megamek/data/images/units/mechs/Flea_15.png new file mode 100644 index 00000000000..410443441de Binary files /dev/null and b/megamek/data/images/units/mechs/Flea_15.png differ diff --git a/megamek/data/images/units/mechs/Flea_19.png b/megamek/data/images/units/mechs/Flea_19.png new file mode 100644 index 00000000000..38a0ca8fe86 Binary files /dev/null and b/megamek/data/images/units/mechs/Flea_19.png differ diff --git a/megamek/data/images/units/mechs/Flea_20.png b/megamek/data/images/units/mechs/Flea_20.png new file mode 100644 index 00000000000..b62a46a96bc Binary files /dev/null and b/megamek/data/images/units/mechs/Flea_20.png differ diff --git a/megamek/data/images/units/mechs/Flea_4.png b/megamek/data/images/units/mechs/Flea_4.png new file mode 100644 index 00000000000..2075f5c72cd Binary files /dev/null and b/megamek/data/images/units/mechs/Flea_4.png differ diff --git a/megamek/data/images/units/mechs/Flea_FA.png b/megamek/data/images/units/mechs/Flea_FA.png new file mode 100644 index 00000000000..63700e5b175 Binary files /dev/null and b/megamek/data/images/units/mechs/Flea_FA.png differ diff --git a/megamek/data/images/units/mechs/Gunslinger.png b/megamek/data/images/units/mechs/Gunslinger.png index 6af027ccb78..0237b5514cc 100644 Binary files a/megamek/data/images/units/mechs/Gunslinger.png and b/megamek/data/images/units/mechs/Gunslinger.png differ diff --git a/megamek/data/images/units/mechs/Gunslinger_2ERD.png b/megamek/data/images/units/mechs/Gunslinger_2ERD.png new file mode 100644 index 00000000000..5c3482f8134 Binary files /dev/null and b/megamek/data/images/units/mechs/Gunslinger_2ERD.png differ diff --git a/megamek/data/images/units/mechs/Gunslinger_Jared.png b/megamek/data/images/units/mechs/Gunslinger_Jared.png new file mode 100644 index 00000000000..add9c189ad6 Binary files /dev/null and b/megamek/data/images/units/mechs/Gunslinger_Jared.png differ diff --git a/megamek/data/images/units/mechs/Hermes II HER-2M 'Mercury'.png b/megamek/data/images/units/mechs/Hermes II HER-2M 'Mercury'.png deleted file mode 100644 index 93ba93ae31f..00000000000 Binary files a/megamek/data/images/units/mechs/Hermes II HER-2M 'Mercury'.png and /dev/null differ diff --git a/megamek/data/images/units/mechs/Hermes II HER-4K 'Hermes III'.png b/megamek/data/images/units/mechs/Hermes II HER-4K 'Hermes III'.png deleted file mode 100644 index c705e321550..00000000000 Binary files a/megamek/data/images/units/mechs/Hermes II HER-4K 'Hermes III'.png and /dev/null differ diff --git a/megamek/data/images/units/mechs/Hermes II HER-5C.png b/megamek/data/images/units/mechs/Hermes II HER-5C.png deleted file mode 100644 index 1f7798f0023..00000000000 Binary files a/megamek/data/images/units/mechs/Hermes II HER-5C.png and /dev/null differ diff --git a/megamek/data/images/units/mechs/Hermes II HER-5ME 'Mercury Elite'.png b/megamek/data/images/units/mechs/Hermes II HER-5ME 'Mercury Elite'.png deleted file mode 100644 index 33c6f985120..00000000000 Binary files a/megamek/data/images/units/mechs/Hermes II HER-5ME 'Mercury Elite'.png and /dev/null differ diff --git a/megamek/data/images/units/mechs/Hermes II HER-5SA.png b/megamek/data/images/units/mechs/Hermes II HER-5SA.png deleted file mode 100644 index 2e92d754afe..00000000000 Binary files a/megamek/data/images/units/mechs/Hermes II HER-5SA.png and /dev/null differ diff --git a/megamek/data/images/units/mechs/Hermes II HER-5Sr.png b/megamek/data/images/units/mechs/Hermes II HER-5Sr.png deleted file mode 100644 index bbef0456796..00000000000 Binary files a/megamek/data/images/units/mechs/Hermes II HER-5Sr.png and /dev/null differ diff --git a/megamek/data/images/units/mechs/Hermes II HER-6D.png b/megamek/data/images/units/mechs/Hermes II HER-6D.png deleted file mode 100644 index a19764aa934..00000000000 Binary files a/megamek/data/images/units/mechs/Hermes II HER-6D.png and /dev/null differ diff --git a/megamek/data/images/units/mechs/Hermes II.png b/megamek/data/images/units/mechs/Hermes II.png deleted file mode 100644 index 57e0e44447a..00000000000 Binary files a/megamek/data/images/units/mechs/Hermes II.png and /dev/null differ diff --git a/megamek/data/images/units/mechs/HermesII.png b/megamek/data/images/units/mechs/HermesII.png new file mode 100644 index 00000000000..23d7fdf7c40 Binary files /dev/null and b/megamek/data/images/units/mechs/HermesII.png differ diff --git a/megamek/data/images/units/mechs/HermesII_2M.png b/megamek/data/images/units/mechs/HermesII_2M.png new file mode 100644 index 00000000000..f356d2c125c Binary files /dev/null and b/megamek/data/images/units/mechs/HermesII_2M.png differ diff --git a/megamek/data/images/units/mechs/HermesII_4K.png b/megamek/data/images/units/mechs/HermesII_4K.png new file mode 100644 index 00000000000..57a4069438f Binary files /dev/null and b/megamek/data/images/units/mechs/HermesII_4K.png differ diff --git a/megamek/data/images/units/mechs/HermesII_5C.png b/megamek/data/images/units/mechs/HermesII_5C.png new file mode 100644 index 00000000000..a5ab08c7049 Binary files /dev/null and b/megamek/data/images/units/mechs/HermesII_5C.png differ diff --git a/megamek/data/images/units/mechs/HermesII_5ME.png b/megamek/data/images/units/mechs/HermesII_5ME.png new file mode 100644 index 00000000000..9c8d2828e82 Binary files /dev/null and b/megamek/data/images/units/mechs/HermesII_5ME.png differ diff --git a/megamek/data/images/units/mechs/HermesII_5SA.png b/megamek/data/images/units/mechs/HermesII_5SA.png new file mode 100644 index 00000000000..b1670281744 Binary files /dev/null and b/megamek/data/images/units/mechs/HermesII_5SA.png differ diff --git a/megamek/data/images/units/mechs/HermesII_5SR.png b/megamek/data/images/units/mechs/HermesII_5SR.png new file mode 100644 index 00000000000..3934c8bf3a4 Binary files /dev/null and b/megamek/data/images/units/mechs/HermesII_5SR.png differ diff --git a/megamek/data/images/units/mechs/HermesII_6D.png b/megamek/data/images/units/mechs/HermesII_6D.png new file mode 100644 index 00000000000..d555c8eaf3b Binary files /dev/null and b/megamek/data/images/units/mechs/HermesII_6D.png differ diff --git a/megamek/data/images/units/mechs/HermesII_7S.png b/megamek/data/images/units/mechs/HermesII_7S.png new file mode 100644 index 00000000000..322b4352df8 Binary files /dev/null and b/megamek/data/images/units/mechs/HermesII_7S.png differ diff --git a/megamek/data/images/units/mechs/Merlin.png b/megamek/data/images/units/mechs/Merlin.png index 1bac9d09b71..f5f8b34e337 100644 Binary files a/megamek/data/images/units/mechs/Merlin.png and b/megamek/data/images/units/mechs/Merlin.png differ diff --git a/megamek/data/images/units/mechs/Merlin_1B.png b/megamek/data/images/units/mechs/Merlin_1B.png index aa1444dd9ba..b72d3f5b515 100644 Binary files a/megamek/data/images/units/mechs/Merlin_1B.png and b/megamek/data/images/units/mechs/Merlin_1B.png differ diff --git a/megamek/data/images/units/mechs/Merlin_SX.png b/megamek/data/images/units/mechs/Merlin_SX.png index 9b1dc16e3ff..08500eb946f 100644 Binary files a/megamek/data/images/units/mechs/Merlin_SX.png and b/megamek/data/images/units/mechs/Merlin_SX.png differ diff --git a/megamek/data/images/units/mechs/Naga.png b/megamek/data/images/units/mechs/Naga.png index 182b338419e..74e0787e6c1 100644 Binary files a/megamek/data/images/units/mechs/Naga.png and b/megamek/data/images/units/mechs/Naga.png differ diff --git a/megamek/data/images/units/mechs/NagaII.png b/megamek/data/images/units/mechs/NagaII.png new file mode 100644 index 00000000000..cb1385ff200 Binary files /dev/null and b/megamek/data/images/units/mechs/NagaII.png differ diff --git a/megamek/data/images/units/mechs/NagaII_A.png b/megamek/data/images/units/mechs/NagaII_A.png new file mode 100644 index 00000000000..92a7185c082 Binary files /dev/null and b/megamek/data/images/units/mechs/NagaII_A.png differ diff --git a/megamek/data/images/units/mechs/NagaII_B.png b/megamek/data/images/units/mechs/NagaII_B.png new file mode 100644 index 00000000000..2272a2ab00b Binary files /dev/null and b/megamek/data/images/units/mechs/NagaII_B.png differ diff --git a/megamek/data/images/units/mechs/NagaII_C.png b/megamek/data/images/units/mechs/NagaII_C.png new file mode 100644 index 00000000000..21461c8d77b Binary files /dev/null and b/megamek/data/images/units/mechs/NagaII_C.png differ diff --git a/megamek/data/images/units/mechs/NagaII_H.png b/megamek/data/images/units/mechs/NagaII_H.png new file mode 100644 index 00000000000..a45459dab49 Binary files /dev/null and b/megamek/data/images/units/mechs/NagaII_H.png differ diff --git a/megamek/data/images/units/mechs/NagaII_W.png b/megamek/data/images/units/mechs/NagaII_W.png new file mode 100644 index 00000000000..5cf206d83a5 Binary files /dev/null and b/megamek/data/images/units/mechs/NagaII_W.png differ diff --git a/megamek/data/images/units/mechs/Naga_C.png b/megamek/data/images/units/mechs/Naga_C.png new file mode 100644 index 00000000000..fbe543096b6 Binary files /dev/null and b/megamek/data/images/units/mechs/Naga_C.png differ diff --git a/megamek/data/images/units/mechs/Nightsky NGS-4T.png b/megamek/data/images/units/mechs/Nightsky NGS-4T.png deleted file mode 100644 index c73ee6dece8..00000000000 Binary files a/megamek/data/images/units/mechs/Nightsky NGS-4T.png and /dev/null differ diff --git a/megamek/data/images/units/mechs/Nightsky NGS-5S.png b/megamek/data/images/units/mechs/Nightsky NGS-5S.png deleted file mode 100644 index 1316bb6ab5d..00000000000 Binary files a/megamek/data/images/units/mechs/Nightsky NGS-5S.png and /dev/null differ diff --git a/megamek/data/images/units/mechs/Nightsky NGS-5T.png b/megamek/data/images/units/mechs/Nightsky NGS-5T.png deleted file mode 100644 index a1bc35ea5b0..00000000000 Binary files a/megamek/data/images/units/mechs/Nightsky NGS-5T.png and /dev/null differ diff --git a/megamek/data/images/units/mechs/Nightsky NGS-6S.png b/megamek/data/images/units/mechs/Nightsky NGS-6S.png deleted file mode 100644 index 51e535eeb76..00000000000 Binary files a/megamek/data/images/units/mechs/Nightsky NGS-6S.png and /dev/null differ diff --git a/megamek/data/images/units/mechs/Nightsky NGS-6T.png b/megamek/data/images/units/mechs/Nightsky NGS-6T.png deleted file mode 100644 index 4778363cbed..00000000000 Binary files a/megamek/data/images/units/mechs/Nightsky NGS-6T.png and /dev/null differ diff --git a/megamek/data/images/units/mechs/Nightsky.png b/megamek/data/images/units/mechs/Nightsky.png index 4edda7a7e0c..9c61c611f09 100644 Binary files a/megamek/data/images/units/mechs/Nightsky.png and b/megamek/data/images/units/mechs/Nightsky.png differ diff --git a/megamek/data/images/units/mechs/Nightsky_4T.png b/megamek/data/images/units/mechs/Nightsky_4T.png new file mode 100644 index 00000000000..415dbdd41d1 Binary files /dev/null and b/megamek/data/images/units/mechs/Nightsky_4T.png differ diff --git a/megamek/data/images/units/mechs/Nightsky_6S.png b/megamek/data/images/units/mechs/Nightsky_6S.png new file mode 100644 index 00000000000..3661f31d2c3 Binary files /dev/null and b/megamek/data/images/units/mechs/Nightsky_6S.png differ diff --git a/megamek/data/images/units/mechs/Nightsky_6T.png b/megamek/data/images/units/mechs/Nightsky_6T.png new file mode 100644 index 00000000000..53e39b24138 Binary files /dev/null and b/megamek/data/images/units/mechs/Nightsky_6T.png differ diff --git a/megamek/data/images/units/mechs/Penetrator.png b/megamek/data/images/units/mechs/Penetrator.png index e04ed413236..4a9cf584f1b 100644 Binary files a/megamek/data/images/units/mechs/Penetrator.png and b/megamek/data/images/units/mechs/Penetrator.png differ diff --git a/megamek/data/images/units/mechs/Penetrator_4F.png b/megamek/data/images/units/mechs/Penetrator_4F.png index c19e866d1c5..5e9323f1567 100644 Binary files a/megamek/data/images/units/mechs/Penetrator_4F.png and b/megamek/data/images/units/mechs/Penetrator_4F.png differ diff --git a/megamek/data/images/units/mechs/Penetrator_6M.png b/megamek/data/images/units/mechs/Penetrator_6M.png index 481124b37d8..82f9c77b959 100644 Binary files a/megamek/data/images/units/mechs/Penetrator_6M.png and b/megamek/data/images/units/mechs/Penetrator_6M.png differ diff --git a/megamek/data/images/units/mechs/Penetrator_7D.png b/megamek/data/images/units/mechs/Penetrator_7D.png index 187eb158941..5a500e3e25c 100644 Binary files a/megamek/data/images/units/mechs/Penetrator_7D.png and b/megamek/data/images/units/mechs/Penetrator_7D.png differ diff --git a/megamek/data/images/units/mechs/Phantom.png b/megamek/data/images/units/mechs/Phantom.png index 2a412af4d7b..62df416388f 100644 Binary files a/megamek/data/images/units/mechs/Phantom.png and b/megamek/data/images/units/mechs/Phantom.png differ diff --git a/megamek/data/images/units/mechs/Phantom_A.png b/megamek/data/images/units/mechs/Phantom_A.png index 5ecba167cae..70a3ad9dc83 100644 Binary files a/megamek/data/images/units/mechs/Phantom_A.png and b/megamek/data/images/units/mechs/Phantom_A.png differ diff --git a/megamek/data/images/units/mechs/Phantom_B.png b/megamek/data/images/units/mechs/Phantom_B.png index 17872ce4366..3a6996cdaf2 100644 Binary files a/megamek/data/images/units/mechs/Phantom_B.png and b/megamek/data/images/units/mechs/Phantom_B.png differ diff --git a/megamek/data/images/units/mechs/Phantom_C.png b/megamek/data/images/units/mechs/Phantom_C.png index 445a34d1dfe..62a50a89b2a 100644 Binary files a/megamek/data/images/units/mechs/Phantom_C.png and b/megamek/data/images/units/mechs/Phantom_C.png differ diff --git a/megamek/data/images/units/mechs/Phantom_D.png b/megamek/data/images/units/mechs/Phantom_D.png index 50db33ce400..4de514d562c 100644 Binary files a/megamek/data/images/units/mechs/Phantom_D.png and b/megamek/data/images/units/mechs/Phantom_D.png differ diff --git a/megamek/data/images/units/mechs/Phantom_E.png b/megamek/data/images/units/mechs/Phantom_E.png index 8a88ec11e86..4f575aea73b 100644 Binary files a/megamek/data/images/units/mechs/Phantom_E.png and b/megamek/data/images/units/mechs/Phantom_E.png differ diff --git a/megamek/data/images/units/mechs/Phantom_F.png b/megamek/data/images/units/mechs/Phantom_F.png index cb0fa0f465b..2154d5a1549 100644 Binary files a/megamek/data/images/units/mechs/Phantom_F.png and b/megamek/data/images/units/mechs/Phantom_F.png differ diff --git a/megamek/data/images/units/mechs/Phantom_G.png b/megamek/data/images/units/mechs/Phantom_G.png new file mode 100644 index 00000000000..eb436cba78c Binary files /dev/null and b/megamek/data/images/units/mechs/Phantom_G.png differ diff --git a/megamek/data/images/units/mechs/Phantom_H.png b/megamek/data/images/units/mechs/Phantom_H.png index b46cca7d970..c53a64d123c 100644 Binary files a/megamek/data/images/units/mechs/Phantom_H.png and b/megamek/data/images/units/mechs/Phantom_H.png differ diff --git a/megamek/data/images/units/mechs/Phantom_I.png b/megamek/data/images/units/mechs/Phantom_I.png new file mode 100644 index 00000000000..c82ebdaa141 Binary files /dev/null and b/megamek/data/images/units/mechs/Phantom_I.png differ diff --git a/megamek/data/images/units/mechs/Phantom_J.png b/megamek/data/images/units/mechs/Phantom_J.png new file mode 100644 index 00000000000..308c54bff53 Binary files /dev/null and b/megamek/data/images/units/mechs/Phantom_J.png differ diff --git a/megamek/data/images/units/mechs/Phantom_K.png b/megamek/data/images/units/mechs/Phantom_K.png new file mode 100644 index 00000000000..8494953d52a Binary files /dev/null and b/megamek/data/images/units/mechs/Phantom_K.png differ diff --git a/megamek/data/images/units/mechs/Phantom_L.png b/megamek/data/images/units/mechs/Phantom_L.png new file mode 100644 index 00000000000..1a180f9c13b Binary files /dev/null and b/megamek/data/images/units/mechs/Phantom_L.png differ diff --git a/megamek/data/images/units/mechs/Phantom_R.png b/megamek/data/images/units/mechs/Phantom_R.png new file mode 100644 index 00000000000..77aaabb6374 Binary files /dev/null and b/megamek/data/images/units/mechs/Phantom_R.png differ diff --git a/megamek/data/images/units/mechs/Quickdraw QKD-4H.png b/megamek/data/images/units/mechs/Quickdraw QKD-4H.png deleted file mode 100644 index 9abfb3e7164..00000000000 Binary files a/megamek/data/images/units/mechs/Quickdraw QKD-4H.png and /dev/null differ diff --git a/megamek/data/images/units/mechs/Quickdraw QKD-5A.png b/megamek/data/images/units/mechs/Quickdraw QKD-5A.png deleted file mode 100644 index 49600a3761b..00000000000 Binary files a/megamek/data/images/units/mechs/Quickdraw QKD-5A.png and /dev/null differ diff --git a/megamek/data/images/units/mechs/Quickdraw QKD-5K2.png b/megamek/data/images/units/mechs/Quickdraw QKD-5K2.png deleted file mode 100644 index ba4315a18cb..00000000000 Binary files a/megamek/data/images/units/mechs/Quickdraw QKD-5K2.png and /dev/null differ diff --git a/megamek/data/images/units/mechs/Quickdraw QKD-8K.png b/megamek/data/images/units/mechs/Quickdraw QKD-8K.png deleted file mode 100644 index 7b00a5c2ef3..00000000000 Binary files a/megamek/data/images/units/mechs/Quickdraw QKD-8K.png and /dev/null differ diff --git a/megamek/data/images/units/mechs/Quickdraw QKD-8P.png b/megamek/data/images/units/mechs/Quickdraw QKD-8P.png deleted file mode 100644 index e8032afa461..00000000000 Binary files a/megamek/data/images/units/mechs/Quickdraw QKD-8P.png and /dev/null differ diff --git a/megamek/data/images/units/mechs/Quickdraw QKD-9M.png b/megamek/data/images/units/mechs/Quickdraw QKD-9M.png deleted file mode 100644 index ab2ae75266e..00000000000 Binary files a/megamek/data/images/units/mechs/Quickdraw QKD-9M.png and /dev/null differ diff --git a/megamek/data/images/units/mechs/Quickdraw.png b/megamek/data/images/units/mechs/Quickdraw.png index 7aa0f9ec1d4..ffb5f676400 100644 Binary files a/megamek/data/images/units/mechs/Quickdraw.png and b/megamek/data/images/units/mechs/Quickdraw.png differ diff --git a/megamek/data/images/units/mechs/Quickdraw_4H.png b/megamek/data/images/units/mechs/Quickdraw_4H.png new file mode 100644 index 00000000000..b823c04930c Binary files /dev/null and b/megamek/data/images/units/mechs/Quickdraw_4H.png differ diff --git a/megamek/data/images/units/mechs/Quickdraw_5A.png b/megamek/data/images/units/mechs/Quickdraw_5A.png new file mode 100644 index 00000000000..06300dbc2b9 Binary files /dev/null and b/megamek/data/images/units/mechs/Quickdraw_5A.png differ diff --git a/megamek/data/images/units/mechs/Quickdraw_5K2.png b/megamek/data/images/units/mechs/Quickdraw_5K2.png new file mode 100644 index 00000000000..4f989afdde8 Binary files /dev/null and b/megamek/data/images/units/mechs/Quickdraw_5K2.png differ diff --git a/megamek/data/images/units/mechs/Quickdraw_8K.png b/megamek/data/images/units/mechs/Quickdraw_8K.png new file mode 100644 index 00000000000..e6e7644e998 Binary files /dev/null and b/megamek/data/images/units/mechs/Quickdraw_8K.png differ diff --git a/megamek/data/images/units/mechs/Quickdraw_8P.png b/megamek/data/images/units/mechs/Quickdraw_8P.png new file mode 100644 index 00000000000..c293b39dcf8 Binary files /dev/null and b/megamek/data/images/units/mechs/Quickdraw_8P.png differ diff --git a/megamek/data/images/units/mechs/Quickdraw_8X.png b/megamek/data/images/units/mechs/Quickdraw_8X.png new file mode 100644 index 00000000000..a6051d30d52 Binary files /dev/null and b/megamek/data/images/units/mechs/Quickdraw_8X.png differ diff --git a/megamek/data/images/units/mechs/Quickdraw_9M.png b/megamek/data/images/units/mechs/Quickdraw_9M.png new file mode 100644 index 00000000000..e5e6f0c41ef Binary files /dev/null and b/megamek/data/images/units/mechs/Quickdraw_9M.png differ diff --git a/megamek/data/images/units/mechs/Spector SPR-4F.png b/megamek/data/images/units/mechs/Spector SPR-4F.png deleted file mode 100644 index 5b32635f537..00000000000 Binary files a/megamek/data/images/units/mechs/Spector SPR-4F.png and /dev/null differ diff --git a/megamek/data/images/units/mechs/Spector SPR-5S.png b/megamek/data/images/units/mechs/Spector SPR-5S.png deleted file mode 100644 index 7d0202f3af1..00000000000 Binary files a/megamek/data/images/units/mechs/Spector SPR-5S.png and /dev/null differ diff --git a/megamek/data/images/units/mechs/Spector SPR-ST.png b/megamek/data/images/units/mechs/Spector SPR-ST.png deleted file mode 100644 index 9d21aace504..00000000000 Binary files a/megamek/data/images/units/mechs/Spector SPR-ST.png and /dev/null differ diff --git a/megamek/data/images/units/mechs/Spector.png b/megamek/data/images/units/mechs/Spector.png index ca6b0b66c6a..410e4ac6e61 100644 Binary files a/megamek/data/images/units/mechs/Spector.png and b/megamek/data/images/units/mechs/Spector.png differ diff --git a/megamek/data/images/units/mechs/Spector_4F.png b/megamek/data/images/units/mechs/Spector_4F.png new file mode 100644 index 00000000000..22c989ac3bb Binary files /dev/null and b/megamek/data/images/units/mechs/Spector_4F.png differ diff --git a/megamek/data/images/units/mechs/Spector_5S.png b/megamek/data/images/units/mechs/Spector_5S.png new file mode 100644 index 00000000000..20e7b31e3e6 Binary files /dev/null and b/megamek/data/images/units/mechs/Spector_5S.png differ diff --git a/megamek/data/images/units/mechs/Spector_ST.png b/megamek/data/images/units/mechs/Spector_ST.png new file mode 100644 index 00000000000..37f67cd1cc1 Binary files /dev/null and b/megamek/data/images/units/mechs/Spector_ST.png differ diff --git a/megamek/data/images/units/mechs/Starslayer.png b/megamek/data/images/units/mechs/Starslayer.png index 6e518d5607a..86b94a253f2 100644 Binary files a/megamek/data/images/units/mechs/Starslayer.png and b/megamek/data/images/units/mechs/Starslayer.png differ diff --git a/megamek/data/images/units/mechs/Starslayer_2CEC.png b/megamek/data/images/units/mechs/Starslayer_2CEC.png index e22704cc2bc..44ebdf365cf 100644 Binary files a/megamek/data/images/units/mechs/Starslayer_2CEC.png and b/megamek/data/images/units/mechs/Starslayer_2CEC.png differ diff --git a/megamek/data/images/units/mechs/Starslayer_3D.png b/megamek/data/images/units/mechs/Starslayer_3D.png index e3a68ec7e1d..ad6d4a80273 100644 Binary files a/megamek/data/images/units/mechs/Starslayer_3D.png and b/megamek/data/images/units/mechs/Starslayer_3D.png differ diff --git a/megamek/data/images/units/mechs/Starslayer_3DR.png b/megamek/data/images/units/mechs/Starslayer_3DR.png deleted file mode 100644 index 1d1f7db4bb0..00000000000 Binary files a/megamek/data/images/units/mechs/Starslayer_3DR.png and /dev/null differ diff --git a/megamek/data/images/units/mechs/Starslayer_3Dr.png b/megamek/data/images/units/mechs/Starslayer_3Dr.png new file mode 100644 index 00000000000..f666bc6d903 Binary files /dev/null and b/megamek/data/images/units/mechs/Starslayer_3Dr.png differ diff --git a/megamek/data/images/units/mechs/Trooper.png b/megamek/data/images/units/mechs/Trooper.png index d2c3f36322e..03d6a2e16f8 100644 Binary files a/megamek/data/images/units/mechs/Trooper.png and b/megamek/data/images/units/mechs/Trooper.png differ diff --git a/megamek/data/images/units/mechset.txt b/megamek/data/images/units/mechset.txt index e2c4e91ff61..ca861eb0f2d 100644 --- a/megamek/data/images/units/mechset.txt +++ b/megamek/data/images/units/mechset.txt @@ -1263,6 +1263,8 @@ exact "Thunderbird II Battle Armor (Standard)(Sqd6)" "battle armor/ThunderbirdII chassis "TinStar BattleArmor" "battle armor/Tinstar_4.png" exact "TinStar BattleArmor (Standard)(Sqd5)" "battle armor/Tinstar_5.png" exact "TinStar BattleArmor (Standard)(Sqd6)" "battle armor/Tinstar_6.png" +exact "TinStar BattleArmor (Original)(Sqd5)" "battle armor/Tinstar_5.png" +exact "TinStar BattleArmor (Original)(Sqd6)" "battle armor/Tinstar_6.png" #TornadoPAL chassis "Tornado PA(L)" "battle armor/TornadoPAL_6.png" exact "Tornado PA(L) G12(Sqd4)" "battle armor/TornadoPAL_4.png" @@ -1663,39 +1665,27 @@ exact "Barghest BGS-4T" "mechs/Barghest BGS-4T.png" exact "Barghest BGS-4X" "mechs/Barghest BGS-4T.png" exact "Barghest BGS-7S" "mechs/Barghest BGS-7S.png" #BATTLE_COBRA_CLAN -chassis "Battle Cobra" "mechs/BattleCobra-CO.png" -exact "Battle Cobra A" "mechs/BattleCobra_A-CO.png" -exact "Battle Cobra B" "mechs/BattleCobra_B-CO.png" -exact "Battle Cobra C" "mechs/BattleCobra_C-CO.png" -exact "Battle Cobra F" "mechs/BattleCobra_F-CO.png" -exact "Battle Cobra G" "mechs/BattleCobra_G-CO.png" -exact "Battle Cobra I" "mechs/BattleCobra_I-CO.png" -exact "Battle Cobra J" "mechs/BattleCobra_J-CO.png" -exact "Battle Cobra X" "mechs/BattleCobra_X-CO.png" -#chassis "Battle Cobra" "mechs/BattleCobra.png" -#exact "Battle Cobra A" "mechs/BattleCobra_A.png" -#exact "Battle Cobra B" "mechs/BattleCobra_B.png" -#exact "Battle Cobra C" "mechs/BattleCobra_C.png" -#exact "Battle Cobra F" "mechs/BattleCobra_F.png" -#exact "Battle Cobra G" "mechs/BattleCobra_G.png" -#exact "Battle Cobra I" "mechs/BattleCobra_I.png" -#exact "Battle Cobra J" "mechs/BattleCobra_J.png" -#exact "Battle Cobra X" "mechs/BattleCobra_X.png" +chassis "Battle Cobra" "mechs/BattleCobra.png" +exact "Battle Cobra A" "mechs/BattleCobra_A.png" +exact "Battle Cobra B" "mechs/BattleCobra_B.png" +exact "Battle Cobra C" "mechs/BattleCobra_C.png" +exact "Battle Cobra F" "mechs/BattleCobra_F.png" +exact "Battle Cobra G" "mechs/BattleCobra_G.png" +exact "Battle Cobra I" "mechs/BattleCobra_I.png" +exact "Battle Cobra J" "mechs/BattleCobra_J.png" +exact "Battle Cobra X" "mechs/BattleCobra_X.png" #BATTLE_COBRA_COMSTAR -exact "Battle Cobra BTL-C-2O" "mechs/BattleCobraCS-CO.png" -exact "Battle Cobra BTL-C-2OA" "mechs/BattleCobraCS_A-CO.png" -exact "Battle Cobra BTL-C-2OB" "mechs/BattleCobraCS_B-CO.png" -exact "Battle Cobra BTL-C-2OC" "mechs/BattleCobraCS_C-CO.png" -exact "Battle Cobra BTL-C-2OD" "mechs/BattleCobraCS_D-CO.png" -exact "Battle Cobra BTL-C-2OE" "mechs/BattleCobraCS_B-CO.png" -exact "Battle Cobra BTL-C-2OF" "mechs/BattleCobraCS_F-CO.png" -#exact "Battle Cobra BTL-C-2O" "mechs/BattleCobraCS.png" -#exact "Battle Cobra BTL-C-2OA" "mechs/BattleCobraCS_A.png" -#exact "Battle Cobra BTL-C-2OB" "mechs/BattleCobraCS_B.png" -#exact "Battle Cobra BTL-C-2OC" "mechs/BattleCobraCS_C.png" -#exact "Battle Cobra BTL-C-2OD" "mechs/BattleCobraCS_D.png" -#exact "Battle Cobra BTL-C-2OE" "mechs/BattleCobraCS_B.png" -#exact "Battle Cobra BTL-C-2OF" "mechs/BattleCobraCS_F.png" +exact "Battle Cobra BTL-C-2O" "mechs/BattleCobraCS.png" +exact "Battle Cobra BTL-C-2OA" "mechs/BattleCobraCS_A.png" +exact "Battle Cobra BTL-C-2OB" "mechs/BattleCobraCS_B.png" +exact "Battle Cobra BTL-C-2OC" "mechs/BattleCobraCS_C.png" +exact "Battle Cobra BTL-C-2OD" "mechs/BattleCobraCS_D.png" +exact "Battle Cobra BTL-C-2OE" "mechs/BattleCobraCS_B.png" +exact "Battle Cobra BTL-C-2OF" "mechs/BattleCobraCS_F.png" +exact "Battle Cobra BTL-C-2OG" "mechs/BattleCobraCS_G.png" +exact "Battle Cobra BTL-C-2OH" "mechs/BattleCobraCS_H.png" +exact "Battle Cobra BTL-C-2OI" "mechs/BattleCobraCS_I.png" +exact "Battle Cobra BTL-C-2OJ" "mechs/BattleCobraCS_J.png" chassis "Battle Hawk" "mechs/Battle Hawk.png" chassis "Battleax" "mechs/Battleax.png" chassis "Battleaxe" "mechs/Battleaxe.png" @@ -2122,13 +2112,12 @@ chassis "Chimera" "mechs/Chimera.png" exact "Chimera CMA-C" "mechs/Chimera_C.png" exact "Chimera CMA-2K" "mechs/Chimera_2K.png" chassis "Cicada" "mechs/Cicada.png" -exact "Cicada CDA-2B" "mechs/Cicada CDA-2B.png" -exact "Cicada CDA-3C" "mechs/Cicada CDA-3C.png" -exact "Cicada CDA-3F" "mechs/Cicada CDA-3F.png" -exact "Cicada CDA-3G" "mechs/Cicada CDA-3G.png" -exact "Cicada CDA-3M" "mechs/Cicada CDA-3M.png" -exact "Cicada CDA-3MA" "mechs/Cicada CDA-3MA.png" -exact "Cicada CDA-3P" "mechs/Cicada CDA-3P.png" +exact "Cicada CDA-3C" "mechs/Cicada_3C.png" +exact "Cicada CDA-3F" "mechs/Cicada_3F.png" +exact "Cicada CDA-3G" "mechs/Cicada_3G.png" +exact "Cicada CDA-3M" "mechs/Cicada_3M.png" +exact "Cicada CDA-3MA" "mechs/Cicada_3MA.png" +exact "Cicada CDA-3P" "mechs/Cicada_3P.png" chassis "Clint" "mechs/Clint.png" exact "Clint CLNT-1-2R" "mechs/Clint CLNT-1-2R.png" exact "Clint CLNT-2-3U" "mechs/Clint CLNT-2-3U.png" @@ -2714,20 +2703,23 @@ exact "Firefly FFL-3SLE" "mechs/Firefly FFL-3SLE.png" exact "Firefly FFL-3PP" "mechs/Firefly FFL-3PP.png" exact "Firefly FFL-3PP2" "mechs/Firefly FFL-3SLE.png" exact "Firefly FFL-3PP3" "mechs/Firefly FFL-3SLE.png" +#FIRESTARTER Standard chassis "Firestarter" "mechs/Firestarter.png" -exact "Firestarter FS9-A" "mechs/Firestarter FS9-A.png" -exact "Firestarter FS9-B" "mechs/Firestarter FS9-B.png" -exact "Firestarter FS9-C" "mechs/Firestarter FS9-C.png" -exact "Firestarter FS9-K" "mechs/Firestarter FS9-K.png" -exact "Firestarter FS9-M 'Mirage'" "mechs/Firestarter FS9-M.png" -exact "Firestarter FS9-M2" "mechs/Firestarter FS9-M2.png" -exact "Firestarter FS9-M3" "mechs/Firestarter FS9-M3.png" -exact "Firestarter FS9-M4" "mechs/Firestarter FS9-M4.png" -exact "Firestarter FS9-P" "mechs/Firestarter FS9-P.png" -exact "Firestarter FS9-S" "mechs/Firestarter FS9-S.png" -exact "Firestarter FS9-S1" "mechs/Firestarter FS9-S.png" -exact "Firestarter FS9-S2" "mechs/Firestarter FS9-S.png" -exact "Firestarter FS9-S3" "mechs/Firestarter FS9-S.png" +exact "Firestarter FS9-A" "mechs/Firestarter_A.png" +exact "Firestarter FS9-B" "mechs/Firestarter_B.png" +exact "Firestarter FS9-C" "mechs/Firestarter_C.png" +exact "Firestarter FS9-K" "mechs/Firestarter_K.png" +exact "Firestarter FS9-M 'Mirage'" "mechs/Firestarter_M.png" +exact "Firestarter FS9-M2" "mechs/Firestarter_M2.png" +exact "Firestarter FS9-M3" "mechs/Firestarter_M3.png" +exact "Firestarter FS9-M4" "mechs/Firestarter_M4.png" +exact "Firestarter FS9-N 'Mirage II'" "mechs/Firestarter_A.png" +exact "Firestarter FS9-P" "mechs/Firestarter_P.png" +exact "Firestarter FS9-S" "mechs/Firestarter_S.png" +exact "Firestarter FS9-S1" "mechs/Firestarter_S.png" +exact "Firestarter FS9-S2" "mechs/Firestarter_S.png" +exact "Firestarter FS9-S3" "mechs/Firestarter_S.png" +exact "Firestarter FS9-X81" "mechs/Firestarter_81X.png" #Firestarter Omni exact "Firestarter FS9-O" "mechs/FirestarterO.png" exact "Firestarter FS9-OA" "mechs/FirestarterO_A.png" @@ -2759,12 +2751,12 @@ exact "Flashman FLS-9C" "mechs/Flashman_9C.png" exact "Flashman FLS-9M" "mechs/Flashman_9M.png" exact "Flashman FLS-C" "mechs/Flashman_C.png" chassis "Flea" "mechs/Flea.png" -exact "Flea 'Fire Ant'" "mechs/Flea 'Fire Ant'.png" -exact "Flea FLE-14" "mechs/Flea FLE-14.png" -exact "Flea FLE-15" "mechs/Flea FLE-15.png" -exact "Flea FLE-16" "mechs/Flea FLE-16.png" -exact "Flea FLE-19" "mechs/Flea FLE-19.png" -exact "Flea FLE-20" "mechs/Flea FLE-20.png" +exact "Flea FLE-4" "mechs/Flea_4.png" +exact "Flea FLE-14" "mechs/Flea_14.png" +exact "Flea FLE-15" "mechs/Flea_15.png" +exact "Flea FLE-19" "mechs/Flea_19.png" +exact "Flea FLE-20" "mechs/Flea_20.png" +exact "Flea 'Fire Ant'" "mechs/Flea_FA.png" chassis "ForestryMech" "mechs/Crosscut.png" chassis "Fox" "mechs/FoxCS.png" exact "Fox (Standard)" "mechs/FoxCS_Standard.png" @@ -3022,6 +3014,8 @@ chassis "Gun" "mechs/Gun.png" exact "Gun GN-2OA" "mechs/Gun_A.png" exact "Gun GN-2OB" "mechs/Gun_B.png" chassis "Gunslinger" "mechs/Gunslinger.png" +exact "Gunslinger GUN-2ERD" "mechs/Gunslinger_2ERD.png" +exact "Gunslinger GUN-1ERD (Jared)" "mechs/Gunslinger_Jared.png" chassis "Gunsmith" "mechs/Gunsmith.png" chassis "Gurkha" "mechs/Gurkha.png" exact "Gurkha GUR-6G" "mechs/Gurkha GUR-6G.png" @@ -3194,14 +3188,15 @@ exact "Hermes HER-4K" "mechs/Hermes HER-4K.png" exact "Hermes HER-4M" "mechs/Hermes HER-4M.png" exact "Hermes HER-4S" "mechs/Hermes HER-4S.png" exact "Hermes HER-4WB" "mechs/Hermes HER-4S.png" -chassis "Hermes II" "mechs/Hermes II.png" -exact "Hermes II HER-2M 'Mercury'" "mechs/Hermes II HER-2M 'Mercury'.png" -exact "Hermes II HER-4K 'Hermes III'" "mechs/Hermes II HER-4K 'Hermes III'.png" -exact "Hermes II HER-5C" "mechs/Hermes II HER-5C.png" -exact "Hermes II HER-5ME 'Mercury Elite'" "mechs/Hermes II HER-5ME 'Mercury Elite'.png" -exact "Hermes II HER-5SA" "mechs/Hermes II HER-5SA.png" -exact "Hermes II HER-5Sr" "mechs/Hermes II HER-5Sr.png" -exact "Hermes II HER-6D" "mechs/Hermes II HER-6D.png" +chassis "Hermes II" "mechs/HermesII.png" +exact "Hermes II HER-2M 'Mercury'" "mechs/HermesII_2M.png" +exact "Hermes II HER-4K 'Hermes III'" "mechs/HermesII_4K.png" +exact "Hermes II HER-5C" "mechs/HermesII_5C.png" +exact "Hermes II HER-5ME 'Mercury Elite'" "mechs/HermesII_5ME.png" +exact "Hermes II HER-5SA" "mechs/HermesII_5SA.png" +exact "Hermes II HER-5Sr" "mechs/HermesII_5SR.png" +exact "Hermes II HER-6D" "mechs/HermesII_6D.png" +exact "Hermes II HER-7S" "mechs/HermesII_7S.png" chassis "Hermit Crab" "mechs/Hermitcrab.png" chassis "HieroFalcon" "mechs/HieroFalcon.png" exact "HieroFalcon A" "mechs/HieroFalcon_A.png" @@ -3975,6 +3970,8 @@ chassis "Mercury II" "mechs/MercuryII.png" chassis "Merlin" "mechs/Merlin.png" exact "Merlin MLN-1B" "mechs/Merlin_1B.png" exact "Merlin MLN-1C" "mechs/Merlin_1B.png" +exact "Merlin MLN-1E" "mechs/Merlin_1B.png" +exact "Merlin MLN-1P" "mechs/Merlin_1B.png" exact "Merlin MLN-SX" "mechs/Merlin_SX.png" exact "Merlin MLN-1B (Porter)" "mechs/Merlin_1B.png" chassis "Minsk" "mechs/Minsk.png" @@ -4008,6 +4005,14 @@ chassis "MuckRaker" "mechs/Muckraker.png" exact "MuckRaker GMMM-2M MiningMech MOD" "mechs/Muckraker_2M.png" exact "MuckRaker GMMM-2M-B MiningMech MOD" "mechs/Muckraker_2MB.png" chassis "Naga" "mechs/Naga.png" +exact "Naga C" "mechs/Naga_C.png" +exact "Naga D" "mechs/Naga_C.png" +chassis "Naga II" "mechs/NagaII.png" +exact "Naga II A" "mechs/NagaII_A.png" +exact "Naga II B" "mechs/NagaII_B.png" +exact "Naga II C" "mechs/NagaII_C.png" +exact "Naga II H" "mechs/NagaII_H.png" +exact "Naga II W" "mechs/NagaII_W.png" chassis "Naginata" "mechs/Naginata.png" exact "Naginata NG-C3Ar" "mechs/Naginata NG-C3Ar.png" exact "Naginata NG-C3B" "mechs/Naginata NG-C3B.png" @@ -4050,11 +4055,9 @@ chassis "Night Wolf" "mechs/Nightwolf.png" exact "NightHawk NHK-4" "defaults/default_heavy.png" exact "NightHawk TF" "defaults/default_medium.png" chassis "Nightsky" "mechs/Nightsky.png" -exact "Nightsky NGS-4T" "mechs/Nightsky NGS-4T.png" -exact "Nightsky NGS-5S" "mechs/Nightsky NGS-5S.png" -exact "Nightsky NGS-5T" "mechs/Nightsky NGS-5T.png" -exact "Nightsky NGS-6S" "mechs/Nightsky NGS-6S.png" -exact "Nightsky NGS-6T" "mechs/Nightsky NGS-6T.png" +exact "Nightsky NGS-4T" "mechs/Nightsky_4T.png" +exact "Nightsky NGS-6S" "mechs/Nightsky_6S.png" +exact "Nightsky NGS-6T" "mechs/Nightsky_6T.png" chassis "Nightstar" "mechs/Nightstar.png" exact "Nightstar NSR-9FC" "mechs/Nightstar_9FC.png" exact "Nightstar NSR-9SS" "mechs/Nightstar_9SS.png" @@ -4341,7 +4344,13 @@ exact "Phantom C" "mechs/Phantom_C.png" exact "Phantom D" "mechs/Phantom_D.png" exact "Phantom E" "mechs/Phantom_E.png" exact "Phantom F" "mechs/Phantom_F.png" +exact "Phantom G" "mechs/Phantom_G.png" exact "Phantom H" "mechs/Phantom_H.png" +exact "Phantom I" "mechs/Phantom_I.png" +exact "Phantom J" "mechs/Phantom_J.png" +exact "Phantom K" "mechs/Phantom_K.png" +exact "Phantom L" "mechs/Phantom_L.png" +exact "Phantom R" "mechs/Phantom_R.png" chassis "Phoenix" "mechs/Phoenix.png"exact "Phoenix PX-1KC" "mechs/Phoenix_1KC.png" exact "Phoenix PX-1KL" "mechs/Phoenix_1KL.png" exact "Phoenix PX-1KR" "mechs/Phoenix_1KR.png" @@ -4505,16 +4514,17 @@ chassis "Pwwka_fighter" "mechs/Pwwka Fighter.png" chassis "Quasimodo" "mechs/Quasimodo.png" chassis "Quasit MilitiaMech" "mechs/Quasit.png" exact "Quasit MilitiaMech QUA-51P" "mechs/Quasit_51P.png" -chassis "Quickdraw IIC" "mechs/quickdraw_iic.png" chassis "Quickdraw" "mechs/Quickdraw.png" -exact "Quickdraw QKD-4H" "mechs/Quickdraw QKD-4H.png" -exact "Quickdraw QKD-5A" "mechs/Quickdraw QKD-5A.png" -exact "Quickdraw QKD-5K" "mechs/Quickdraw QKD-5A.png" -exact "Quickdraw QKD-C" "mechs/Quickdraw QKD-5A.png" -exact "Quickdraw QKD-5K2" "mechs/Quickdraw QKD-5K2.png" -exact "Quickdraw QKD-8K" "mechs/Quickdraw QKD-8K.png" -exact "Quickdraw QKD-8P" "mechs/Quickdraw QKD-8P.png" -exact "Quickdraw QKD-9M" "mechs/Quickdraw QKD-9M.png" +exact "Quickdraw QKD-4H" "mechs/Quickdraw_4H.png" +exact "Quickdraw QKD-5A" "mechs/Quickdraw_5A.png" +exact "Quickdraw QKD-5K" "mechs/Quickdraw_5A.png" +exact "Quickdraw QKD-C" "mechs/Quickdraw_5A.png" +exact "Quickdraw QKD-5K2" "mechs/Quickdraw_5K2.png" +exact "Quickdraw QKD-8K" "mechs/Quickdraw_8K.png" +exact "Quickdraw QKD-8P" "mechs/Quickdraw_8P.png" +exact "Quickdraw QKD-8X" "mechs/Quickdraw_8X.png" +exact "Quickdraw QKD-9M" "mechs/Quickdraw_9M.png" +chassis "Quickdraw IIC" "mechs/quickdraw_iic.png" chassis "Rabid Coyote" "mechs/Rabid Coyote.png" exact "Rabid Coyote 2" "mechs/Rabid Coyote 2.png" #chassis "Ragnark" " .png" @@ -4692,7 +4702,6 @@ exact "Ryoken (Stormcrow) TC" "mechs/Ryoken_TC-CO.png" exact "Ryoken (Stormcrow) Z" "mechs/Ryoken_Z-CO.png" exact "Ryoken (Stormcrow) (Attwater)" "mechs/Ryoken_Attwater-CO.png" exact "Ryoken (Stormcrow) (Kotare)" "mechs/Ryoken_Kotare-CO.png" - #Ryoken II chassis "Ryoken II" "mechs/RyokenII.png" exact "Ryoken II 2" "mechs/RyokenII_2.png" @@ -4919,9 +4928,9 @@ chassis "Spatha" "mechs/Spatha.png" exact "Spatha SP2-X 'Warlord'" "mechs/Spatha_2X.png" chassis "Spartan" "mechs/Spartan.png" chassis "Spector" "mechs/Spector.png" -exact "Spector SPR-4F" "mechs/Spector SPR-4F.png" -exact "Spector SPR-5S" "mechs/Spector SPR-5S.png" -exact "Spector SPR-ST" "mechs/Spector SPR-ST.png" +exact "Spector SPR-4F" "mechs/Spector_4F.png" +exact "Spector SPR-5S" "mechs/Spector_5S.png" +exact "Spector SPR-ST" "mechs/Spector_ST.png" chassis "Sphinx" "mechs/Sphinx.png" exact "Sphinx 2" "mechs/Sphinx 2.png" exact "Sphinx 3" "mechs/Sphinx 3.png" @@ -4973,7 +4982,7 @@ exact "Star Python (Standard)" "mechs/StarPython.png" chassis "Starslayer" "mechs/Starslayer.png" exact "Starslayer STY-2C-EC" "mechs/Starslayer_2CEC.png" exact "Starslayer STY-3D" "mechs/Starslayer_3D.png" -exact "Starslayer STY-3Dr" "mechs/Starslayer_3DR.png" +exact "Starslayer STY-3Dr" "mechs/Starslayer_3Dr.png" chassis "Stealth" "mechs/Stealth.png" exact "Stealth STH-2D" "mechs/Stealth_2D.png" exact "Stealth STH-2D1" "mechs/Stealth_2D1.png" @@ -7115,8 +7124,8 @@ exact "Athena XR" "vehicles/Athena.png" chassis "Athena Fire Direction Control Carrier" "vehicles/Athena.png" chassis "Axel Heavy Tank" "vehicles/Axel.png" exact "Axel Heavy Tank Mk 2" "vehicles/Axel_2.png" -chassis "Axel Heavy Tank IIC" "vehicles/AxelIIC.png" -exact "Axel Heavy Tank IIC (XL)" "vehicles/AxelIIC_Xl.png" +chassis "Axel Heavy Tank IIC" "vehicles/Axel_IIC.png" +exact "Axel Heavy Tank IIC (XL)" "vehicles/Axel_IIC_Xl.png" chassis "Badger Tracked Transport" "vehicles/Badger.png" exact "Badger Tracked Transport A" "vehicles/Badger_A.png" exact "Badger Tracked Transport B" "vehicles/Badger_B.png" @@ -7224,6 +7233,7 @@ chassis "Bulwark Assault Vehicle" "vehicles/Bulwark.png" chassis "Burke Defense Tank" "vehicles/Burke.png" exact "Burke Defense Tank (HPPC)" "vehicles/Burke_HPPC.png" chassis "Burke II Superheavy Tank" "vehicles/Burkeii.png" +chassis "Buzzard Hover Tank" "vehicles/FalconHT.png" #Carrier Chassis chassis "AC/2 Carrier" "vehicles/Carrier_AC2.png" chassis "Laser Carrier" "vehicles/Carrier_Laser.png" @@ -7285,14 +7295,16 @@ chassis "Cobra Transport VTOL" "vehicles/Cobravtol.png" chassis "Cobra VTOL Transport" "vehicles/Cobravtol.png" chassis "Command Van" "vehicles/CommandVan.png" chassis "Condor Heavy Hover Tank" "vehicles/Condor.png" -exact "Condor Heavy Hover Tank (Davion)" "vehicles/Condor_ac.png" -exact "Condor Heavy Hover Tank (Liao)" "vehicles/Condor_ml.png" -exact "Condor Heavy Hover Tank (Flamer)" "vehicles/Condor_flamer.png" -exact "Condor Heavy Hover Tank (Laser)" "vehicles/Condor_ml.png" -exact "Condor Heavy Hover Tank (Laser Upgrade)" "vehicles/Condor_rel.png" -exact "Condor Heavy Hover Tank (Upgrade) (Standard)" "vehicles/Condor_upgrade.png" -exact "Condor Heavy Hover Tank (Upgrade) (Laser)" "vehicles/Condor_upgrade.png" -chassis "Condor Multi-Purpose Tank" "vehicles/Condor_mpv.png" +exact "Condor Heavy Hover Tank (Davion)" "vehicles/Condor_Davion.png" +exact "Condor Heavy Hover Tank (Liao)" "vehicles/Condor_Liao.png" +exact "Condor Heavy Hover Tank (Flamer)" "vehicles/Condor_Flamer.png" +exact "Condor Heavy Hover Tank (Laser)" "vehicles/Condor_ML.png" +exact "Condor Heavy Hover Tank (Laser Upgrade)" "vehicles/Condor_REL.png" +exact "Condor Heavy Hover Tank C" "vehicles/Condor_C.png" +exact "Condor Heavy Hover Tank (Fission)" "vehicles/Condor_Fission.png" +exact "Condor Heavy Hover Tank (Upgrade) (Standard)" "vehicles/Condor_Upgrade.png" +exact "Condor Heavy Hover Tank (Upgrade) (Laser)" "vehicles/Condor_Upgrade.png" +chassis "Condor Multi-Purpose Tank" "vehicles/Condor_MPV.png" chassis "Coolant Truck" "vehicles/coolanttruck.png" exact "Coolant Truck (Hover)" "vehicles/coolanttruck_hover.png" exact "Coolant Truck (Tracked)" "vehicles/coolanttruck_track.png" @@ -7388,7 +7400,7 @@ exact "Epona Pursuit Tank E" "vehicles/Epona_E.png" #chassis "Escort" " .png" chassis "Estevez MBT" "vehicles/Estevez.png" exact "Estevez MBT (Anti-Aircraft)" "vehicles/Estevez_AA.png -chassis "Falcon Hover Tank" "vehicles/Falconht.png" +chassis "Falcon Hover Tank" "vehicles/FalconHT.png" chassis "Fensalir Combat WiGE" "vehicles/Fensalir.png" exact "Fensalir Combat WiGE (HAG)" "vehicles/Fensalir_HAG.png" exact "Fensalir Combat WiGE (Infantry)" "vehicles/Fensalir_Infantry.png" @@ -7428,13 +7440,15 @@ exact "Gabriel Reconnaissance Hovercraft (TDF)" "vehicles/Gabriel_TDF.png" chassis "Galaport Ground Trailer" "vehicles/Galaportgt_Trailer.png" chassis "Galaport Ground Tug" "vehicles/Galaportgt.png" chassis "Galleon Light Tank" "vehicles/Galleon.png" -exact "Galleon Light Tank GAL-102" "vehicles/Galleon_102.png" -exact "Galleon Light Tank GAL-103" "vehicles/Galleon_102.png" exact "Galleon Light Tank GAL-104" "vehicles/Galleon_104.png" exact "Galleon Light Tank GAL-105" "vehicles/Galleon_105.png" +exact "Galleon Light Tank GAL-106M" "vehicles/Galleon_200.png" exact "Galleon Light Tank GAL-200" "vehicles/Galleon_200.png" -exact "Galleon Light Tank GAL-200 (RL)" "vehicles/Galleon_RL.png" -exact "Galleon Light Tank Maxwell" "vehicles/Galleon_Maxwell.png" +exact "Galleon Light Tank GAL-200R" "vehicles/Galleon_200R.png" +exact "Galleon Light Tank GAL-200 (RL)" "vehicles/Galleon_200R.png" +exact "Galleon Light Tank GAL-201" "vehicles/Galleon_201.png" +exact "Galleon Light Tank GAL-300" "vehicles/Galleon_300.png" +exact "Galleon Light Tank C" "vehicles/Galleon_C.png" chassis "Gallant Urban Assault Tank" "vehicles/Gallantuav.png" chassis "Garrot Superheavy Transport" "vehicles/Garrot.png" chassis "Garuda Heavy VTOL" "vehicles/Garuda Heavy VTOL.png" @@ -7492,6 +7506,7 @@ chassis "Harasser Missile Platform" "vehicles/harasser.png" exact "Harasser Missile Platform (Flamer)" "vehicles/harasser_flamer.png" exact "Harasser Missile Platform (Thunderbolt)" "vehicles/harasser_thunder.png" chassis "Hasek Mechanized Combat Vehicle" "vehicles/Hasek.png" +chassis "Hawk Hover Tank" "vehicles/LTV4.png" chassis "Hawk Moth Gunship" "vehicles/Hawkmoth.png" exact "Hawk Moth Gunship (Thunderbolt)" "vehicles/Hawkmoth_Thunderbolt.png" chassis "Hawk Moth II Gunship" "vehicles/HawkmothII.png" @@ -7549,7 +7564,7 @@ exact "Hi-Scout Drone (PathTrak)" "vehicles/Hiscout_Pathtrack.png" chassis "Hoodling Sensor HoverJeep" "vehicles/Hoodling.png" chassis "HoverPod" "vehicles/HoverPod.png" chassis "Hover Scout" "vehicles/Hoverscout.png" -chassis "Hover Tank" "vehicles/Ltv4.png" +chassis "Hover Tank" "vehicles/LTV4.png" chassis "Huitzilopochtli Assault Tank 'Huey'" "vehicles/Huey.png" exact "Huitzilopochtli Assault Tank 'Huey' (AAA)" "vehicles/Huey_AAA.png" exact "Huitzilopochtli Assault Tank 'Huey' (LRM)" "vehicles/Huey_LRM.png" @@ -7614,6 +7629,9 @@ chassis "Kallon UL-series Construction Vehicle" "vehicles/Kallonul.png" chassis "Kalki Cruise Missile Launcher" "vehicles/Kalki.png" chassis "Kamakiri Attack VTOL" "vehicles/Kamakiri.png" exact "Kamakiri Attack VTOL (Gauss)" "vehicles/Kamakiri_Shi.png" +chassis "Kamisori Light Tank" "vehicles/Kamisori.png" +exact "Kamisori Light Tank B" "vehicles/Kamisori_B.png" +exact "Kamisori Light Tank C" "vehicles/Kamisori_B.png" #chassis "Kamayari" " .png" chassis "Kanga Medium Hovertank" "vehicles/Kanga.png" exact "Kanga Medium Hovertank (AC)" "vehicles/Kanga_AC.png" @@ -7658,7 +7676,7 @@ chassis "Lightning Attack Hovercraft" "vehicles/Lightning.png" exact "Lightning Attack Hovercraft (ERML)" "vehicles/Lightning_ERML.png" exact "Lightning Attack Hovercraft (ERSL)" "vehicles/Lightning_ERSL.png" exact "Lightning Attack Hovercraft (RL)" "vehicles/Lightning_RL.png" -chassis "LTV-4 Hover Tank" "vehicles/Ltv4.png" +chassis "LTV-4 Hover Tank" "vehicles/LTV4.png" chassis "Luciano White Wolverine" "vehicles/Whitewolverine.png" chassis "Luduan Scout Vehicle" "vehicles/Luduan.png" chassis "M.A.S.H. Truck" "vehicles/Mash.png" @@ -7706,14 +7724,13 @@ chassis "Maultier Hover APC" "vehicles/Maultier.png" exact "Maultier Hover APC (Fusion)" "vehicles/Maultier_Fusion.png" exact "Maultier Hover APC (MG)" "vehicles/Maultier_MG.png" chassis "Maxim Heavy Hover Transport" "vehicles/Maxim.png" -exact "Maxim Flanker (Standard)" "vehicles/Maxim.png" exact "Maxim Heavy Hover Transport (3052 Upgrade)" "vehicles/Maxim_3052.png" exact "Maxim Heavy Hover Transport (Anti-Infantry)" "vehicles/Maxim_AI.png" -exact "Maxim Heavy Hover Transport (BA Factory Upgrade)" "vehicles/Maxim_BAFac.png" -exact "Maxim Heavy Hover Transport (BA Field Upgrade)" "vehicles/Maxim_BAField.png" +exact "Maxim Heavy Hover Transport (BA Factory Upgrade)" "vehicles/Maxim_3052.png" +exact "Maxim Heavy Hover Transport (BA Field Upgrade)" "vehicles/Maxim_C3M.png" exact "Maxim Heavy Hover Transport (C3M)" "vehicles/Maxim_C3M.png" -exact "Maxim Heavy Hover Transport (C3S)" "vehicles/Maxim_BAField.png" -exact "Maxim Heavy Hover Transport (Clan)" "vehicles/Maxim_BAFac.png" +exact "Maxim Heavy Hover Transport (C3S)" "vehicles/Maxim_C3M.png" +exact "Maxim Heavy Hover Transport (Clan)" "vehicles/Maxim_3052.png" exact "Maxim Heavy Hover Transport (Fire Support)" "vehicles/Maxim_FS.png" exact "Maxim Heavy Hover Transport (SRM2)" "vehicles/Maxim_SRM.png" exact "Maxim Heavy Hover Transport (SRM4)" "vehicles/Maxim_SRM4.png" @@ -7721,6 +7738,7 @@ chassis "Maxim (I) Heavy Hover Transport" "vehicles/Maxim_I.png" chassis "Maxim Mk II Transport" "vehicles/MaximMKII.png" exact "Maxim Mk II Transport (ECM)" "vehicles/MaximMKII_ECM.png" exact "Maxim Mk II Transport (Infantry Support) 'Shiloh'" "vehicles/MaximMKII_IS.png" +exact "Maxim Flanker (Standard)" "vehicles/Maxim_Flanker.png" #chassis "Mercy Class Helicopter" " .png" chassis "Merkava Heavy Tank" "vehicles/Merkava.png" exact "Merkava Heavy Tank Mk VI" "vehicles/Merkava_VII.png" @@ -7826,10 +7844,9 @@ exact "Partisan Heavy Tank (C3)" "vehicles/Partisan_C3.png" exact "Partisan Heavy Tank (LRM)" "vehicles/Partisan_LRM.png" exact "Partisan Heavy Tank (AC2)" "vehicles/Partisan_AC2.png" exact "Partisan Hull Defense (Standard)" "vehicles/Partisan.png" -chassis "Patton II" "vehicles/Patton.png" chassis "Patton Tank" "vehicles/Patton.png" exact "Patton Tank (Ultra)" "vehicles/Patton_Ultra.png" -chassis "Patton Tank-SB" "vehicles/Patton.png" +chassis "Patton Tank-SB" "vehicles/Patton_SB.png" chassis "Patton II" "vehicles/Patton.png" chassis "Peacekeeper SWAT Carrier" "vehicles/Peacekeepervtol.png" chassis "Pegasus Scout Hover Tank" "vehicles/Pegasus.png" @@ -7921,7 +7938,7 @@ exact "Rommel Tank (Gauss)" "vehicles/Rommel_Gauss.png" exact "Rommel Tank (Sealed)" "vehicles/Rommel_Sealed.png" exact "Rommel Tank (Howitzer) Production" "vehicles/Rommel_Howitzer.png" exact "Rommel Tank (Howitzer) Prototype" "vehicles/Rommel_Howitzer.png" -chassis "Rommel II" "vehicles/rommel2.png" +chassis "Rommel II" "vehicles/Rommel.png" #chassis "Ronin" " .png" chassis "Rotunda Scout Vehicle" "vehicles/Rotunda.png" exact "Rotunda Scout Vehicle RND-J-1-11 (LRM)" "vehicles/Rotunda_LRM.png" @@ -8019,8 +8036,11 @@ chassis "Skanda Light Tank" "vehicles/Skanda.png" exact "Skanda Light Tank (TSEMP)" "vehicles/Skanda_TSEMP.png" chassis "Skimmer" "vehicles/Skimmer.png" chassis "Skoda 'Growler' Service Utility Truck" "vehicles/Growler.png" -chassis "Skulker Wheeled Scout Tank" "vehicles/skulker.png" -chassis "Skulker Wheeled Scout Tank Mk II" "vehicles/skulkerii.png" +chassis "Skulker Wheeled Scout Tank" "vehicles/Skulker.png" +exact "Skulker Wheeled Scout Tank (C3M)" "vehicles/Skulker_C3M.png" +exact "Skulker Wheeled Scout Tank (MG)" "vehicles/Skulker_MG.png" +exact "Skulker Wheeled Scout Tank (SRM)" "vehicles/Skulker_SRM.png" +chassis "Skulker Wheeled Scout Tank Mk II" "vehicles/SkulkerII.png" chassis "Sky Eye News Helicopter" "vehicles/Skyeye.png" chassis "Sleipnir APC Tank" "vehicles/Sleipnir.png" exact "Sleipnir APC Tank (SRM)" "vehicles/Sleipnir_SRM.png" @@ -8138,15 +8158,17 @@ exact "Von Luckner Heavy Tank VNL-K70" "vehicles/Vonluckner_K70.png" exact "Von Luckner Heavy Tank VNL-K75N" "vehicles/Vonluckner_K75N.png" exact "Von Luckner Heavy Tank VNL-K100" "vehicles/Vonluckner_K100.png" exact "Von Luckner Heavy Tank VNL-X71 (Yakuza)" "vehicles/Vonluckner_X71.png" -chassis "Warrior Attack Helicopter" "vehicles/warrior.png" -exact "Warrior Attack Helicopter H-7A" "vehicles/warrior_7a.png" -exact "Warrior Attack Helicopter H-7C" "vehicles/warrior_7c.png" -exact "Warrior Attack Helicopter H-8" "vehicles/warrior_7c.png" -exact "Warrior Attack Helicopter H-9" "vehicles/warrior_9.png" -exact "Warrior Attack Helicopter H-10" "vehicles/warrior_10.png" -chassis "Warrior Stealth Helicopter" "vehicles/warrior_s9.png" +chassis "Warrior Attack Helicopter" "vehicles/Warrior.png" +exact "Warrior Attack Helicopter H-7A" "vehicles/Warrior_7A.png" +exact "Warrior Attack Helicopter H-7C" "vehicles/Warrior_7C.png" +exact "Warrior Attack Helicopter H-8" "vehicles/Warrior_7C.png" +exact "Warrior Attack Helicopter H-9" "vehicles/Warrior_9.png" +exact "Warrior Attack Helicopter H-10" "vehicles/Warrior_10.png" +exact "Warrior Attack Helicopter HX-9" "vehicles/Warrior_7A.png" +chassis "Warrior Stealth Helicopter" "vehicles/Warrior_S9.png" chassis "Wayland Mobile Base" "vehicles/Wayland.png" chassis "Wet Striker Light Tank" "vehicles/Striker Light Tank.png" +chassis "Whirlwind Scout Hover Tank" "vehicles/Whirlwind.png" chassis "Wheeled Scout" "vehicles/WheeledScout.png" chassis "Winston Combat Vehicle" "vehicles/Winston.png" exact "Winston Combat Vehicle (LAC)" "vehicles/Winston_LAC.png" diff --git a/megamek/data/images/units/vehicles/Axel.png b/megamek/data/images/units/vehicles/Axel.png index 5c5f632d32b..3c6f15862ee 100644 Binary files a/megamek/data/images/units/vehicles/Axel.png and b/megamek/data/images/units/vehicles/Axel.png differ diff --git a/megamek/data/images/units/vehicles/AxelIIC.png b/megamek/data/images/units/vehicles/AxelIIC.png deleted file mode 100644 index 9a2aaee2bcd..00000000000 Binary files a/megamek/data/images/units/vehicles/AxelIIC.png and /dev/null differ diff --git a/megamek/data/images/units/vehicles/AxelIIC_Xl.png b/megamek/data/images/units/vehicles/AxelIIC_Xl.png deleted file mode 100644 index 3ba28859774..00000000000 Binary files a/megamek/data/images/units/vehicles/AxelIIC_Xl.png and /dev/null differ diff --git a/megamek/data/images/units/vehicles/Axel_2.png b/megamek/data/images/units/vehicles/Axel_2.png index 73f8f4e421d..7268705fd17 100644 Binary files a/megamek/data/images/units/vehicles/Axel_2.png and b/megamek/data/images/units/vehicles/Axel_2.png differ diff --git a/megamek/data/images/units/vehicles/Axel_IIC.png b/megamek/data/images/units/vehicles/Axel_IIC.png new file mode 100644 index 00000000000..84f5a35560b Binary files /dev/null and b/megamek/data/images/units/vehicles/Axel_IIC.png differ diff --git a/megamek/data/images/units/vehicles/Axel_IIC_Xl.png b/megamek/data/images/units/vehicles/Axel_IIC_Xl.png new file mode 100644 index 00000000000..8ace2e70341 Binary files /dev/null and b/megamek/data/images/units/vehicles/Axel_IIC_Xl.png differ diff --git a/megamek/data/images/units/vehicles/Condor.png b/megamek/data/images/units/vehicles/Condor.png index a8a034f8378..fab018f44a0 100644 Binary files a/megamek/data/images/units/vehicles/Condor.png and b/megamek/data/images/units/vehicles/Condor.png differ diff --git a/megamek/data/images/units/vehicles/Condor_C.png b/megamek/data/images/units/vehicles/Condor_C.png new file mode 100644 index 00000000000..4aa608f4301 Binary files /dev/null and b/megamek/data/images/units/vehicles/Condor_C.png differ diff --git a/megamek/data/images/units/vehicles/Condor_Davion.png b/megamek/data/images/units/vehicles/Condor_Davion.png new file mode 100644 index 00000000000..709ec5f4944 Binary files /dev/null and b/megamek/data/images/units/vehicles/Condor_Davion.png differ diff --git a/megamek/data/images/units/vehicles/Condor_Fission.png b/megamek/data/images/units/vehicles/Condor_Fission.png new file mode 100644 index 00000000000..d331cacec1a Binary files /dev/null and b/megamek/data/images/units/vehicles/Condor_Fission.png differ diff --git a/megamek/data/images/units/vehicles/Condor_Flamer.png b/megamek/data/images/units/vehicles/Condor_Flamer.png new file mode 100644 index 00000000000..8360edb1663 Binary files /dev/null and b/megamek/data/images/units/vehicles/Condor_Flamer.png differ diff --git a/megamek/data/images/units/vehicles/Condor_Liao.png b/megamek/data/images/units/vehicles/Condor_Liao.png new file mode 100644 index 00000000000..f1719a3c024 Binary files /dev/null and b/megamek/data/images/units/vehicles/Condor_Liao.png differ diff --git a/megamek/data/images/units/vehicles/Condor_ML.png b/megamek/data/images/units/vehicles/Condor_ML.png new file mode 100644 index 00000000000..ede3ef2204f Binary files /dev/null and b/megamek/data/images/units/vehicles/Condor_ML.png differ diff --git a/megamek/data/images/units/vehicles/Condor_MPV.png b/megamek/data/images/units/vehicles/Condor_MPV.png new file mode 100644 index 00000000000..05d6e5f85c4 Binary files /dev/null and b/megamek/data/images/units/vehicles/Condor_MPV.png differ diff --git a/megamek/data/images/units/vehicles/Condor_REL.png b/megamek/data/images/units/vehicles/Condor_REL.png new file mode 100644 index 00000000000..c0ab62a3bf2 Binary files /dev/null and b/megamek/data/images/units/vehicles/Condor_REL.png differ diff --git a/megamek/data/images/units/vehicles/Condor_Upgrade.png b/megamek/data/images/units/vehicles/Condor_Upgrade.png new file mode 100644 index 00000000000..3a9fa1a2fad Binary files /dev/null and b/megamek/data/images/units/vehicles/Condor_Upgrade.png differ diff --git a/megamek/data/images/units/vehicles/Condor_ac.png b/megamek/data/images/units/vehicles/Condor_ac.png deleted file mode 100644 index c7638abc2dc..00000000000 Binary files a/megamek/data/images/units/vehicles/Condor_ac.png and /dev/null differ diff --git a/megamek/data/images/units/vehicles/Condor_flamer.png b/megamek/data/images/units/vehicles/Condor_flamer.png deleted file mode 100644 index f8fff87d34e..00000000000 Binary files a/megamek/data/images/units/vehicles/Condor_flamer.png and /dev/null differ diff --git a/megamek/data/images/units/vehicles/Condor_ml.png b/megamek/data/images/units/vehicles/Condor_ml.png deleted file mode 100644 index 0ba5c118488..00000000000 Binary files a/megamek/data/images/units/vehicles/Condor_ml.png and /dev/null differ diff --git a/megamek/data/images/units/vehicles/Condor_mpv.png b/megamek/data/images/units/vehicles/Condor_mpv.png deleted file mode 100644 index 4df484e6ab9..00000000000 Binary files a/megamek/data/images/units/vehicles/Condor_mpv.png and /dev/null differ diff --git a/megamek/data/images/units/vehicles/Condor_rel.png b/megamek/data/images/units/vehicles/Condor_rel.png deleted file mode 100644 index 55ef45a90b2..00000000000 Binary files a/megamek/data/images/units/vehicles/Condor_rel.png and /dev/null differ diff --git a/megamek/data/images/units/vehicles/Condor_upgrade.png b/megamek/data/images/units/vehicles/Condor_upgrade.png deleted file mode 100644 index 52a2f4537f3..00000000000 Binary files a/megamek/data/images/units/vehicles/Condor_upgrade.png and /dev/null differ diff --git a/megamek/data/images/units/vehicles/FalconHT.png b/megamek/data/images/units/vehicles/FalconHT.png new file mode 100644 index 00000000000..bab731eaa4b Binary files /dev/null and b/megamek/data/images/units/vehicles/FalconHT.png differ diff --git a/megamek/data/images/units/vehicles/Falconht.png b/megamek/data/images/units/vehicles/Falconht.png deleted file mode 100644 index 41f9072899e..00000000000 Binary files a/megamek/data/images/units/vehicles/Falconht.png and /dev/null differ diff --git a/megamek/data/images/units/vehicles/Galleon.png b/megamek/data/images/units/vehicles/Galleon.png index 7045dc5b1f0..751599299fb 100644 Binary files a/megamek/data/images/units/vehicles/Galleon.png and b/megamek/data/images/units/vehicles/Galleon.png differ diff --git a/megamek/data/images/units/vehicles/Galleon_102.png b/megamek/data/images/units/vehicles/Galleon_102.png deleted file mode 100644 index c399c5edba8..00000000000 Binary files a/megamek/data/images/units/vehicles/Galleon_102.png and /dev/null differ diff --git a/megamek/data/images/units/vehicles/Galleon_104.png b/megamek/data/images/units/vehicles/Galleon_104.png index eedab13134d..68c1932ce6b 100644 Binary files a/megamek/data/images/units/vehicles/Galleon_104.png and b/megamek/data/images/units/vehicles/Galleon_104.png differ diff --git a/megamek/data/images/units/vehicles/Galleon_105.png b/megamek/data/images/units/vehicles/Galleon_105.png index 0365ee27ab8..109f8d95d7b 100644 Binary files a/megamek/data/images/units/vehicles/Galleon_105.png and b/megamek/data/images/units/vehicles/Galleon_105.png differ diff --git a/megamek/data/images/units/vehicles/Galleon_200.png b/megamek/data/images/units/vehicles/Galleon_200.png index 5db139ecd12..d4d52bdb5f6 100644 Binary files a/megamek/data/images/units/vehicles/Galleon_200.png and b/megamek/data/images/units/vehicles/Galleon_200.png differ diff --git a/megamek/data/images/units/vehicles/Galleon_200R.png b/megamek/data/images/units/vehicles/Galleon_200R.png new file mode 100644 index 00000000000..e4632d1d6e8 Binary files /dev/null and b/megamek/data/images/units/vehicles/Galleon_200R.png differ diff --git a/megamek/data/images/units/vehicles/Galleon_201.png b/megamek/data/images/units/vehicles/Galleon_201.png new file mode 100644 index 00000000000..4a824b08c9e Binary files /dev/null and b/megamek/data/images/units/vehicles/Galleon_201.png differ diff --git a/megamek/data/images/units/vehicles/Galleon_300.png b/megamek/data/images/units/vehicles/Galleon_300.png new file mode 100644 index 00000000000..79789acdcf2 Binary files /dev/null and b/megamek/data/images/units/vehicles/Galleon_300.png differ diff --git a/megamek/data/images/units/vehicles/Galleon_C.png b/megamek/data/images/units/vehicles/Galleon_C.png new file mode 100644 index 00000000000..5129fec044b Binary files /dev/null and b/megamek/data/images/units/vehicles/Galleon_C.png differ diff --git a/megamek/data/images/units/vehicles/Galleon_Maxwell.png b/megamek/data/images/units/vehicles/Galleon_Maxwell.png deleted file mode 100644 index a4418de79b7..00000000000 Binary files a/megamek/data/images/units/vehicles/Galleon_Maxwell.png and /dev/null differ diff --git a/megamek/data/images/units/vehicles/Galleon_RL.png b/megamek/data/images/units/vehicles/Galleon_RL.png deleted file mode 100644 index ebc2e035305..00000000000 Binary files a/megamek/data/images/units/vehicles/Galleon_RL.png and /dev/null differ diff --git a/megamek/data/images/units/vehicles/Kamisori.png b/megamek/data/images/units/vehicles/Kamisori.png new file mode 100644 index 00000000000..3bf7c2e002c Binary files /dev/null and b/megamek/data/images/units/vehicles/Kamisori.png differ diff --git a/megamek/data/images/units/vehicles/Kamisori_B.png b/megamek/data/images/units/vehicles/Kamisori_B.png new file mode 100644 index 00000000000..72a2d180743 Binary files /dev/null and b/megamek/data/images/units/vehicles/Kamisori_B.png differ diff --git a/megamek/data/images/units/vehicles/LTV4.png b/megamek/data/images/units/vehicles/LTV4.png new file mode 100644 index 00000000000..1f41176189e Binary files /dev/null and b/megamek/data/images/units/vehicles/LTV4.png differ diff --git a/megamek/data/images/units/vehicles/Ltv4.png b/megamek/data/images/units/vehicles/Ltv4.png deleted file mode 100644 index d893dcb6c87..00000000000 Binary files a/megamek/data/images/units/vehicles/Ltv4.png and /dev/null differ diff --git a/megamek/data/images/units/vehicles/Maxim.png b/megamek/data/images/units/vehicles/Maxim.png index f83c942138f..bcdc2fca58a 100644 Binary files a/megamek/data/images/units/vehicles/Maxim.png and b/megamek/data/images/units/vehicles/Maxim.png differ diff --git a/megamek/data/images/units/vehicles/MaximMKII.png b/megamek/data/images/units/vehicles/MaximMKII.png index 03b906acf3b..b0b2a03bc63 100644 Binary files a/megamek/data/images/units/vehicles/MaximMKII.png and b/megamek/data/images/units/vehicles/MaximMKII.png differ diff --git a/megamek/data/images/units/vehicles/MaximMKII_ECM.png b/megamek/data/images/units/vehicles/MaximMKII_ECM.png index 3d8817c4390..d6811f6d7ac 100644 Binary files a/megamek/data/images/units/vehicles/MaximMKII_ECM.png and b/megamek/data/images/units/vehicles/MaximMKII_ECM.png differ diff --git a/megamek/data/images/units/vehicles/MaximMKII_IS.png b/megamek/data/images/units/vehicles/MaximMKII_IS.png index 7a3ea17f6ff..4f2001a2f39 100644 Binary files a/megamek/data/images/units/vehicles/MaximMKII_IS.png and b/megamek/data/images/units/vehicles/MaximMKII_IS.png differ diff --git a/megamek/data/images/units/vehicles/Maxim_3052.png b/megamek/data/images/units/vehicles/Maxim_3052.png index 2edf51e6a84..ba319578694 100644 Binary files a/megamek/data/images/units/vehicles/Maxim_3052.png and b/megamek/data/images/units/vehicles/Maxim_3052.png differ diff --git a/megamek/data/images/units/vehicles/Maxim_AI.png b/megamek/data/images/units/vehicles/Maxim_AI.png index 03358275974..26f688df745 100644 Binary files a/megamek/data/images/units/vehicles/Maxim_AI.png and b/megamek/data/images/units/vehicles/Maxim_AI.png differ diff --git a/megamek/data/images/units/vehicles/Maxim_BAFac.png b/megamek/data/images/units/vehicles/Maxim_BAFac.png deleted file mode 100644 index a8f240ea83d..00000000000 Binary files a/megamek/data/images/units/vehicles/Maxim_BAFac.png and /dev/null differ diff --git a/megamek/data/images/units/vehicles/Maxim_BAField.png b/megamek/data/images/units/vehicles/Maxim_BAField.png deleted file mode 100644 index 421c1324115..00000000000 Binary files a/megamek/data/images/units/vehicles/Maxim_BAField.png and /dev/null differ diff --git a/megamek/data/images/units/vehicles/Maxim_C3M.png b/megamek/data/images/units/vehicles/Maxim_C3M.png index 30b09b11e40..ec175624768 100644 Binary files a/megamek/data/images/units/vehicles/Maxim_C3M.png and b/megamek/data/images/units/vehicles/Maxim_C3M.png differ diff --git a/megamek/data/images/units/vehicles/Maxim_FS.png b/megamek/data/images/units/vehicles/Maxim_FS.png index b0e3a3ad3a3..d543d6a9a78 100644 Binary files a/megamek/data/images/units/vehicles/Maxim_FS.png and b/megamek/data/images/units/vehicles/Maxim_FS.png differ diff --git a/megamek/data/images/units/vehicles/Maxim_Flanker.png b/megamek/data/images/units/vehicles/Maxim_Flanker.png new file mode 100644 index 00000000000..d308d820e7b Binary files /dev/null and b/megamek/data/images/units/vehicles/Maxim_Flanker.png differ diff --git a/megamek/data/images/units/vehicles/Maxim_I.png b/megamek/data/images/units/vehicles/Maxim_I.png index f8c2cfe2d01..e84044b90d9 100644 Binary files a/megamek/data/images/units/vehicles/Maxim_I.png and b/megamek/data/images/units/vehicles/Maxim_I.png differ diff --git a/megamek/data/images/units/vehicles/Maxim_SRM.png b/megamek/data/images/units/vehicles/Maxim_SRM.png index d2c2663b0c7..4e728445bf7 100644 Binary files a/megamek/data/images/units/vehicles/Maxim_SRM.png and b/megamek/data/images/units/vehicles/Maxim_SRM.png differ diff --git a/megamek/data/images/units/vehicles/Maxim_SRM4.png b/megamek/data/images/units/vehicles/Maxim_SRM4.png index 3155e84a031..a0d828693f5 100644 Binary files a/megamek/data/images/units/vehicles/Maxim_SRM4.png and b/megamek/data/images/units/vehicles/Maxim_SRM4.png differ diff --git a/megamek/data/images/units/vehicles/Patton.png b/megamek/data/images/units/vehicles/Patton.png index 1b024abdab2..76a7baa4dd1 100644 Binary files a/megamek/data/images/units/vehicles/Patton.png and b/megamek/data/images/units/vehicles/Patton.png differ diff --git a/megamek/data/images/units/vehicles/Patton_SB.png b/megamek/data/images/units/vehicles/Patton_SB.png new file mode 100644 index 00000000000..e1179683b03 Binary files /dev/null and b/megamek/data/images/units/vehicles/Patton_SB.png differ diff --git a/megamek/data/images/units/vehicles/Patton_Ultra.png b/megamek/data/images/units/vehicles/Patton_Ultra.png index 5b211123e88..94419b2641f 100644 Binary files a/megamek/data/images/units/vehicles/Patton_Ultra.png and b/megamek/data/images/units/vehicles/Patton_Ultra.png differ diff --git a/megamek/data/images/units/vehicles/Rommel.png b/megamek/data/images/units/vehicles/Rommel.png index 359ab60b463..1eac3f152ef 100644 Binary files a/megamek/data/images/units/vehicles/Rommel.png and b/megamek/data/images/units/vehicles/Rommel.png differ diff --git a/megamek/data/images/units/vehicles/Rommel_Gauss.png b/megamek/data/images/units/vehicles/Rommel_Gauss.png index 05c9a41e2b4..f652f8a39f7 100644 Binary files a/megamek/data/images/units/vehicles/Rommel_Gauss.png and b/megamek/data/images/units/vehicles/Rommel_Gauss.png differ diff --git a/megamek/data/images/units/vehicles/Rommel_Howitzer.png b/megamek/data/images/units/vehicles/Rommel_Howitzer.png index ade8a1e74a9..130e7bf8ca5 100644 Binary files a/megamek/data/images/units/vehicles/Rommel_Howitzer.png and b/megamek/data/images/units/vehicles/Rommel_Howitzer.png differ diff --git a/megamek/data/images/units/vehicles/Rommel_Sealed.png b/megamek/data/images/units/vehicles/Rommel_Sealed.png index d91effca680..8e4ab13851b 100644 Binary files a/megamek/data/images/units/vehicles/Rommel_Sealed.png and b/megamek/data/images/units/vehicles/Rommel_Sealed.png differ diff --git a/megamek/data/images/units/vehicles/Skulker.png b/megamek/data/images/units/vehicles/Skulker.png new file mode 100644 index 00000000000..c8c1443dbc2 Binary files /dev/null and b/megamek/data/images/units/vehicles/Skulker.png differ diff --git a/megamek/data/images/units/vehicles/SkulkerII.png b/megamek/data/images/units/vehicles/SkulkerII.png new file mode 100644 index 00000000000..80d3da003be Binary files /dev/null and b/megamek/data/images/units/vehicles/SkulkerII.png differ diff --git a/megamek/data/images/units/vehicles/Skulker_C3M.png b/megamek/data/images/units/vehicles/Skulker_C3M.png new file mode 100644 index 00000000000..19f7bd65542 Binary files /dev/null and b/megamek/data/images/units/vehicles/Skulker_C3M.png differ diff --git a/megamek/data/images/units/vehicles/Skulker_MG.png b/megamek/data/images/units/vehicles/Skulker_MG.png new file mode 100644 index 00000000000..b1f4f719054 Binary files /dev/null and b/megamek/data/images/units/vehicles/Skulker_MG.png differ diff --git a/megamek/data/images/units/vehicles/Skulker_SRM.png b/megamek/data/images/units/vehicles/Skulker_SRM.png new file mode 100644 index 00000000000..5005dba4ea4 Binary files /dev/null and b/megamek/data/images/units/vehicles/Skulker_SRM.png differ diff --git a/megamek/data/images/units/vehicles/Warrior.png b/megamek/data/images/units/vehicles/Warrior.png new file mode 100644 index 00000000000..e3515564caa Binary files /dev/null and b/megamek/data/images/units/vehicles/Warrior.png differ diff --git a/megamek/data/images/units/vehicles/Warrior_10.png b/megamek/data/images/units/vehicles/Warrior_10.png new file mode 100644 index 00000000000..2032a330786 Binary files /dev/null and b/megamek/data/images/units/vehicles/Warrior_10.png differ diff --git a/megamek/data/images/units/vehicles/Warrior_7A.png b/megamek/data/images/units/vehicles/Warrior_7A.png new file mode 100644 index 00000000000..3a1b6c53a22 Binary files /dev/null and b/megamek/data/images/units/vehicles/Warrior_7A.png differ diff --git a/megamek/data/images/units/vehicles/Warrior_7C.png b/megamek/data/images/units/vehicles/Warrior_7C.png new file mode 100644 index 00000000000..83f6f8a90c4 Binary files /dev/null and b/megamek/data/images/units/vehicles/Warrior_7C.png differ diff --git a/megamek/data/images/units/vehicles/Warrior_9.png b/megamek/data/images/units/vehicles/Warrior_9.png new file mode 100644 index 00000000000..2b15886c720 Binary files /dev/null and b/megamek/data/images/units/vehicles/Warrior_9.png differ diff --git a/megamek/data/images/units/vehicles/Warrior_S9.png b/megamek/data/images/units/vehicles/Warrior_S9.png new file mode 100644 index 00000000000..f6e711f90f0 Binary files /dev/null and b/megamek/data/images/units/vehicles/Warrior_S9.png differ diff --git a/megamek/data/images/units/vehicles/Whirlwind.png b/megamek/data/images/units/vehicles/Whirlwind.png new file mode 100644 index 00000000000..b7b1923bef6 Binary files /dev/null and b/megamek/data/images/units/vehicles/Whirlwind.png differ diff --git a/megamek/data/images/units/vehicles/rommel2.png b/megamek/data/images/units/vehicles/rommel2.png deleted file mode 100644 index 30f7de5d004..00000000000 Binary files a/megamek/data/images/units/vehicles/rommel2.png and /dev/null differ diff --git a/megamek/data/images/units/vehicles/skulker.png b/megamek/data/images/units/vehicles/skulker.png deleted file mode 100644 index 95e694cae54..00000000000 Binary files a/megamek/data/images/units/vehicles/skulker.png and /dev/null differ diff --git a/megamek/data/images/units/vehicles/skulkerii.png b/megamek/data/images/units/vehicles/skulkerii.png deleted file mode 100644 index 586889efe3c..00000000000 Binary files a/megamek/data/images/units/vehicles/skulkerii.png and /dev/null differ diff --git a/megamek/data/images/units/vehicles/warrior.png b/megamek/data/images/units/vehicles/warrior.png deleted file mode 100644 index 7451bbc02dd..00000000000 Binary files a/megamek/data/images/units/vehicles/warrior.png and /dev/null differ diff --git a/megamek/data/images/units/vehicles/warrior_10.png b/megamek/data/images/units/vehicles/warrior_10.png deleted file mode 100644 index 3c777b56e9b..00000000000 Binary files a/megamek/data/images/units/vehicles/warrior_10.png and /dev/null differ diff --git a/megamek/data/images/units/vehicles/warrior_7a.png b/megamek/data/images/units/vehicles/warrior_7a.png deleted file mode 100644 index d62b6254d15..00000000000 Binary files a/megamek/data/images/units/vehicles/warrior_7a.png and /dev/null differ diff --git a/megamek/data/images/units/vehicles/warrior_7c.png b/megamek/data/images/units/vehicles/warrior_7c.png deleted file mode 100644 index 5bca4e3139d..00000000000 Binary files a/megamek/data/images/units/vehicles/warrior_7c.png and /dev/null differ diff --git a/megamek/data/images/units/vehicles/warrior_9.png b/megamek/data/images/units/vehicles/warrior_9.png deleted file mode 100644 index d9a45f15c4a..00000000000 Binary files a/megamek/data/images/units/vehicles/warrior_9.png and /dev/null differ diff --git a/megamek/data/images/units/vehicles/warrior_s9.png b/megamek/data/images/units/vehicles/warrior_s9.png deleted file mode 100644 index 354d525f659..00000000000 Binary files a/megamek/data/images/units/vehicles/warrior_s9.png and /dev/null differ diff --git a/megamek/data/mechfiles/battlearmor/3058Uu/Fa Shih BA [Flamer] (Sqd4).blk b/megamek/data/mechfiles/battlearmor/3058Uu/Fa Shih BA [Flamer] (Sqd4).blk index 27bb8b658a2..c8e8cbfa678 100644 --- a/megamek/data/mechfiles/battlearmor/3058Uu/Fa Shih BA [Flamer] (Sqd4).blk +++ b/megamek/data/mechfiles/battlearmor/3058Uu/Fa Shih BA [Flamer] (Sqd4).blk @@ -58,28 +58,10 @@ BAAPMount:LA InfantryAssaultRifle:LA:APM BABasicManipulatorMineClearance:LA BABasicManipulatorMineClearance:RA +ISBAMineDispenser:LA +ISBAMineDispenser:RA - -Mine:Body -Mine:Body - - - -Mine:Body -Mine:Body - - - -Mine:Body -Mine:Body - - - -Mine:Body -Mine:Body - - IS Level 3 diff --git a/megamek/data/mechfiles/battlearmor/3058Uu/Fa Shih BA [Flamer] (Sqd5).blk b/megamek/data/mechfiles/battlearmor/3058Uu/Fa Shih BA [Flamer] (Sqd5).blk index fa2c6e76345..cc2783d143b 100644 --- a/megamek/data/mechfiles/battlearmor/3058Uu/Fa Shih BA [Flamer] (Sqd5).blk +++ b/megamek/data/mechfiles/battlearmor/3058Uu/Fa Shih BA [Flamer] (Sqd5).blk @@ -58,33 +58,10 @@ BAAPMount:LA InfantryAssaultRifle:LA:APM BABasicManipulatorMineClearance:LA BABasicManipulatorMineClearance:RA +ISBAMineDispenser:LA +ISBAMineDispenser:RA - -Mine:Body -Mine:Body - - - -Mine:Body -Mine:Body - - - -Mine:Body -Mine:Body - - - -Mine:Body -Mine:Body - - - -Mine:Body -Mine:Body - - IS Level 3 diff --git a/megamek/data/mechfiles/battlearmor/3058Uu/Fa Shih BA [Flamer] (Sqd6).blk b/megamek/data/mechfiles/battlearmor/3058Uu/Fa Shih BA [Flamer] (Sqd6).blk index 858a6ecbbe1..2841fddb7d9 100644 --- a/megamek/data/mechfiles/battlearmor/3058Uu/Fa Shih BA [Flamer] (Sqd6).blk +++ b/megamek/data/mechfiles/battlearmor/3058Uu/Fa Shih BA [Flamer] (Sqd6).blk @@ -58,38 +58,10 @@ BAAPMount:LA InfantryAssaultRifle:LA:APM BABasicManipulatorMineClearance:LA BABasicManipulatorMineClearance:RA +ISBAMineDispenser:LA +ISBAMineDispenser:RA - -Mine:Body -Mine:Body - - - -Mine:Body -Mine:Body - - - -Mine:Body -Mine:Body - - - -Mine:Body -Mine:Body - - - -Mine:Body -Mine:Body - - - -Mine:Body -Mine:Body - - IS Level 3 diff --git a/megamek/data/mechfiles/battlearmor/3058Uu/Fa Shih BA [LRR] (Sqd4).blk b/megamek/data/mechfiles/battlearmor/3058Uu/Fa Shih BA [LRR] (Sqd4).blk index 67f4770e6bf..b005ecba3ca 100644 --- a/megamek/data/mechfiles/battlearmor/3058Uu/Fa Shih BA [LRR] (Sqd4).blk +++ b/megamek/data/mechfiles/battlearmor/3058Uu/Fa Shih BA [LRR] (Sqd4).blk @@ -58,28 +58,10 @@ BAAPMount:LA InfantryAssaultRifle:LA:APM BABasicManipulatorMineClearance:LA BABasicManipulatorMineClearance:RA +ISBAMineDispenser:LA +ISBAMineDispenser:RA - -Mine:Body -Mine:Body - - - -Mine:Body -Mine:Body - - - -Mine:Body -Mine:Body - - - -Mine:Body -Mine:Body - - IS Level 3 diff --git a/megamek/data/mechfiles/battlearmor/3058Uu/Fa Shih BA [LRR] (Sqd5).blk b/megamek/data/mechfiles/battlearmor/3058Uu/Fa Shih BA [LRR] (Sqd5).blk index 40be2c2722c..6129e4edf75 100644 --- a/megamek/data/mechfiles/battlearmor/3058Uu/Fa Shih BA [LRR] (Sqd5).blk +++ b/megamek/data/mechfiles/battlearmor/3058Uu/Fa Shih BA [LRR] (Sqd5).blk @@ -58,33 +58,10 @@ BAAPMount:LA InfantryAssaultRifle:LA:APM BABasicManipulatorMineClearance:LA BABasicManipulatorMineClearance:RA +ISBAMineDispenser:LA +ISBAMineDispenser:RA - -Mine:Body -Mine:Body - - - -Mine:Body -Mine:Body - - - -Mine:Body -Mine:Body - - - -Mine:Body -Mine:Body - - - -Mine:Body -Mine:Body - - IS Level 3 diff --git a/megamek/data/mechfiles/battlearmor/3058Uu/Fa Shih BA [LRR] (Sqd6).blk b/megamek/data/mechfiles/battlearmor/3058Uu/Fa Shih BA [LRR] (Sqd6).blk index 235faf762a8..bd80757282c 100644 --- a/megamek/data/mechfiles/battlearmor/3058Uu/Fa Shih BA [LRR] (Sqd6).blk +++ b/megamek/data/mechfiles/battlearmor/3058Uu/Fa Shih BA [LRR] (Sqd6).blk @@ -58,38 +58,10 @@ BAAPMount:LA InfantryAssaultRifle:LA:APM BABasicManipulatorMineClearance:LA BABasicManipulatorMineClearance:RA +ISBAMineDispenser:LA +ISBAMineDispenser:RA - -Mine:Body -Mine:Body - - - -Mine:Body -Mine:Body - - - -Mine:Body -Mine:Body - - - -Mine:Body -Mine:Body - - - -Mine:Body -Mine:Body - - - -Mine:Body -Mine:Body - - IS Level 3 diff --git a/megamek/data/mechfiles/battlearmor/3058Uu/Fa Shih BA [Laser] (Sqd4).blk b/megamek/data/mechfiles/battlearmor/3058Uu/Fa Shih BA [Laser] (Sqd4).blk index 0a4f727dc94..8b80a5e9ae1 100644 --- a/megamek/data/mechfiles/battlearmor/3058Uu/Fa Shih BA [Laser] (Sqd4).blk +++ b/megamek/data/mechfiles/battlearmor/3058Uu/Fa Shih BA [Laser] (Sqd4).blk @@ -58,28 +58,10 @@ BAAPMount:LA InfantryAssaultRifle:LA:APM BABasicManipulatorMineClearance:LA BABasicManipulatorMineClearance:RA +ISBAMineDispenser:LA +ISBAMineDispenser:RA - -Mine:Body -Mine:Body - - - -Mine:Body -Mine:Body - - - -Mine:Body -Mine:Body - - - -Mine:Body -Mine:Body - - IS Level 3 diff --git a/megamek/data/mechfiles/battlearmor/3058Uu/Fa Shih BA [Laser] (Sqd5).blk b/megamek/data/mechfiles/battlearmor/3058Uu/Fa Shih BA [Laser] (Sqd5).blk index 8451301792a..5b667bdbd3a 100644 --- a/megamek/data/mechfiles/battlearmor/3058Uu/Fa Shih BA [Laser] (Sqd5).blk +++ b/megamek/data/mechfiles/battlearmor/3058Uu/Fa Shih BA [Laser] (Sqd5).blk @@ -58,33 +58,10 @@ BAAPMount:LA InfantryAssaultRifle:LA:APM BABasicManipulatorMineClearance:LA BABasicManipulatorMineClearance:RA +ISBAMineDispenser:LA +ISBAMineDispenser:RA - -Mine:Body -Mine:Body - - - -Mine:Body -Mine:Body - - - -Mine:Body -Mine:Body - - - -Mine:Body -Mine:Body - - - -Mine:Body -Mine:Body - - IS Level 3 diff --git a/megamek/data/mechfiles/battlearmor/3058Uu/Fa Shih BA [Laser] (Sqd6).blk b/megamek/data/mechfiles/battlearmor/3058Uu/Fa Shih BA [Laser] (Sqd6).blk index 9c0a0ee3304..93c76cd7195 100644 --- a/megamek/data/mechfiles/battlearmor/3058Uu/Fa Shih BA [Laser] (Sqd6).blk +++ b/megamek/data/mechfiles/battlearmor/3058Uu/Fa Shih BA [Laser] (Sqd6).blk @@ -58,38 +58,10 @@ BAAPMount:LA InfantryAssaultRifle:LA:APM BABasicManipulatorMineClearance:LA BABasicManipulatorMineClearance:RA +ISBAMineDispenser:LA +ISBAMineDispenser:RA - -Mine:Body -Mine:Body - - - -Mine:Body -Mine:Body - - - -Mine:Body -Mine:Body - - - -Mine:Body -Mine:Body - - - -Mine:Body -Mine:Body - - - -Mine:Body -Mine:Body - - IS Level 3 diff --git a/megamek/data/mechfiles/battlearmor/3058Uu/Fa Shih BA [MG] (Sqd4).blk b/megamek/data/mechfiles/battlearmor/3058Uu/Fa Shih BA [MG] (Sqd4).blk index 7eb0f7f1cad..779860e892b 100644 --- a/megamek/data/mechfiles/battlearmor/3058Uu/Fa Shih BA [MG] (Sqd4).blk +++ b/megamek/data/mechfiles/battlearmor/3058Uu/Fa Shih BA [MG] (Sqd4).blk @@ -58,28 +58,10 @@ BAAPMount:LA InfantryAssaultRifle:LA:APM BABasicManipulatorMineClearance:LA BABasicManipulatorMineClearance:RA +ISBAMineDispenser:LA +ISBAMineDispenser:RA - -Mine:Body -Mine:Body - - - -Mine:Body -Mine:Body - - - -Mine:Body -Mine:Body - - - -Mine:Body -Mine:Body - - IS Level 3 diff --git a/megamek/data/mechfiles/battlearmor/3058Uu/Fa Shih BA [MG] (Sqd5).blk b/megamek/data/mechfiles/battlearmor/3058Uu/Fa Shih BA [MG] (Sqd5).blk index 07a511f6f7c..198a61081b5 100644 --- a/megamek/data/mechfiles/battlearmor/3058Uu/Fa Shih BA [MG] (Sqd5).blk +++ b/megamek/data/mechfiles/battlearmor/3058Uu/Fa Shih BA [MG] (Sqd5).blk @@ -58,33 +58,10 @@ BAAPMount:LA InfantryAssaultRifle:LA:APM BABasicManipulatorMineClearance:LA BABasicManipulatorMineClearance:RA +ISBAMineDispenser:LA +ISBAMineDispenser:RA - -Mine:Body -Mine:Body - - - -Mine:Body -Mine:Body - - - -Mine:Body -Mine:Body - - - -Mine:Body -Mine:Body - - - -Mine:Body -Mine:Body - - IS Level 3 diff --git a/megamek/data/mechfiles/battlearmor/3058Uu/Fa Shih BA [MG] (Sqd6).blk b/megamek/data/mechfiles/battlearmor/3058Uu/Fa Shih BA [MG] (Sqd6).blk index b0f89065b5d..b9c31f3d5f8 100644 --- a/megamek/data/mechfiles/battlearmor/3058Uu/Fa Shih BA [MG] (Sqd6).blk +++ b/megamek/data/mechfiles/battlearmor/3058Uu/Fa Shih BA [MG] (Sqd6).blk @@ -58,33 +58,10 @@ BAAPMount:LA InfantryAssaultRifle:LA:APM BABasicManipulatorMineClearance:LA BABasicManipulatorMineClearance:RA +ISBAMineDispenser:LA +ISBAMineDispenser:RA - -Mine:Body -Mine:Body - - - -Mine:Body -Mine:Body - - - -Mine:Body -Mine:Body - - - -Mine:Body -Mine:Body - - - -Mine:Body -Mine:Body - - Mine:Body Mine:Body diff --git a/megamek/data/mechfiles/battlearmor/3058Uu/Fa Shih BA [TAG] (Sqd4).blk b/megamek/data/mechfiles/battlearmor/3058Uu/Fa Shih BA [TAG] (Sqd4).blk index b38d2a50fec..4aa34f1d562 100644 --- a/megamek/data/mechfiles/battlearmor/3058Uu/Fa Shih BA [TAG] (Sqd4).blk +++ b/megamek/data/mechfiles/battlearmor/3058Uu/Fa Shih BA [TAG] (Sqd4).blk @@ -58,28 +58,10 @@ BAAPMount:LA InfantryAssaultRifle:LA:APM BABasicManipulatorMineClearance:LA BABasicManipulatorMineClearance:RA +ISBAMineDispenser:LA +ISBAMineDispenser:RA - -Mine:Body -Mine:Body - - - -Mine:Body -Mine:Body - - - -Mine:Body -Mine:Body - - - -Mine:Body -Mine:Body - - IS Level 3 diff --git a/megamek/data/mechfiles/battlearmor/3058Uu/Fa Shih BA [TAG] (Sqd5).blk b/megamek/data/mechfiles/battlearmor/3058Uu/Fa Shih BA [TAG] (Sqd5).blk index 6fe85d6b442..864e5721c88 100644 --- a/megamek/data/mechfiles/battlearmor/3058Uu/Fa Shih BA [TAG] (Sqd5).blk +++ b/megamek/data/mechfiles/battlearmor/3058Uu/Fa Shih BA [TAG] (Sqd5).blk @@ -58,33 +58,10 @@ BAAPMount:LA InfantryAssaultRifle:LA:APM BABasicManipulatorMineClearance:LA BABasicManipulatorMineClearance:RA +ISBAMineDispenser:LA +ISBAMineDispenser:RA - -Mine:Body -Mine:Body - - - -Mine:Body -Mine:Body - - - -Mine:Body -Mine:Body - - - -Mine:Body -Mine:Body - - - -Mine:Body -Mine:Body - - IS Level 3 diff --git a/megamek/data/mechfiles/battlearmor/3058Uu/Fa Shih BA [TAG] (Sqd6).blk b/megamek/data/mechfiles/battlearmor/3058Uu/Fa Shih BA [TAG] (Sqd6).blk index 65e1f556280..a7c4da72d00 100644 --- a/megamek/data/mechfiles/battlearmor/3058Uu/Fa Shih BA [TAG] (Sqd6).blk +++ b/megamek/data/mechfiles/battlearmor/3058Uu/Fa Shih BA [TAG] (Sqd6).blk @@ -58,38 +58,10 @@ BAAPMount:LA InfantryAssaultRifle:LA:APM BABasicManipulatorMineClearance:LA BABasicManipulatorMineClearance:RA +ISBAMineDispenser:LA +ISBAMineDispenser:RA - -Mine:Body -Mine:Body - - - -Mine:Body -Mine:Body - - - -Mine:Body -Mine:Body - - - -Mine:Body -Mine:Body - - - -Mine:Body -Mine:Body - - - -Mine:Body -Mine:Body - - IS Level 3 diff --git a/megamek/data/mechfiles/battlearmor/Fa Shih Battle Armor [Flamer](Test).blk b/megamek/data/mechfiles/battlearmor/Fa Shih Battle Armor [Flamer](Test).blk new file mode 100644 index 00000000000..aa22510a5c1 --- /dev/null +++ b/megamek/data/mechfiles/battlearmor/Fa Shih Battle Armor [Flamer](Test).blk @@ -0,0 +1,141 @@ +#building block data file + +1 + + +##Write the version number just in case... + +MAM0 + + + +BattleArmor + + + +Fa Shih Battle Armor + + + +[Flamer](Test) + + + +1014 + + + +3062 + + + +3062 + + + +IS Level 3 + + + +Jump + + + + + + +1 + + + +28 + + + +3 + + + +CLBAFlamer:RA +BA-Magnetic Clamp:Body +BAAPMount:LA +InfantryAssaultRifle:APM:LA +BABasicManipulatorMineClearance:LA +BABasicManipulatorMineClearance:RA +SwarmMek +SwarmWeaponMek +StopSwarm +LegAttack +ISBAMineDispenser:LA +ISBAMineDispenser:RA + + + + + + + + + + + + + + + +The Fa Shih duplicates many of the features of the Inner Sphere Standard battle armor, including its jump capacity and most of the weaponry used. However the suit went against battle armor philosophy at the time by emphasizing defensive capabilities as much as offensive. The most notable expression of this philosophy is its use of mines. The Capellans have long used mines in combat, so the Fa Shih comes equipped with the ability to lay minefields similar in respect to FASCAM ordnance as well as mine clearing apparatuses on its arms. In keeping with the Xin Sheng campaign instituted by Chancellor Sun-Tzu Liao, the Fa Shih's armoring was also modeled along traditional Chinese aesthetic lines. + + + +The Fa Shih ("Master of Methods") was the result of the Capellan Confederation biting off more than it could chew. + + + +The Fa Shih carries a Modular Weapon Mount in its right arm that can house a Flamer, Machine Gun, Small Laser, Light Recoilless Rifle, or a Light TAG to spot for Arrow IV Artillery or Semi-Guided LRMs. An Anti-Personnel Weapon Mount in the left arm allows the Fa Shih to carry lighter weaponry suitable for taking on infantry. Like the Inner Sphere Standard the Fa Shih is equipped with jump jets to make leaps of up to 90 meters at a time and can engage in anti-BattleMech attacks. Although they weren't able to incorporate their new stealth armor technology into the design, the Capellans were still able to mount 350kg of standard armor on the Fa Shih, providing above-average protection for a suit of its size and the ability to absorb a hit from a Clan ER Medium Laser while still keeping the pilot alive. As a minelayer, though, the Fa Shih's most important feature is its Mine Dispenser. Carried on the back of the suit, the dispenser is equipped with two canisters which, when deployed in mid-jump, can cover several hundred square meters of terrain with mines. In addition to laying mines, the Fa Shih can also safely remove them with the addition of Mine Clearance Equipment to its basic manipulators. Another beneficial attribute of the Fa Shih, is that it is equipped with Magnetic Clamps located on the knees and underarms. These magnetic clamps allow the Fa Shih trooper to ride into battle on standard vehicles and 'Mechs in a similar manner to how other battle armors can hitch a ride on OmniMechs. This feature was considered a necessity due to the fact that the Confederation had only a single OmniMech design of their own at the time, the Men Shen. **To lay the "Mines" you need to use the "Lay Mine" then "Jump" to deploy the minefield.** + + + +With the introduction of Battle Armor by the Clans and as other Inner Sphere powers began fielding their own native suits, the Confederation had decided to produce three different battle armor designs concurrently. Research and development began in April 3056, but since they did not have any practical experience with battle armor, they realized they could not take on such a large task and reduced their workload to one unit, an adaptation of the Inner Sphere Standard. Even so, it took several years and finally the help of the Word of Blake before the Capellans could properly implement the environmental containment and life support systems for their suit and begin final testing in 3060. Finalized prototypes became available starting in June 3061, with full-scale production starting March 3062. The Fa Shih quickly built a reputation for excellence among the Capellan armed forces; although the Confederation eventually succeeded in its original design goal when the Trinity series of battle armor debuted, the Fa Shih continued to serve for many years on the battlefield. During the Jihad the Capellan Confederation received a boon as the appearance of Clan forces on their borders allowed for the firsthand acquisition of Clan technology. Using Clan components Ceres Metals refitted several Fa Shih suits in 3078 to better match the Ying Long Trinity suit's capabilities and improve their anti-BattleMech potential. While successful, any further development of these improved Fa Shih suits at the time was stopped until the Confederation could either secure a steady supply of Clan technology or reverse engineer it themselves.[ + + + +Ceres Metals Industries + + + +Capella + + + +CHASSIS:Unknown +ENGINE:Unknown +ARMOR:Unknown +JUMPJET:Unknown +COMMUNICATIONS:Unknown +TARGETING:Unknown + + + +TRO 3058U - Civil War + + + +biped + + + +3 + + + +7 + + + +4 + + + +2 + + diff --git a/megamek/data/mechfiles/battlearmor/XTRs/Liao/Fa Shih BA 2 [MG] (Sqd4).blk b/megamek/data/mechfiles/battlearmor/XTRs/Liao/Fa Shih BA 2 [MG] (Sqd4).blk index dec83e73fc5..53cc4c58350 100644 --- a/megamek/data/mechfiles/battlearmor/XTRs/Liao/Fa Shih BA 2 [MG] (Sqd4).blk +++ b/megamek/data/mechfiles/battlearmor/XTRs/Liao/Fa Shih BA 2 [MG] (Sqd4).blk @@ -54,28 +54,10 @@ BA-Magnetic Clamp:LA BABasicManipulatorMineClearance:LA BABasicManipulatorMineClearance:RA CLBAMyomerBooster:Body +ISBAMineDispenser:LA +ISBAMineDispenser:RA - -Mine:RA -Mine:RA - - - -Mine:RA -Mine:RA - - - -Mine:RA -Mine:RA - - - -Mine:RA -Mine:RA - - XTRO Liao - Jihad diff --git a/megamek/data/mechfiles/battlearmor/XTRs/Liao/Fa Shih BA 2 [MG] (Sqd5).blk b/megamek/data/mechfiles/battlearmor/XTRs/Liao/Fa Shih BA 2 [MG] (Sqd5).blk index 02d4911e3bd..df60561cf77 100644 --- a/megamek/data/mechfiles/battlearmor/XTRs/Liao/Fa Shih BA 2 [MG] (Sqd5).blk +++ b/megamek/data/mechfiles/battlearmor/XTRs/Liao/Fa Shih BA 2 [MG] (Sqd5).blk @@ -54,33 +54,10 @@ BA-Magnetic Clamp:LA BABasicManipulatorMineClearance:LA BABasicManipulatorMineClearance:RA CLBAMyomerBooster:Body +ISBAMineDispenser:LA +ISBAMineDispenser:RA - -Mine:RA -Mine:RA - - - -Mine:RA -Mine:RA - - - -Mine:RA -Mine:RA - - - -Mine:RA -Mine:RA - - - -Mine:RA -Mine:RA - - XTRO Liao - Jihad diff --git a/megamek/data/mechfiles/battlearmor/XTRs/Liao/Fa Shih BA 2 [MG] (Sqd6).blk b/megamek/data/mechfiles/battlearmor/XTRs/Liao/Fa Shih BA 2 [MG] (Sqd6).blk index ef0340d6f89..302d325faa0 100644 --- a/megamek/data/mechfiles/battlearmor/XTRs/Liao/Fa Shih BA 2 [MG] (Sqd6).blk +++ b/megamek/data/mechfiles/battlearmor/XTRs/Liao/Fa Shih BA 2 [MG] (Sqd6).blk @@ -54,36 +54,26 @@ BA-Magnetic Clamp:LA BABasicManipulatorMineClearance:LA BABasicManipulatorMineClearance:RA CLBAMyomerBooster:Body +ISBAMineDispenser:LA +ISBAMineDispenser:RA -Mine:RA -Mine:RA -Mine:RA -Mine:RA -Mine:RA -Mine:RA -Mine:RA -Mine:RA -Mine:RA -Mine:RA -Mine:RA -Mine:RA diff --git a/megamek/data/mechfiles/fighters/Operation Klondike/Stuka STU-K5b.blk b/megamek/data/mechfiles/fighters/Operation Klondike/Stuka STU-K5b.blk index c873f0c731e..27b020681a1 100644 --- a/megamek/data/mechfiles/fighters/Operation Klondike/Stuka STU-K5b.blk +++ b/megamek/data/mechfiles/fighters/Operation Klondike/Stuka STU-K5b.blk @@ -17,7 +17,7 @@ Stuka -STU-K5b2 +STU-K5b @@ -88,13 +88,13 @@ Medium Laser -PPC -PPC +ISERPPC +ISERPPC -PPC -PPC +ISERPPC +ISERPPC diff --git a/megamek/data/mechfiles/fighters/Operation Klondike/Stuka STU-K5b2.blk b/megamek/data/mechfiles/fighters/Operation Klondike/Stuka STU-K5b2.blk index 728aed97e7d..9ea71b2ac32 100644 --- a/megamek/data/mechfiles/fighters/Operation Klondike/Stuka STU-K5b2.blk +++ b/megamek/data/mechfiles/fighters/Operation Klondike/Stuka STU-K5b2.blk @@ -88,13 +88,13 @@ Medium Laser -ISERPPC -ISERPPC +PPC +PPC -ISERPPC -ISERPPC +PPC +PPC diff --git a/megamek/data/mechfiles/fighters/TRO3075/Sabre SB-28.blk b/megamek/data/mechfiles/fighters/TRO3075/Sabre SB-28.blk index 0d160756b59..98bee59bbdd 100644 --- a/megamek/data/mechfiles/fighters/TRO3075/Sabre SB-28.blk +++ b/megamek/data/mechfiles/fighters/TRO3075/Sabre SB-28.blk @@ -3,7 +3,7 @@ 1 -# Write the version number just in case... +##Write the version number just in case... MAM0 @@ -56,7 +56,7 @@ Aerodyne -0 +1 @@ -103,14 +103,6 @@ Medium Laser - -TRO 3075 - Star League - - - -25.0 - - While extremely short-ranged when first developed, the Sabre was well-regarded for its exceptional speed and maneuverability. The original manufacturer, Raimei, continued to upgrade the fighter as technology advanced; the final version produced by Raimei was the SB-27 model which featured a Nissan 225 Fusion Engine, double the fuel capacity of the previous model and replace the previous primitive armor with four tons of BattleMech grade armor, giving the same protection for less weight. @@ -142,3 +134,12 @@ ARMOR:Nimakachi Type 3 Ferro-Aluminum COMMUNICATIONS:BipStar 49-G TARGETING:Ki-II TTS + + +TRO 3075 - Star League + + + +25.0 + + diff --git a/megamek/data/mechfiles/mechs/3039u/Hermes HER-1A.mtf b/megamek/data/mechfiles/mechs/3039u/Hermes HER-1A.mtf index a7a566e4c14..966e24bfdc9 100644 --- a/megamek/data/mechfiles/mechs/3039u/Hermes HER-1A.mtf +++ b/megamek/data/mechfiles/mechs/3039u/Hermes HER-1A.mtf @@ -149,9 +149,9 @@ Foot Actuator -Empty- -Overview: The Star League, showing its industrial and economic might, commissioned a new dedicated scout in 2632. Irian BattleMechs Unlimited won the contract, and was able to fulfill initial orders for this new Hermes quicker then anticipated. This caused concern in the SLDF's Quartermaster Command despite the 'Mech apparently meeting all requirements. These suspicions were quickly confirmed, as many 'Mechs in the initial run had unresolved issues with their electronics that made their targeting systems all but useless. While these problems were eventually rectified, the time needed for the fix was not insignificant, and the 'Mech would develop a negative reputation that would follow it during the remainder of the Star League era. +Overview: The Star League, showing its industrial and economic might, commissioned a new dedicated scout in 2632. Irian BattleMechs Unlimited won the contract, and was able to fulfill initial orders for this new Hermes quicker then anticipated. This caused concern in the SLDF's Quartermaster Command despite the 'Mech apparently meeting all requirements. These suspicions were quickly confirmed, as many 'Mechs in the initial run had unresolved issues with their electronics that made their targeting systems all but useless. While these problems were eventually rectified, the time needed for the fix was not insignificant, and the 'Mech would develop a negative reputation that would follow it during the remainder of the Star League era. -Capabilities: Emphasizing mobility over firepower, the Hermes was fasther than nearly every 'Mech in service at the time of its introduction. Once the glitches surrounding the targeting systems were fixed, the Alexis Photon proved popular with technicians as it reduced wear and tear on the laser systems. The initial production variant used a fuel-based flamer instead of the more modern version that would tap directlyl into a 'Mech's fusion plant. Considered to be quite safe, MechWarriors piloting Hermes could even choose to jettison the fuel storage cylinders if needed. +Capabilities: Emphasizing mobility over firepower, the Hermes was faster than nearly every 'Mech in service at the time of its introduction. Once the glitches surrounding the targeting systems were fixed, the Alexis Photon proved popular with technicians as it reduced wear and tear on the laser systems. The initial production variant used a fuel-based flamer instead of the more modern version that would tap directlyl into a 'Mech's fusion plant. Considered to be quite safe, MechWarriors piloting Hermes could even choose to jettison the fuel storage cylinders if needed. Deployment: The Hermes only served in the SLDF for 19 years, after which they were put in storage or relegated to militia commands. The Succession Wars forced the Hermes back into frontline regiments through sheer need, though Irian chose to re-engineered the 'Mech in the heavier Hermes II instead of putting the base chassis back into production. Instead, Irian would refit existing Hermes chassises into the downgraded HER-1A variant as the Successor Wars spurred technological decline. Only seeing service in the Free Worlds League military, the variant would rapidly vanish after the rediscovery of advanced technology in the Helm Core. diff --git a/megamek/data/mechfiles/mechs/3039u/Hermes HER-1B.mtf b/megamek/data/mechfiles/mechs/3039u/Hermes HER-1B.mtf index c95fcb294c1..c669dee8295 100644 --- a/megamek/data/mechfiles/mechs/3039u/Hermes HER-1B.mtf +++ b/megamek/data/mechfiles/mechs/3039u/Hermes HER-1B.mtf @@ -149,9 +149,9 @@ Foot Actuator -Empty- -Overview: The Star League, showing its industrial and economic might, commissioned a new dedicated scout in 2632. Irian BattleMechs Unlimited won the contract, and was able to fulfill initial orders for this new Hermes quicker then anticipated. This caused concern in the SLDF's Quartermaster Command despite the 'Mech apparently meeting all requirements. These suspicions were quickly confirmed, as many 'Mechs in the initial run had unresolved issues with their electronics that made their targeting systems all but useless. While these problems were eventually rectified, the time needed for the fix was not insignificant, and the 'Mech would develop a negative reputation that would follow it during the remainder of the Star League era. +Overview: The Star League, showing its industrial and economic might, commissioned a new dedicated scout in 2632. Irian BattleMechs Unlimited won the contract, and was able to fulfill initial orders for this new Hermes quicker then anticipated. This caused concern in the SLDF's Quartermaster Command despite the 'Mech apparently meeting all requirements. These suspicions were quickly confirmed, as many 'Mechs in the initial run had unresolved issues with their electronics that made their targeting systems all but useless. While these problems were eventually rectified, the time needed for the fix was not insignificant, and the 'Mech would develop a negative reputation that would follow it during the remainder of the Star League era. -Capabilities: Emphasizing mobility over firepower, the Hermes was fasther than nearly every 'Mech in service at the time of its introduction. Once the glitches surrounding the targeting systems were fixed, the Alexis Photon proved popular with technicians as it reduced wear and tear on the laser systems. The initial production variant used a fuel-based flamer instead of the more modern version that would tap directlyl into a 'Mech's fusion plant. Considered to be quite safe, MechWarriors piloting Hermes could even choose to jettison the fuel storage cylinders if needed. +Capabilities: Emphasizing mobility over firepower, the Hermes was faster than nearly every 'Mech in service at the time of its introduction. Once the glitches surrounding the targeting systems were fixed, the Alexis Photon proved popular with technicians as it reduced wear and tear on the laser systems. The initial production variant used a fuel-based flamer instead of the more modern version that would tap directlyl into a 'Mech's fusion plant. Considered to be quite safe, MechWarriors piloting Hermes could even choose to jettison the fuel storage cylinders if needed. Deployment: The Hermes only served in the SLDF for 19 years, after which they were put in storage or relegated to militia commands. The Succession Wars forced the Hermes back into frontline regiments through sheer need, though Irian chose to re-engineered the 'Mech in the heavier Hermes II instead of putting the base chassis back into production. Instead, Irian would refit existing Hermes chassises into downgraded variants as the Successor Wars spurred technological decline. The HER-1B would be a minor shoot-off of the main downgrade, slightly increasing the 'Mech's firepower. Only seeing service in the Free Worlds League military, the variant would rapidly vanish after the rediscovery of advanced technology in the Helm Core. diff --git a/megamek/data/mechfiles/mechs/3050U/Caesar CES-3R Archangel.mtf b/megamek/data/mechfiles/mechs/3050U/Caesar CES-3R Archangel.mtf index e11e074810c..d5822f92880 100644 --- a/megamek/data/mechfiles/mechs/3050U/Caesar CES-3R Archangel.mtf +++ b/megamek/data/mechfiles/mechs/3050U/Caesar CES-3R Archangel.mtf @@ -1,22 +1,19 @@ -Version:1.0 +Version:1.3 Caesar CES-3R 'Archangel' mul id:3883 - Config:Biped techbase:Mixed (IS Chassis) era:3057 source:TRO 3050 - Clan Invasion -rules level:4 +rules level:3 mass:70 engine:280 XL Engine(IS) structure:IS Standard myomer:Standard -heat sinks:17 Double -nocrit:Standard:None -nocrit:Standard:None +heat sinks:17 IS Double walk mp:4 jump mp:0 @@ -154,4 +151,18 @@ Foot Actuator -Empty- -Empty- +overview:Originally a reverse engineered version of the Capellan Confederation's Cataphract intended to mask development of the Federated Commonwealth's fearsome Axman, the Caesar would turn out to be a good but not great BattleMech in its own right. + +capabilities:The Caesar was built to do as much damage to an enemy at as great a stand-off range as possible. The 'Mech therefore carries primarily long-ranged armament. The 'Mech also uses an 280-rated XL engine and sixteen double heat sinks, both of which save significant amounts of weight, in order to carry as many weapons and as much armor as possible. The 'Mech utilizes CASE to protect against ammunition explosions should an enemy be able to breach the ten and a half tons of armor that protect it. + +deployment:The personal 'Mech of Marcus GioAvanti, commander of Avanti's Angels, all of Archangel's weapons are upgraded to Clantech equivalents except the rear pulse lasers, the right arm medium pulse laser is moved to the left arm and an extra Clan medium pulse laser added to the center torso. The resulting weight and space saved allowed the mounting of an extra double heat sink as well as additional ton of armor. + +history:Supposedly the sole design intended to come out of Johnston Industries' then-new 'Mech lines on New Syrtis, the Caesar received notable public attention in an attempt to distract from development of the Axman. The finished 'Mech surprisingly enough proved to be a high-quality design itself. Though never attracting great sales, the Caesar would prove to be relatively popular in the Capellan March, among Lyran units on the Clan front, and with both FedCom-employed mercenaries and the Com Guards. Johnston attempted to redress its mediocre sales in the wake of the FedCom Civil War, developing two new variants intended to focus specifically on the qualities desired by the Lyran Alliance and Federated Suns. The resulting upswing in sales saw the Caesar in increasing use among those opposing the Word of Blake during the Jihad, with the LAAF in particular adopting the design almost as a means of honoring the assassinated Caesar Steiner. +manufacturer:Johnston Industries +primaryfactory:New Syrtis +systemmanufacturer:CHASSIS:Dorwinion CES Standard +systemmanufacturer:ENGINE:GM 280 Extralight +systemmanufacturer:ARMOR:Kallon Royalstar with CASE +systemmanufacturer:COMMUNICATIONS:Johnston Wide Band +systemmanufacturer:TARGETING:Randar Pinpoint-HY diff --git a/megamek/data/mechfiles/mechs/3050U/Caesar CES-3R Gertrude.mtf b/megamek/data/mechfiles/mechs/3050U/Caesar CES-3R Gertrude.mtf index d977aab9de7..5952b86106d 100644 --- a/megamek/data/mechfiles/mechs/3050U/Caesar CES-3R Gertrude.mtf +++ b/megamek/data/mechfiles/mechs/3050U/Caesar CES-3R Gertrude.mtf @@ -151,3 +151,19 @@ Foot Actuator -Empty- -Empty- -Empty- + +overview:Originally a reverse engineered version of the Capellan Confederation's Cataphract intended to mask development of the Federated Commonwealth's fearsome Axman, the Caesar would turn out to be a good but not great BattleMech in its own right. + +capabilities:The Caesar was built to do as much damage to an enemy at as great a stand-off range as possible. The 'Mech therefore carries primarily long-ranged armament. The 'Mech also uses an 280-rated XL engine and sixteen double heat sinks, both of which save significant amounts of weight, in order to carry as many weapons and as much armor as possible. The 'Mech utilizes CASE to protect against ammunition explosions should an enemy be able to breach the ten and a half tons of armor that protect it. + +deployment:The personal 'Mech of Lt. Hannah McQuarters of the 1st Kestrel Grenadiers, all of Gertrude's medium pulse lasers were removed and replaced with eight forward facing ER medium lasers, two in each arm, two in the center torso, and one in both left and right torsos. + +history:Supposedly the sole design intended to come out of Johnston Industries' then-new 'Mech lines on New Syrtis, the Caesar received notable public attention in an attempt to distract from development of the Axman. The finished 'Mech surprisingly enough proved to be a high-quality design itself. Though never attracting great sales, the Caesar would prove to be relatively popular in the Capellan March, among Lyran units on the Clan front, and with both FedCom-employed mercenaries and the Com Guards. Johnston attempted to redress its mediocre sales in the wake of the FedCom Civil War, developing two new variants intended to focus specifically on the qualities desired by the Lyran Alliance and Federated Suns. The resulting upswing in sales saw the Caesar in increasing use among those opposing the Word of Blake during the Jihad, with the LAAF in particular adopting the design almost as a means of honoring the assassinated Caesar Steiner. + +manufacturer:Johnston Industries +primaryfactory:New Syrtis +systemmanufacturer:CHASSIS:Dorwinion CES Standard +systemmanufacturer:ENGINE:GM 280 Extralight +systemmanufacturer:ARMOR:Kallon Royalstar with CASE +systemmanufacturer:COMMUNICATIONS:Johnston Wide Band +systemmanufacturer:TARGETING:Randar Pinpoint-HY \ No newline at end of file diff --git a/megamek/data/mechfiles/mechs/3050U/Caesar CES-3R.mtf b/megamek/data/mechfiles/mechs/3050U/Caesar CES-3R.mtf index 3393f448424..06f45fcba7e 100644 --- a/megamek/data/mechfiles/mechs/3050U/Caesar CES-3R.mtf +++ b/megamek/data/mechfiles/mechs/3050U/Caesar CES-3R.mtf @@ -1,55 +1,54 @@ -Version:1.0 +Version:1.3 Caesar CES-3R mul id:455 - Config:Biped -TechBase:Inner Sphere -Era:3049 -Source:TRO 3050 - Clan Invasion -Rules Level:2 - -Mass:70 -Engine:280 XL Engine -Structure:Standard -Myomer:Standard - -Heat Sinks:16 Double -Walk MP:4 -Jump MP:0 - -Armor:Standard Armor -LA Armor:21 -RA Armor:21 -LT Armor:15 -RT Armor:15 -CT Armor:26 -HD Armor:9 -LL Armor:21 -RL Armor:21 -RTL Armor:6 -RTR Armor:6 -RTC Armor:7 +techbase:Inner Sphere +era:3049 +source:TRO 3050 - Clan Invasion +rules level:2 + +mass:70 +engine:280 XL Engine(IS) +structure:IS Standard +myomer:Standard + +heat sinks:16 IS Double +walk mp:4 +jump mp:0 + +armor:Standard(Inner Sphere) +LA armor:21 +RA armor:21 +LT armor:15 +RT armor:15 +CT armor:26 +HD armor:9 +LL armor:21 +RL armor:21 +RTL armor:6 +RTR armor:6 +RTC armor:7 Weapons:6 -1 ISGaussRifle, Right Torso, Ammo:16 -1 ISERPPC, Right Arm -1 ISMediumPulseLaser, Right Arm -1 ISMediumPulseLaser, Left Arm -1 ISMediumPulseLaser, Right Torso (R) -1 ISMediumPulseLaser, Left Torso (R) +Medium Pulse Laser, Left Arm +ER PPC, Right Arm +Medium Pulse Laser, Right Arm +Medium Pulse Laser, Left Torso +Gauss Rifle, Right Torso +Medium Pulse Laser, Right Torso Left Arm: Shoulder Upper Arm Actuator Lower Arm Actuator Hand Actuator -ISDouble Heat Sink -ISDouble Heat Sink -ISDouble Heat Sink -ISDouble Heat Sink -ISDouble Heat Sink -ISDouble Heat Sink +ISDoubleHeatSink +ISDoubleHeatSink +ISDoubleHeatSink +ISDoubleHeatSink +ISDoubleHeatSink +ISDoubleHeatSink ISMediumPulseLaser -Empty- @@ -58,9 +57,9 @@ Shoulder Upper Arm Actuator Lower Arm Actuator Hand Actuator -ISDouble Heat Sink -ISDouble Heat Sink -ISDouble Heat Sink +ISDoubleHeatSink +ISDoubleHeatSink +ISDoubleHeatSink ISERPPC ISERPPC ISERPPC @@ -71,15 +70,15 @@ Left Torso: Fusion Engine Fusion Engine Fusion Engine -ISDouble Heat Sink -ISDouble Heat Sink -ISDouble Heat Sink -ISDouble Heat Sink -ISDouble Heat Sink -ISDouble Heat Sink +ISDoubleHeatSink +ISDoubleHeatSink +ISDoubleHeatSink +ISDoubleHeatSink +ISDoubleHeatSink +ISDoubleHeatSink ISMediumPulseLaser (R) -ISGauss Ammo -ISGauss Ammo +IS Gauss Ammo +IS Gauss Ammo Right Torso: Fusion Engine @@ -151,3 +150,19 @@ Foot Actuator -Empty- -Empty- +overview:Originally a reverse engineered version of the Capellan Confederation's Cataphract intended to mask development of the Federated Commonwealth's fearsome Axman, the Caesar would turn out to be a good but not great BattleMech in its own right. + +capabilities:The Caesar was built to do as much damage to an enemy at as great a stand-off range as possible. The 'Mech therefore carries primarily long-ranged armament. The 'Mech also uses an 280-rated XL engine and sixteen double heat sinks, both of which save significant amounts of weight, in order to carry as many weapons and as much armor as possible. The 'Mech utilizes CASE to protect against ammunition explosions should an enemy be able to breach the ten and a half tons of armor that protect it. + +deployment:The primary long-ranged weapon on the Caesar is a Poland Main Model A Gauss rifle that can shear off just under a ton of armor with each shot, supplied with two tons of reloads. This is backed up at long ranges by a Johnston High Speed ER PPC, which can do two-thirds of the damage of the Gauss rifle but is not dependent on limited ammunition. For close-range engagements, the Caesar carries four Sutel Precision Line medium pulse lasers, two of which are rear-mounted, allowing it to put up a crippling defense against any enemies that can get close to the 'Mech. The large volume of heat sinks carried ensure the Caesar can fire all its weapons while hardly breaking a sweat, making it a popular choice for missions in areas of extremely high temperatures. + +history:Supposedly the sole design intended to come out of Johnston Industries' then-new 'Mech lines on New Syrtis, the Caesar received notable public attention in an attempt to distract from development of the Axman. The finished 'Mech surprisingly enough proved to be a high-quality design itself. Though never attracting great sales, the Caesar would prove to be relatively popular in the Capellan March, among Lyran units on the Clan front, and with both FedCom-employed mercenaries and the Com Guards. Johnston attempted to redress its mediocre sales in the wake of the FedCom Civil War, developing two new variants intended to focus specifically on the qualities desired by the Lyran Alliance and Federated Suns. The resulting upswing in sales saw the Caesar in increasing use among those opposing the Word of Blake during the Jihad, with the LAAF in particular adopting the design almost as a means of honoring the assassinated Caesar Steiner. + +manufacturer:Johnston Industries +primaryfactory:New Syrtis +systemmanufacturer:CHASSIS:Dorwinion CES Standard +systemmanufacturer:ENGINE:GM 280 Extralight +systemmanufacturer:ARMOR:Kallon Royalstar with CASE +systemmanufacturer:COMMUNICATIONS:Johnston Wide Band +systemmanufacturer:TARGETING:Randar Pinpoint-HY + diff --git a/megamek/data/mechfiles/mechs/3050U/Caesar CES-3S.mtf b/megamek/data/mechfiles/mechs/3050U/Caesar CES-3S.mtf index 608f6d5a63f..16ced3d5e0c 100644 --- a/megamek/data/mechfiles/mechs/3050U/Caesar CES-3S.mtf +++ b/megamek/data/mechfiles/mechs/3050U/Caesar CES-3S.mtf @@ -149,4 +149,18 @@ IS Endo Steel -Empty- -Empty- +overview:Originally a reverse engineered version of the Capellan Confederation's Cataphract intended to mask development of the Federated Commonwealth's fearsome Axman, the Caesar would turn out to be a good but not great BattleMech in its own right. +capabilities:The Caesar was built to do as much damage to an enemy at as great a stand-off range as possible. The 'Mech therefore carries primarily long-ranged armament. The 'Mech also uses an 280-rated XL engine and sixteen double heat sinks, both of which save significant amounts of weight, in order to carry as many weapons and as much armor as possible. The 'Mech utilizes CASE to protect against ammunition explosions should an enemy be able to breach the ten and a half tons of armor that protect it. + +deployment:This variant is produced by Johnston Industries for the Lyran Alliance. It is built on an endo steel chassis, and with light ferro-fibrous armor. The rear-facing lasers and four double heat sinks are removed, making enough tonnage available to swap out the engine for a light engine of the same rating. The remaining mass goes toward upgrading the ER PPC to a heavy PPC and the inclusion of a rear-firing ER small laser and Guardian ECM suite. The Gauss rifle is protected by CASE. + +history:Supposedly the sole design intended to come out of Johnston Industries' then-new 'Mech lines on New Syrtis, the Caesar received notable public attention in an attempt to distract from development of the Axman. The finished 'Mech surprisingly enough proved to be a high-quality design itself. Though never attracting great sales, the Caesar would prove to be relatively popular in the Capellan March, among Lyran units on the Clan front, and with both FedCom-employed mercenaries and the Com Guards. Johnston attempted to redress its mediocre sales in the wake of the FedCom Civil War, developing two new variants intended to focus specifically on the qualities desired by the Lyran Alliance and Federated Suns. The resulting upswing in sales saw the Caesar in increasing use among those opposing the Word of Blake during the Jihad, with the LAAF in particular adopting the design almost as a means of honoring the assassinated Caesar Steiner. + +manufacturer:Johnston Industries +primaryfactory:New Syrtis +systemmanufacturer:CHASSIS:Dorwinion CES Endo-Steel +systemmanufacturer:ENGINE:GM 280 Extralight +systemmanufacturer:ARMOR:Kallon Light Ferro-Fibrous with CASE +systemmanufacturer:COMMUNICATIONS:Johnston Wide Band +systemmanufacturer:TARGETING:Randar Pinpoint-HY diff --git a/megamek/data/mechfiles/mechs/3050U/Caesar CES-4R.mtf b/megamek/data/mechfiles/mechs/3050U/Caesar CES-4R.mtf index 871e50dec73..4ee1aea01aa 100644 --- a/megamek/data/mechfiles/mechs/3050U/Caesar CES-4R.mtf +++ b/megamek/data/mechfiles/mechs/3050U/Caesar CES-4R.mtf @@ -152,4 +152,18 @@ IS Ferro-Fibrous -Empty- -Empty- +overview:Originally a reverse engineered version of the Capellan Confederation's Cataphract intended to mask development of the Federated Commonwealth's fearsome Axman, the Caesar would turn out to be a good but not great BattleMech in its own right. +capabilities:The Caesar was built to do as much damage to an enemy at as great a stand-off range as possible. The 'Mech therefore carries primarily long-ranged armament. The 'Mech also uses an 280-rated XL engine and sixteen double heat sinks, both of which save significant amounts of weight, in order to carry as many weapons and as much armor as possible. The 'Mech utilizes CASE to protect against ammunition explosions should an enemy be able to breach the ten and a half tons of armor that protect it. + +deployment:A variant that first saw action during the Jihad, the -4R attempts to improve upon the -3R variant marketed in the Federated Suns. Designed with short-range combat in mind, it drops the rear-facing pulse lasers and three heat sinks in favor of additional armor and three ER medium lasers; the armor is upgraded to regular ferro-fibrous. MASC enables the Caesar to close more quickly and bring its snub-nose PPC to bear. + +history:Supposedly the sole design intended to come out of Johnston Industries' then-new 'Mech lines on New Syrtis, the Caesar received notable public attention in an attempt to distract from development of the Axman. The finished 'Mech surprisingly enough proved to be a high-quality design itself. Though never attracting great sales, the Caesar would prove to be relatively popular in the Capellan March, among Lyran units on the Clan front, and with both FedCom-employed mercenaries and the Com Guards. Johnston attempted to redress its mediocre sales in the wake of the FedCom Civil War, developing two new variants intended to focus specifically on the qualities desired by the Lyran Alliance and Federated Suns. The resulting upswing in sales saw the Caesar in increasing use among those opposing the Word of Blake during the Jihad, with the LAAF in particular adopting the design almost as a means of honoring the assassinated Caesar Steiner. + +manufacturer:Johnston Industries +primaryfactory:New Syrtis +systemmanufacturer:CHASSIS:Dorwinion CES Standard +systemmanufacturer:ENGINE:GM 280 Extralight +systemmanufacturer:ARMOR:Kallon Unity Weave Ferro-Fibrous with CASE +systemmanufacturer:COMMUNICATIONS:Johnston Wide Band +systemmanufacturer:TARGETING:Randar Pinpoint-HY diff --git a/megamek/data/mechfiles/mechs/3050U/Caesar CES-4S.mtf b/megamek/data/mechfiles/mechs/3050U/Caesar CES-4S.mtf index 84cc53d593d..cea74fdcfe5 100644 --- a/megamek/data/mechfiles/mechs/3050U/Caesar CES-4S.mtf +++ b/megamek/data/mechfiles/mechs/3050U/Caesar CES-4S.mtf @@ -149,3 +149,18 @@ Endo-Steel -Empty- -Empty- +overview:Originally a reverse engineered version of the Capellan Confederation's Cataphract intended to mask development of the Federated Commonwealth's fearsome Axman, the Caesar would turn out to be a good but not great BattleMech in its own right. + +capabilities:The Caesar was built to do as much damage to an enemy at as great a stand-off range as possible. The 'Mech therefore carries primarily long-ranged armament. The 'Mech also uses an 280-rated XL engine and sixteen double heat sinks, both of which save significant amounts of weight, in order to carry as many weapons and as much armor as possible. The 'Mech utilizes CASE to protect against ammunition explosions should an enemy be able to breach the ten and a half tons of armor that protect it. + +deployment:The -4S variant, that first saw use during the FedCom Civil War, is intended for close-range combat. The vulnerable XL engine has been replaced with a sturdier light fusion engine, and has been redesigned to use an endo steel internal structure. The 'Mech is armed with a heavy Gauss rifle as its primary weapon. This is backed up by a large pulse laser, two medium pulse lasers, and a pair of ER medium lasers. + +history:Supposedly the sole design intended to come out of Johnston Industries' then-new 'Mech lines on New Syrtis, the Caesar received notable public attention in an attempt to distract from development of the Axman. The finished 'Mech surprisingly enough proved to be a high-quality design itself. Though never attracting great sales, the Caesar would prove to be relatively popular in the Capellan March, among Lyran units on the Clan front, and with both FedCom-employed mercenaries and the Com Guards. Johnston attempted to redress its mediocre sales in the wake of the FedCom Civil War, developing two new variants intended to focus specifically on the qualities desired by the Lyran Alliance and Federated Suns. The resulting upswing in sales saw the Caesar in increasing use among those opposing the Word of Blake during the Jihad, with the LAAF in particular adopting the design almost as a means of honoring the assassinated Caesar Steiner. + +manufacturer:Defiance Industries +primaryfactory:Hesperus II +systemmanufacturer:CHASSIS:Dorwinion CES Endo-Steel +systemmanufacturer:ENGINE:Defiance 280 Light +systemmanufacturer:ARMOR:Durallex Heavy with CASE +systemmanufacturer:COMMUNICATIONS:Johnston Wide Band +systemmanufacturer:TARGETING:Randar Pinpoint-HY \ No newline at end of file diff --git a/megamek/data/mechfiles/mechs/3050U/Hoplite HOP-4B.mtf b/megamek/data/mechfiles/mechs/3050U/Hoplite HOP-4B.mtf index d6932f14659..5cf40bd21a6 100644 --- a/megamek/data/mechfiles/mechs/3050U/Hoplite HOP-4B.mtf +++ b/megamek/data/mechfiles/mechs/3050U/Hoplite HOP-4B.mtf @@ -5,7 +5,7 @@ mul id:4330 Config:Biped TechBase:Inner Sphere -Era:2682 +Era:2581 Source:TRO 3050 - Star League Rules Level:1 diff --git a/megamek/data/mechfiles/mechs/3055U/Gunslinger GUN-1ERD.mtf b/megamek/data/mechfiles/mechs/3055U/Gunslinger GUN-1ERD.mtf index 86e6b65286a..3787b832b57 100644 --- a/megamek/data/mechfiles/mechs/3055U/Gunslinger GUN-1ERD.mtf +++ b/megamek/data/mechfiles/mechs/3055U/Gunslinger GUN-1ERD.mtf @@ -1,35 +1,34 @@ -Version:1.0 +Version:1.3 Gunslinger GUN-1ERD mul id:1347 - Config:Biped -TechBase:Inner Sphere -Era:3053 -Source:TRO 3055 - Clan Invasion -Rules Level:2 - -Mass:85 -Engine:255 XL Engine -Structure:Standard -Myomer:Standard - -Heat Sinks:10 Double -Walk MP:3 -Jump MP:2 - -Armor:Standard(Inner Sphere) -LA Armor:25 -RA Armor:25 -LT Armor:25 -RT Armor:25 -CT Armor:34 -HD Armor:9 -LL Armor:32 -RL Armor:32 -RTL Armor:11 -RTR Armor:11 -RTC Armor:19 +techbase:Inner Sphere +era:3053 +source:TRO 3055 - Clan Invasion +rules level:2 + +mass:85 +engine:255 XL Engine(IS) +structure:IS Standard +myomer:Standard + +heat sinks:10 IS Double +walk mp:3 +jump mp:2 + +armor:Standard(Inner Sphere) +LA armor:25 +RA armor:25 +LT armor:25 +RT armor:25 +CT armor:34 +HD armor:9 +LL armor:32 +RL armor:32 +RTL armor:11 +RTR armor:11 +RTC armor:19 Weapons:9 Medium Pulse Laser, Left Leg @@ -154,4 +153,20 @@ ISMediumPulseLaser (R) -Empty- -Empty- +overview:The Clan invasion produced some strange bedfellows, the most unlikely of which was the Federated Commonwealth-Draconis Combine quasi-alliance. Though that relationship has deteriorated over the years, the Gunslinger stands as a testament to what can happen when two bitter enemies put aside their mutual hatred and work together to achieve a common goal. + +capabilities:To power the Gunslinger, a VOX 255 XL engine is used to give the 'Mech a top speed of 54 km/h. This is augmented by a pair of HildCo Model 12 jump jets that allow the Gunslinger to traverse rough terrain and provide extra mobility at close ranges. The 'Mech is also equipped with a Guardian ECM Suite and a Beagle Active Probe, giving the Gunslinger superior detection capabilities and protection from advanced enemy electronic warfare equipment. Finally, the Gunslinger is protected by fifteen and a half tons of armor, giving the 'Mech excellent armor protection. + +deployment:The Gunslinger carries as its primary weapons two arm-mounted Poland Main Model A Gauss rifles that can each strip off a ton of armor at ranges of over six hundred meters. As the Gunslinger closes with the enemy it is able to bring to bear its four Defiance B3M medium lasers and a Defiance A5L Small Laser that help to make up for the ineffectiveness of the Gauss rifles at extremely short ranges. Finally, to protect against attacks on its weak rear armor, the Gunslinger carries two rear-mounted Defiance P5M Medium Pulse Lasers. + +history:On December 5, 3053, the first FedCom Gunslinger rolled off the assembly line at Defiance Industries. Because of issues with the Gauss weapons, it took nearly two years for the first Combine Gunslinger to leave the Quentin plant. Since then, both plants have built as many Gunslingers as they possibly can each year, severely taxing their resources while breaking production records year after year. Beginning with Operation Guerrero in 3057 and the Lyran Alliance's Jade Falcon invasion in 3058, the Gunslinger demonstrated its capabilities, as it has in every other significant military operation in the Inner Sphere since. As a result, the Gunslinger is still in high demand. + +manufacturer:Defiance Industries, Independence Weaponry +primaryfactory:Hesperus II,Quentin +systemmanufacturer:CHASSIS:Star League XT +systemmanufacturer:ENGINE:VOX 255 XL +systemmanufacturer:ARMOR:Kevlar 5000 +systemmanufacturer:JUMPJET:HildCo Model 12 +systemmanufacturer:COMMUNICATIONS:Nashan Quartet ComSy with Guardian ECM +systemmanufacturer:TARGETING:Nashan Diana Mark II Targeting Computer diff --git a/megamek/data/mechfiles/mechs/3055U/Gunslinger GUN-2ERD.mtf b/megamek/data/mechfiles/mechs/3055U/Gunslinger GUN-2ERD.mtf index 2de9ffdb870..99975925480 100644 --- a/megamek/data/mechfiles/mechs/3055U/Gunslinger GUN-2ERD.mtf +++ b/megamek/data/mechfiles/mechs/3055U/Gunslinger GUN-2ERD.mtf @@ -152,4 +152,19 @@ Jump Jet -Empty- -Empty- +overview:The Clan invasion produced some strange bedfellows, the most unlikely of which was the Federated Commonwealth-Draconis Combine quasi-alliance. Though that relationship has deteriorated over the years, the Gunslinger stands as a testament to what can happen when two bitter enemies put aside their mutual hatred and work together to achieve a common goal. +capabilities:To power the Gunslinger, a VOX 255 XL engine is used to give the 'Mech a top speed of 54 km/h. This is augmented by a pair of HildCo Model 12 jump jets that allow the Gunslinger to traverse rough terrain and provide extra mobility at close ranges. The 'Mech is also equipped with a Guardian ECM Suite and a Beagle Active Probe, giving the Gunslinger superior detection capabilities and protection from advanced enemy electronic warfare equipment. Finally, the Gunslinger is protected by fifteen and a half tons of armor, giving the 'Mech excellent armor protection. + +deployment:TThe 2ERD model of the Gunslinger upgrades the medium lasers to ER medium lasers and removes the two rear Medium Pulse Lasers, the Beagle Probe and the Small Laser. The 'Mech then adds an additional jump jet allowing the 'Mech to jump up to ninety meters and also adds a C3 master computer. + +history:On December 5, 3053, the first FedCom Gunslinger rolled off the assembly line at Defiance Industries. Because of issues with the Gauss weapons, it took nearly two years for the first Combine Gunslinger to leave the Quentin plant. Since then, both plants have built as many Gunslingers as they possibly can each year, severely taxing their resources while breaking production records year after year. Beginning with Operation Guerrero in 3057 and the Lyran Alliance's Jade Falcon invasion in 3058, the Gunslinger demonstrated its capabilities, as it has in every other significant military operation in the Inner Sphere since. As a result, the Gunslinger is still in high demand. + +manufacturer:Defiance Industries, Independence Weaponry +primaryfactory:Hesperus II,Quentin +systemmanufacturer:CHASSIS:Star League XT +systemmanufacturer:ENGINE:VOX 255 XL +systemmanufacturer:ARMOR:Kevlar 5000 +systemmanufacturer:JUMPJET:HildCo Model 12 +systemmanufacturer:COMMUNICATIONS:Nashan Quartet ComSy with Guardian ECM +systemmanufacturer:TARGETING:Nashan Diana Mark II Targeting Computer diff --git a/megamek/data/mechfiles/mechs/3055U/Naga A.mtf b/megamek/data/mechfiles/mechs/3055U/Naga A.mtf index 22c761b63c2..a5ff6c17ce6 100644 --- a/megamek/data/mechfiles/mechs/3055U/Naga A.mtf +++ b/megamek/data/mechfiles/mechs/3055U/Naga A.mtf @@ -5,7 +5,7 @@ mul id:2247 Config:Biped Omnimech TechBase:Clan -Era:2945 +Era:2869 Source:TRO 3055 - Succession Wars Rules Level:3 diff --git a/megamek/data/mechfiles/mechs/3055U/Naga B.mtf b/megamek/data/mechfiles/mechs/3055U/Naga B.mtf index c659e260f18..7b93efb80f8 100644 --- a/megamek/data/mechfiles/mechs/3055U/Naga B.mtf +++ b/megamek/data/mechfiles/mechs/3055U/Naga B.mtf @@ -5,7 +5,7 @@ mul id:2248 Config:Biped Omnimech TechBase:Clan -Era:2945 +Era:2869 Source:TRO 3055 - Succession Wars Rules Level:3 diff --git a/megamek/data/mechfiles/mechs/3055U/Naga C.mtf b/megamek/data/mechfiles/mechs/3055U/Naga C.mtf index 02ab738a641..b62f0889022 100644 --- a/megamek/data/mechfiles/mechs/3055U/Naga C.mtf +++ b/megamek/data/mechfiles/mechs/3055U/Naga C.mtf @@ -5,7 +5,7 @@ mul id:2249 Config:Biped Omnimech TechBase:Clan -Era:2945 +Era:2869 Source:TRO 3055 - Succession Wars Rules Level:3 diff --git a/megamek/data/mechfiles/mechs/3055U/Naga D.mtf b/megamek/data/mechfiles/mechs/3055U/Naga D.mtf index ff80d4105b9..4bad8119c5d 100644 --- a/megamek/data/mechfiles/mechs/3055U/Naga D.mtf +++ b/megamek/data/mechfiles/mechs/3055U/Naga D.mtf @@ -5,7 +5,7 @@ mul id:2250 Config:Biped Omnimech TechBase:Clan -Era:2945 +Era:2869 Source:TRO 3055 - Succession Wars Rules Level:3 diff --git a/megamek/data/mechfiles/mechs/3055U/Nightsky NGS-4S.mtf b/megamek/data/mechfiles/mechs/3055U/Nightsky NGS-4S.mtf index 0aa1dbe01eb..097dd5f08cf 100644 --- a/megamek/data/mechfiles/mechs/3055U/Nightsky NGS-4S.mtf +++ b/megamek/data/mechfiles/mechs/3055U/Nightsky NGS-4S.mtf @@ -1,35 +1,34 @@ -Version:1.0 +Version:1.3 Nightsky NGS-4S mul id:2279 - Config:Biped -TechBase:Inner Sphere -Era:3053 -Source:TRO 3055 - Clan Invasion -Rules Level:2 - -Mass:50 -Engine:300 XL Engine -Structure:Standard -Myomer:Standard - -Heat Sinks:11 Double -Walk MP:6 -Jump MP:6 - -Armor:Standard(Inner Sphere) -LA Armor:14 -RA Armor:14 -LT Armor:18 -RT Armor:18 -CT Armor:23 -HD Armor:9 -LL Armor:20 -RL Armor:20 -RTL Armor:5 -RTR Armor:5 -RTC Armor:6 +techbase:Inner Sphere +era:3053 +source:TRO 3055 - Clan Invasion +rules level:2 + +mass:50 +engine:300 XL Engine(IS) +structure:IS Standard +myomer:Standard + +heat sinks:11 IS Double +walk mp:6 +jump mp:6 + +armor:Standard(Inner Sphere) +LA armor:14 +RA armor:14 +LT armor:18 +RT armor:18 +CT armor:23 +HD armor:9 +LL armor:20 +RL armor:20 +RTL armor:5 +RTR armor:5 +RTC armor:6 Weapons:4 Large Pulse Laser, Left Arm @@ -149,4 +148,20 @@ Jump Jet -Empty- -Empty- +overview:The Nightsky was a mid-range continuation of the Federated Commonwealth's successful Hatchetman-Axman series, which established melee combat weapons as a powerful and heat-efficient close-combat option for the experienced MechWarrior. Intended to provide both speed and firepower. + +capabilities:The Nightsky is built around a massive Vlar 300 XL extralight engine that propels the 'Mech up to speeds of 97.2 km/h. Superb ground speed and the added maneuverability provided by six HildCo Model 13 jump jets that allow the Nightsky to jump up to 180 meters make the Nightsky a capable heavy recon 'Mech. It is also protected with nine and a half tons of armor, providing the Nightsky with good armor protection for its size. + +deployment:The Nightsky is built with a powerful close range arsenal. The centerpiece of this is a massive four-ton hatchet that is built into its right arm, which allows the 'Mech to cut through another 'Mech's armor. The Nightsky is also armed with a Sutel Precision Line large pulse laser for medium to long range firepower, supported by two Sutel Precision Line medium pulse lasers and a Sutel Precision Line small pulse laser for close range support. + +history:After their introduction in 3053, Nightskys quickly proliferated throughout the Federated Commonwealth, with many replacing Hatchetmen or Axmen lost in the early years of the Clan invasion. The distribution of this design had become fairly even between the two once-allied states by the time of the Lyran secession from the Commonwealth, resulting in Nightskys appearing among as many pro-Victor Davion troops as pro-Katherine Steiner forces during the FedCom Civil War. + +manufacturer:Defiance Industries +primaryfactory:Hesperus II +systemmanufacturer:CHASSIS:Dorwinion Standard +systemmanufacturer:ENGINE:Vlar 300 XL +systemmanufacturer:ARMOR:Kallon Royalstar +systemmanufacturer:JUMPJET:HildCo Model 13 +systemmanufacturer:COMMUNICATIONS:TharHes Calliope Hm10 +systemmanufacturer:TARGETING:TharHes Ares-8a diff --git a/megamek/data/mechfiles/mechs/3055U/Nightsky NGS-4T.mtf b/megamek/data/mechfiles/mechs/3055U/Nightsky NGS-4T.mtf index 3d35a2480b9..3e4573c7c83 100644 --- a/megamek/data/mechfiles/mechs/3055U/Nightsky NGS-4T.mtf +++ b/megamek/data/mechfiles/mechs/3055U/Nightsky NGS-4T.mtf @@ -151,4 +151,19 @@ Jump Jet -Empty- -Empty- +overview:The Nightsky was a mid-range continuation of the Federated Commonwealth's successful Hatchetman-Axman series, which established melee combat weapons as a powerful and heat-efficient close-combat option for the experienced MechWarrior. Intended to provide both speed and firepower. +capabilities:The Nightsky is built around a massive Vlar 300 XL extralight engine that propels the 'Mech up to speeds of 97.2 km/h. Superb ground speed and the added maneuverability provided by six HildCo Model 13 jump jets that allow the Nightsky to jump up to 180 meters make the Nightsky a capable heavy recon 'Mech. It is also protected with nine and a half tons of armor, providing the Nightsky with good armor protection for its size. + +deployment:The 4T is a variant of the Nightsky that looks to make the 'Mech more powerful in both long and close range combat. This is done by swapping the large pulse laser for an ER large laser with an anti-missile system for added defense against enemy missiles. The 'Mech also adds an additional small laser for added-close range firepower + +history:After their introduction in 3053, Nightskys quickly proliferated throughout the Federated Commonwealth, with many replacing Hatchetmen or Axmen lost in the early years of the Clan invasion. The distribution of this design had become fairly even between the two once-allied states by the time of the Lyran secession from the Commonwealth, resulting in Nightskys appearing among as many pro-Victor Davion troops as pro-Katherine Steiner forces during the FedCom Civil War. + +manufacturer:Defiance Industries +primaryfactory:Hesperus II +systemmanufacturer:CHASSIS:Dorwinion Standard +systemmanufacturer:ENGINE:Vlar 300 XL +systemmanufacturer:ARMOR:Kallon Royalstar +systemmanufacturer:JUMPJET:HildCo Model 13 +systemmanufacturer:COMMUNICATIONS:TharHes Calliope Hm10 +systemmanufacturer:TARGETING:TharHes Ares-8a diff --git a/megamek/data/mechfiles/mechs/3055U/Nightsky NGS-5S.mtf b/megamek/data/mechfiles/mechs/3055U/Nightsky NGS-5S.mtf index e24dae9236e..2e9380df35c 100644 --- a/megamek/data/mechfiles/mechs/3055U/Nightsky NGS-5S.mtf +++ b/megamek/data/mechfiles/mechs/3055U/Nightsky NGS-5S.mtf @@ -149,4 +149,18 @@ Foot Actuator -Empty- -Empty- +overview:The Nightsky was a mid-range continuation of the Federated Commonwealth's successful Hatchetman-Axman series, which established melee combat weapons as a powerful and heat-efficient close-combat option for the experienced MechWarrior. Intended to provide both speed and firepower. +capabilities:The Nightsky is built around a massive Vlar 300 XL extralight engine that propels the 'Mech up to speeds of 97.2 km/h. Superb ground speed and the added maneuverability provided by six HildCo Model 13 jump jets that allow the Nightsky to jump up to 180 meters make the Nightsky a capable heavy recon 'Mech. It is also protected with nine and a half tons of armor, providing the Nightsky with good armor protection for its size. + +deployment:A simple upgrade of the Nightsky, the 5S looks to make the 'Mech more heat efficient. This is achieved by removing the jump jets and replacing them with three additional double heat sinks. + +history:After their introduction in 3053, Nightskys quickly proliferated throughout the Federated Commonwealth, with many replacing Hatchetmen or Axmen lost in the early years of the Clan invasion. The distribution of this design had become fairly even between the two once-allied states by the time of the Lyran secession from the Commonwealth, resulting in Nightskys appearing among as many pro-Victor Davion troops as pro-Katherine Steiner forces during the FedCom Civil War. + +manufacturer:Defiance Industries +primaryfactory:Hesperus II +systemmanufacturer:CHASSIS:Dorwinion Standard +systemmanufacturer:ENGINE:Vlar 300 XL +systemmanufacturer:ARMOR:Kallon Royalstar +systemmanufacturer:COMMUNICATIONS:TharHes Calliope Hm10 +systemmanufacturer:TARGETING:TharHes Ares-8a diff --git a/megamek/data/mechfiles/mechs/3055U/Nightsky NGS-5T.mtf b/megamek/data/mechfiles/mechs/3055U/Nightsky NGS-5T.mtf index a42c80059df..e810780fa00 100644 --- a/megamek/data/mechfiles/mechs/3055U/Nightsky NGS-5T.mtf +++ b/megamek/data/mechfiles/mechs/3055U/Nightsky NGS-5T.mtf @@ -149,4 +149,19 @@ Jump Jet -Empty- -Empty- +overview:The Nightsky was a mid-range continuation of the Federated Commonwealth's successful Hatchetman-Axman series, which established melee combat weapons as a powerful and heat-efficient close-combat option for the experienced MechWarrior. Intended to provide both speed and firepower. +capabilities:The Nightsky is built around a massive Vlar 300 XL extralight engine that propels the 'Mech up to speeds of 97.2 km/h. Superb ground speed and the added maneuverability provided by six HildCo Model 13 jump jets that allow the Nightsky to jump up to 180 meters make the Nightsky a capable heavy recon 'Mech. It is also protected with nine and a half tons of armor, providing the Nightsky with good armor protection for its size. + +deployment:The 5T is a modification of the 4S that replaces the large pulse laser with an ER PPC, but is otherwise identical to the 4S model. This modification of the 'Mech makes the Nightsky capable of targeting an enemy 'Mech at extreme ranges and wearing them down until the 'Mech can bring its hatchet to bear on its target. + +history:After their introduction in 3053, Nightskys quickly proliferated throughout the Federated Commonwealth, with many replacing Hatchetmen or Axmen lost in the early years of the Clan invasion. The distribution of this design had become fairly even between the two once-allied states by the time of the Lyran secession from the Commonwealth, resulting in Nightskys appearing among as many pro-Victor Davion troops as pro-Katherine Steiner forces during the FedCom Civil War. + +manufacturer:Defiance Industries +primaryfactory:Hesperus II +systemmanufacturer:CHASSIS:Dorwinion Standard +systemmanufacturer:ENGINE:Vlar 300 XL +systemmanufacturer:ARMOR:Kallon Royalstar +systemmanufacturer:JUMPJET:HildCo Model 13 +systemmanufacturer:COMMUNICATIONS:TharHes Calliope Hm10 +systemmanufacturer:TARGETING:TharHes Ares-8a diff --git a/megamek/data/mechfiles/mechs/3055U/Nightsky NGS-6S.mtf b/megamek/data/mechfiles/mechs/3055U/Nightsky NGS-6S.mtf index cf8dbd3b205..664ca701aa4 100644 --- a/megamek/data/mechfiles/mechs/3055U/Nightsky NGS-6S.mtf +++ b/megamek/data/mechfiles/mechs/3055U/Nightsky NGS-6S.mtf @@ -152,4 +152,19 @@ Jump Jet -Empty- -Empty- +overview:The Nightsky was a mid-range continuation of the Federated Commonwealth's successful Hatchetman-Axman series, which established melee combat weapons as a powerful and heat-efficient close-combat option for the experienced MechWarrior. Intended to provide both speed and firepower. +capabilities:The Nightsky is built around a massive Vlar 300 XL extralight engine that propels the 'Mech up to speeds of 97.2 km/h. Superb ground speed and the added maneuverability provided by six HildCo Model 13 jump jets that allow the Nightsky to jump up to 180 meters make the Nightsky a capable heavy recon 'Mech. It is also protected with nine and a half tons of armor, providing the Nightsky with good armor protection for its size. + +deployment:This modification of the Nightsky intended to make the 'Mech more durable and gave it a longer life on the battlefield. The 'Mech replaces the 300-rated XL engine with a 300 light fusion engine. The 'Mech also removes all of its ranged weaponry and replaces it with seven ER medium lasers. When combined with the hatchet, the 'Mech is a monster, both against battle armor and in an urban environment. + +history:After their introduction in 3053, Nightskys quickly proliferated throughout the Federated Commonwealth, with many replacing Hatchetmen or Axmen lost in the early years of the Clan invasion. The distribution of this design had become fairly even between the two once-allied states by the time of the Lyran secession from the Commonwealth, resulting in Nightskys appearing among as many pro-Victor Davion troops as pro-Katherine Steiner forces during the FedCom Civil War. + +manufacturer:Defiance Industries +primaryfactory:Hesperus II +systemmanufacturer:CHASSIS:Dorwinion Standard +systemmanufacturer:ENGINE:Vlar Light 300 +systemmanufacturer:ARMOR:Kallon Royalstar +systemmanufacturer:JUMPJET:HildCo Model 13 +systemmanufacturer:COMMUNICATIONS:TharHes Calliope Hm10 +systemmanufacturer:TARGETING:TharHes Ares-8a diff --git a/megamek/data/mechfiles/mechs/3055U/Penetrator PTR-4D.mtf b/megamek/data/mechfiles/mechs/3055U/Penetrator PTR-4D.mtf index 26b87eaa712..f8ae91fc540 100644 --- a/megamek/data/mechfiles/mechs/3055U/Penetrator PTR-4D.mtf +++ b/megamek/data/mechfiles/mechs/3055U/Penetrator PTR-4D.mtf @@ -1,35 +1,34 @@ -Version:1.0 +Version:1.3 Penetrator PTR-4D mul id:2465 - Config:Biped -TechBase:Inner Sphere -Era:3053 -Source:TRO 3055 - Clan Invasion -Rules Level:2 - -Mass:75 -Engine:300 Fusion Engine -Structure:Standard -Myomer:Standard - -Heat Sinks:12 Double -Walk MP:4 -Jump MP:4 - -Armor:Standard(Inner Sphere) -LA Armor:21 -RA Armor:21 -LT Armor:24 -RT Armor:24 -CT Armor:34 -HD Armor:9 -LL Armor:26 -RL Armor:26 -RTL Armor:7 -RTR Armor:7 -RTC Armor:9 +techbase:Inner Sphere +era:3053 +source:TRO 3055 - Clan Invasion +rules level:2 + +mass:75 +engine:300 Fusion Engine(IS) +structure:IS Standard +myomer:Standard + +heat sinks:12 IS Double +walk mp:4 +jump mp:4 + +armor:Standard(Inner Sphere) +LA armor:21 +RA armor:21 +LT armor:24 +RT armor:24 +CT armor:34 +HD armor:9 +LL armor:26 +RL armor:26 +RTL armor:7 +RTR armor:7 +RTC armor:9 Weapons:9 ER Large Laser, Left Arm @@ -40,7 +39,7 @@ Medium Pulse Laser, Left Torso Medium Pulse Laser, Right Torso Medium Pulse Laser, Right Torso Medium Pulse Laser, Right Torso -AMS, Center Torso +Anti-Missile System, Center Torso Left Arm: Shoulder @@ -154,4 +153,21 @@ Jump Jet -Empty- -Empty- +overview:The designers at Kallon Industries used the Black Hawk Clan OmniMech as the basis for the Penetrator. + +capabilities:The Penetrator has an all energy weapons arsenal and uses twelve double heat sinks to handle the massive heat load from its weapons. The 'Mech is lacking in speed though when compared to the Black Hawk. This is because the 'Mechs designers used a Vlar 300 fusion engine for its combat durability, giving the 'Mech a top speed of 64.8 km/h. To help offset the 'Mech's lack of mobility, the Penetrator has four Anderson 398 jump jets giving it added mobility with a jumping distance of one hundred and twenty meters. The Penetrator also carries a respectable thirteen tons of armor. The 'Mech's heavy armor protection, +combined with its standard engine and unlimited amounts of ammunition, make for a 'Mech that is very rugged and hard to kill. + +deployment:The Penetrator carries a blistering laser array. The primary weapons are a pair of arm mounted Diverse Optics Sunbeam ER Large Lasers for long range firepower. For close range combat, the 'Mech carries six Sutel Precision Line Medium Pulse Lasers which are mounted in its right and left torsos. Finally, the 'Mech carries its only ammunition-based weapon, a Yori Flyswatter anti-missile system, for added defense against missile attacks + +history:With the threat of the Clans looming over it, the Federated Commonwealth dispatched a large number of Penetrators to units stationed in Lyran space. Following the secession of the Commonwealth's Lyran half and the formation of the Lyran Alliance under Katherine Steiner-Davion in 3058, many Penetrators ended up on the LAAF's rolls. Penetrators served on both sides of the FedCom Civil War, demonstrating their toughness yet again. The 'Mech's low reliance on ammunition made it ideal for the mobile campaigns that defined that conflict. Archer's Avengers and other allied forces conducted a planet-hopping campaign, always staying one step ahead of the Loyalist forces pursuing them. The Avengers had to live off the land because reliable supply lines were almost non-existent. The Penetrator was an ideal combat unit because it required little ammunition and had few advanced components. Several Penetrators were captured by mercenary units during the FedCom Civil War. According to rumors, Kallon Industries may soon change its policy of only selling the design to the Federated Commonwealth and now the Federated Suns. + +manufacturer:Kallon Weapon Industries,Kallon Weapon Industries +primaryfactory:Talon (Wernke), Victoria +systemmanufacturer:CHASSIS:Crucis G +systemmanufacturer:ENGINE:Vlar 300 +systemmanufacturer:ARMOR:Durallex Heavy +systemmanufacturer:JUMPJET:Anderson 398 +systemmanufacturer:COMMUNICATIONS:Dalban Micronics +systemmanufacturer:TARGETING:Matabushi Sentinel diff --git a/megamek/data/mechfiles/mechs/3055U/Penetrator PTR-4F.mtf b/megamek/data/mechfiles/mechs/3055U/Penetrator PTR-4F.mtf index e930d51904e..d01d41a4c34 100644 --- a/megamek/data/mechfiles/mechs/3055U/Penetrator PTR-4F.mtf +++ b/megamek/data/mechfiles/mechs/3055U/Penetrator PTR-4F.mtf @@ -152,4 +152,20 @@ Jump Jet -Empty- -Empty- +overview:The designers at Kallon Industries used the Black Hawk Clan OmniMech as the basis for the Penetrator. +capabilities:The Penetrator has an all energy weapons arsenal and uses twelve double heat sinks to handle the massive heat load from its weapons. The 'Mech is lacking in speed though when compared to the Black Hawk. This is because the 'Mechs designers used a Vlar 300 fusion engine for its combat durability, giving the 'Mech a top speed of 64.8 km/h. To help offset the 'Mech's lack of mobility, the Penetrator has four Anderson 398 jump jets giving it added mobility with a jumping distance of one hundred and twenty meters. The Penetrator also carries a respectable thirteen tons of armor. The 'Mech's heavy armor protection, +combined with its standard engine and unlimited amounts of ammunition, make for a 'Mech that is very rugged and hard to kill. + +deployment:Intended to act as a fire support 'Mech, The PTR-4F Penetrator sacrifices two of its Medium Pulse Lasers and the ER Large Lasers, freeing enough tonnage to add two LRM-10 missile launchers. The LRM-10s were then mated to Artemis IV fire control systems for added accuracy. + +history:With the threat of the Clans looming over it, the Federated Commonwealth dispatched a large number of Penetrators to units stationed in Lyran space. Following the secession of the Commonwealth's Lyran half and the formation of the Lyran Alliance under Katherine Steiner-Davion in 3058, many Penetrators ended up on the LAAF's rolls. Penetrators served on both sides of the FedCom Civil War, demonstrating their toughness yet again. The 'Mech's low reliance on ammunition made it ideal for the mobile campaigns that defined that conflict. Archer's Avengers and other allied forces conducted a planet-hopping campaign, always staying one step ahead of the Loyalist forces pursuing them. The Avengers had to live off the land because reliable supply lines were almost non-existent. The Penetrator was an ideal combat unit because it required little ammunition and had few advanced components. Several Penetrators were captured by mercenary units during the FedCom Civil War. According to rumors, Kallon Industries may soon change its policy of only selling the design to the Federated Commonwealth and now the Federated Suns. + +manufacturer:Kallon Weapon Industries +primaryfactory:Talon (Wernke) +systemmanufacturer:CHASSIS:Crucis G +systemmanufacturer:ENGINE:Vlar 300 +systemmanufacturer:ARMOR:Durallex Heavy +systemmanufacturer:JUMPJET:Anderson 398 +systemmanufacturer:COMMUNICATIONS:Dalban Micronics +systemmanufacturer:TARGETING:Matabushi Sentinel diff --git a/megamek/data/mechfiles/mechs/3055U/Penetrator PTR-6M.mtf b/megamek/data/mechfiles/mechs/3055U/Penetrator PTR-6M.mtf index 261c69799cc..f0d2262c56b 100644 --- a/megamek/data/mechfiles/mechs/3055U/Penetrator PTR-6M.mtf +++ b/megamek/data/mechfiles/mechs/3055U/Penetrator PTR-6M.mtf @@ -152,4 +152,20 @@ Jump Jet -Empty- -Empty- +overview:The designers at Kallon Industries used the Black Hawk Clan OmniMech as the basis for the Penetrator. +capabilities:The Penetrator has an all energy weapons arsenal and uses twelve double heat sinks to handle the massive heat load from its weapons. The 'Mech is lacking in speed though when compared to the Black Hawk. This is because the 'Mechs designers used a Vlar 300 fusion engine for its combat durability, giving the 'Mech a top speed of 64.8 km/h. To help offset the 'Mech's lack of mobility, the Penetrator has four Anderson 398 jump jets giving it added mobility with a jumping distance of one hundred and twenty meters. The Penetrator also carries a respectable thirteen tons of armor. The 'Mech's heavy armor protection, +combined with its standard engine and unlimited amounts of ammunition, make for a 'Mech that is very rugged and hard to kill. + +deployment:The 6M is a variant of the Penetrator that looks to alleviate the 'Mech's heat buildup by removing two of the Medium Pulse Lasers and a ton of armor and adding five additional double heat sinks. + +history:With the threat of the Clans looming over it, the Federated Commonwealth dispatched a large number of Penetrators to units stationed in Lyran space. Following the secession of the Commonwealth's Lyran half and the formation of the Lyran Alliance under Katherine Steiner-Davion in 3058, many Penetrators ended up on the LAAF's rolls. Penetrators served on both sides of the FedCom Civil War, demonstrating their toughness yet again. The 'Mech's low reliance on ammunition made it ideal for the mobile campaigns that defined that conflict. Archer's Avengers and other allied forces conducted a planet-hopping campaign, always staying one step ahead of the Loyalist forces pursuing them. The Avengers had to live off the land because reliable supply lines were almost non-existent. The Penetrator was an ideal combat unit because it required little ammunition and had few advanced components. Several Penetrators were captured by mercenary units during the FedCom Civil War. According to rumors, Kallon Industries may soon change its policy of only selling the design to the Federated Commonwealth and now the Federated Suns. + +manufacturer:Kallon Weapon Industries +primaryfactory:Talon (Wernke) +systemmanufacturer:CHASSIS:Crucis G +systemmanufacturer:ENGINE:Vlar 300 +systemmanufacturer:ARMOR:Durallex Heavy +systemmanufacturer:JUMPJET:Anderson 398 +systemmanufacturer:COMMUNICATIONS:Dalban Micronics +systemmanufacturer:TARGETING:Matabushi Sentinel diff --git a/megamek/data/mechfiles/mechs/3055U/Penetrator PTR-6S.mtf b/megamek/data/mechfiles/mechs/3055U/Penetrator PTR-6S.mtf index f709c3e3d64..83dd9ef8e38 100644 --- a/megamek/data/mechfiles/mechs/3055U/Penetrator PTR-6S.mtf +++ b/megamek/data/mechfiles/mechs/3055U/Penetrator PTR-6S.mtf @@ -154,4 +154,20 @@ Jump Jet -Empty- -Empty- +overview:The designers at Kallon Industries used the Black Hawk Clan OmniMech as the basis for the Penetrator. +capabilities:The Penetrator has an all energy weapons arsenal and uses twelve double heat sinks to handle the massive heat load from its weapons. The 'Mech is lacking in speed though when compared to the Black Hawk. This is because the 'Mechs designers used a Vlar 300 fusion engine for its combat durability, giving the 'Mech a top speed of 64.8 km/h. To help offset the 'Mech's lack of mobility, the Penetrator has four Anderson 398 jump jets giving it added mobility with a jumping distance of one hundred and twenty meters. The Penetrator also carries a respectable thirteen tons of armor. The 'Mech's heavy armor protection, +combined with its standard engine and unlimited amounts of ammunition, make for a 'Mech that is very rugged and hard to kill. + +deployment:A simple modification of the Penetrator, the 6S model removes one and a half tons of armor. This frees enough weight to add a Guardian ECM Suite to the 'Mech, protecting the 'Mech from foes' advanced electronics. + +history:With the threat of the Clans looming over it, the Federated Commonwealth dispatched a large number of Penetrators to units stationed in Lyran space. Following the secession of the Commonwealth's Lyran half and the formation of the Lyran Alliance under Katherine Steiner-Davion in 3058, many Penetrators ended up on the LAAF's rolls. Penetrators served on both sides of the FedCom Civil War, demonstrating their toughness yet again. The 'Mech's low reliance on ammunition made it ideal for the mobile campaigns that defined that conflict. Archer's Avengers and other allied forces conducted a planet-hopping campaign, always staying one step ahead of the Loyalist forces pursuing them. The Avengers had to live off the land because reliable supply lines were almost non-existent. The Penetrator was an ideal combat unit because it required little ammunition and had few advanced components. Several Penetrators were captured by mercenary units during the FedCom Civil War. According to rumors, Kallon Industries may soon change its policy of only selling the design to the Federated Commonwealth and now the Federated Suns. + +manufacturer:Kallon Weapon Industries +primaryfactory:Talon (Wernke) +systemmanufacturer:CHASSIS:Crucis G +systemmanufacturer:ENGINE:Vlar 300 +systemmanufacturer:ARMOR:Durallex Heavy +systemmanufacturer:JUMPJET:Anderson 398 +systemmanufacturer:COMMUNICATIONS:Dalban Micronics with ECM +systemmanufacturer:TARGETING:Matabushi Sentinel diff --git a/megamek/data/mechfiles/mechs/3055U/Penetrator PTR-6T.mtf b/megamek/data/mechfiles/mechs/3055U/Penetrator PTR-6T.mtf index b1dc3dd634d..fb55024f409 100644 --- a/megamek/data/mechfiles/mechs/3055U/Penetrator PTR-6T.mtf +++ b/megamek/data/mechfiles/mechs/3055U/Penetrator PTR-6T.mtf @@ -154,4 +154,20 @@ Jump Jet -Empty- -Empty- +overview:The designers at Kallon Industries used the Black Hawk Clan OmniMech as the basis for the Penetrator. +capabilities:The Penetrator has an all energy weapons arsenal and uses twelve double heat sinks to handle the massive heat load from its weapons. The 'Mech is lacking in speed though when compared to the Black Hawk. This is because the 'Mechs designers used a Vlar 300 fusion engine for its combat durability, giving the 'Mech a top speed of 64.8 km/h. To help offset the 'Mech's lack of mobility, the Penetrator has four Anderson 398 jump jets giving it added mobility with a jumping distance of one hundred and twenty meters. The Penetrator also carries a respectable thirteen tons of armor. The 'Mech's heavy armor protection, +combined with its standard engine and unlimited amounts of ammunition, make for a 'Mech that is very rugged and hard to kill. + +deployment:The 6T variant of the Penetrator is a field modification that replaces the six Medium Pulse Lasers with six ER Medium Lasers. The 'Mech then adds an advanced Targeting Computer, making its ER Large Lasers more accurate and making the ER Medium Lasers similar in accuracy to the Medium Pulse Lasers at longer ranges. The 'Mech has also had two additional double heat sinks added to help with the increased heat output. + +history:With the threat of the Clans looming over it, the Federated Commonwealth dispatched a large number of Penetrators to units stationed in Lyran space. Following the secession of the Commonwealth's Lyran half and the formation of the Lyran Alliance under Katherine Steiner-Davion in 3058, many Penetrators ended up on the LAAF's rolls. Penetrators served on both sides of the FedCom Civil War, demonstrating their toughness yet again. The 'Mech's low reliance on ammunition made it ideal for the mobile campaigns that defined that conflict. Archer's Avengers and other allied forces conducted a planet-hopping campaign, always staying one step ahead of the Loyalist forces pursuing them. The Avengers had to live off the land because reliable supply lines were almost non-existent. The Penetrator was an ideal combat unit because it required little ammunition and had few advanced components. Several Penetrators were captured by mercenary units during the FedCom Civil War. According to rumors, Kallon Industries may soon change its policy of only selling the design to the Federated Commonwealth and now the Federated Suns. + +manufacturer:Field Refit +primaryfactory:Various +systemmanufacturer:CHASSIS:Crucis G +systemmanufacturer:ENGINE:Vlar 300 +systemmanufacturer:ARMOR:Durallex Heavy +systemmanufacturer:JUMPJET:Anderson 398 +systemmanufacturer:COMMUNICATIONS:Dalban Micronics +systemmanufacturer:TARGETING:Matabushi Sentinel diff --git a/megamek/data/mechfiles/mechs/3058Uu/Merlin MLN-1A.mtf b/megamek/data/mechfiles/mechs/3058Uu/Merlin MLN-1A.mtf index 671a4a75182..f287954854f 100644 --- a/megamek/data/mechfiles/mechs/3058Uu/Merlin MLN-1A.mtf +++ b/megamek/data/mechfiles/mechs/3058Uu/Merlin MLN-1A.mtf @@ -151,4 +151,19 @@ Jump Jet -Empty- -Empty- +overview:The Merlin uses components that are all reliable and readily available, making the Merlin a durable and easy-to-repair 'Mech. +capabilities:The 'Mech is powered by a Pitban 240 fusion engine that gives it a top speed of 64.8 km/h. The Merlin carries ten and a half tons of armor, which is a respectable amount of protection for its weight. Additionally, the Merlin carries eighteen heat sinks to handle its heavy heat load. + +deployment:The Merlin is armed to be able to engage an enemy at any range. For long range combat, the 'Mech carries a Magna Hellstar PPC and a Holly LRM-5 launcher. To protect itself at medium to short ranges, a pair of Martell Model 5 medium lasers provide the Merlin with respectable short range firepower. Finally, to protect the 'Mech against infantry attacks, the Merlin has a Zippo Flamer and a Sperry Browning Machine Gun. Four Pitban LFT-50 series jump jets allow the 'Mech to travel up to 120 meters in the air. + +history:The Merlin debuted in 3010 as a product of the rebuilt Mountain Wolf BattleMechs. The Merlin was hailed as a technological marvel at the time it was released, as it was the first completely new design to be developed in over 100 years. + +manufacturer:Mountain Wolf BattleMechs, Vandenberg Mechanized Industries +primaryfactory:Alpheratz, New Vandenberg +systemmanufacturer:CHASSIS:Heavy Star QAT-4 +systemmanufacturer:ENGINE:Pitban 240 +systemmanufacturer:ARMOR:Longanecker PlastiSteel +systemmanufacturer:JUMPJET:Pitban LFT 50 +systemmanufacturer:COMMUNICATIONS:Magestrix Alpha +systemmanufacturer:TARGETING:Magestrix Gamma diff --git a/megamek/data/mechfiles/mechs/3058Uu/Merlin MLN-1B.mtf b/megamek/data/mechfiles/mechs/3058Uu/Merlin MLN-1B.mtf index b7b59ef4aa9..c4f7151fae6 100644 --- a/megamek/data/mechfiles/mechs/3058Uu/Merlin MLN-1B.mtf +++ b/megamek/data/mechfiles/mechs/3058Uu/Merlin MLN-1B.mtf @@ -150,4 +150,19 @@ Jump Jet -Empty- -Empty- +overview:The Merlin uses components that are all reliable and readily available, making the Merlin a durable and easy-to-repair 'Mech. +capabilities:The 'Mech is powered by a Pitban 240 fusion engine that gives it a top speed of 64.8 km/h. The Merlin carries ten and a half tons of armor, which is a respectable amount of protection for its weight. Additionally, the Merlin carries eighteen heat sinks to handle its heavy heat load. + +deployment:The 1B variant introduced in 3053 removes the Machine Gun and its ammunition and replaces them with an additional heat sink to help handle the Merlin's heat load. + +history:The Merlin debuted in 3010 as a product of the rebuilt Mountain Wolf BattleMechs. The Merlin was hailed as a technological marvel at the time it was released, as it was the first completely new design to be developed in over 100 years. + +manufacturer:Field Refit +primaryfactory:Various +systemmanufacturer:CHASSIS:Heavy Star QAT-4 +systemmanufacturer:ENGINE:Pitban 240 +systemmanufacturer:ARMOR:Longanecker PlastiSteel +systemmanufacturer:JUMPJET:Pitban LFT 50 +systemmanufacturer:COMMUNICATIONS:Magestrix Alpha +systemmanufacturer:TARGETING:Magestrix Gamma diff --git a/megamek/data/mechfiles/mechs/3058Uu/Merlin MLN-1C.mtf b/megamek/data/mechfiles/mechs/3058Uu/Merlin MLN-1C.mtf index 52bd300b5e7..7870b253f76 100644 --- a/megamek/data/mechfiles/mechs/3058Uu/Merlin MLN-1C.mtf +++ b/megamek/data/mechfiles/mechs/3058Uu/Merlin MLN-1C.mtf @@ -150,4 +150,19 @@ Jump Jet -Empty- -Empty- +overview:The Merlin uses components that are all reliable and readily available, making the Merlin a durable and easy-to-repair 'Mech. +capabilities:The 'Mech is powered by a Pitban 240 fusion engine that gives it a top speed of 64.8 km/h. The Merlin carries ten and a half tons of armor, which is a respectable amount of protection for its weight. Additionally, the Merlin carries eighteen heat sinks to handle its heavy heat load. + +deployment:This field upgrade to the 1B developed by Lushann Industries in 3068 replaces the medium lasers with ER medium lasers. + +history:The Merlin debuted in 3010 as a product of the rebuilt Mountain Wolf BattleMechs. The Merlin was hailed as a technological marvel at the time it was released, as it was the first completely new design to be developed in over 100 years. + +manufacturer:Field Refit +primaryfactory:Various +systemmanufacturer:CHASSIS:Heavy Star QAT-4 +systemmanufacturer:ENGINE:Pitban 240 +systemmanufacturer:ARMOR:Longanecker PlastiSteel +systemmanufacturer:JUMPJET:Pitban LFT 50 +systemmanufacturer:COMMUNICATIONS:Magestrix Alpha +systemmanufacturer:TARGETING:Magestrix Gamma diff --git a/megamek/data/mechfiles/mechs/3058Uu/Starslayer STY-2C.mtf b/megamek/data/mechfiles/mechs/3058Uu/Starslayer STY-2C.mtf index be5b8998642..78ab49f0b38 100644 --- a/megamek/data/mechfiles/mechs/3058Uu/Starslayer STY-2C.mtf +++ b/megamek/data/mechfiles/mechs/3058Uu/Starslayer STY-2C.mtf @@ -151,4 +151,19 @@ Ferro-Fibrous -Empty- -Empty- +overview:The Starslayer was intended to replace the Crab as the Star League's standard medium 'Mech after Cosara Weaponries were unable to meet the SLDF's required production volumes. +capabilities:The Starslayer is built on a Thor-4 chassis and reaches a top speed of 86.4 km/h with its Magna 250 fusion engine. The Starslayer also has five Odin's Own Model 34z jump jets which give it the ability to jump up to one hundred and fifty meters. Finally, the design carries nine and a half tons of Norse-34 ferro-fibrous with CASE. The CASE protects the BattleMech from complete destruction in the event of an ammunition explosion. + +deployment:The original Starslayer, introduced in 2772, used a standard chassis and only mounted seven tons of ferro-fibrous armor, carrying an array of lasers developed in-house by Blueshot including Blueshot large lasers, Razzing Devil medium lasers and a Blueshot Standard small laser. Only the Moonshot missile rack had to be licensed for manufacture + +history:Though Blue Shot's design won selection in 2765, the Starslayer would also be plagued with technical delays with its tracking system that would delay full production until 2772 and the Amaris Civil War. Despite the SLDF's desperate need for matériel, tensions between General Kerensky and Archon Robert Steiner II would result in Blue Shot delaying SLDF shipments until 2781 due to lack of "up-to-date" shipping information and as a result the Starslayer would be far more common in the LCAF service than the SLDF. By now a thoroughly Lyran Commonwealth design, production of the original 2C Starslayer would cease during the technological decline of the early Succession Wars, with Blue Shot Weaponry resuming with the superior and updated STY-3C model in wake of the Clan Invasion. + +manufacturer:Blue Shot Weapons +primaryfactory:Loxley +systemmanufacturer:CHASSIS:Thor-4 +systemmanufacturer:ENGINE:Magna 250 +systemmanufacturer:ARMOR:Norse-34 Ferro-Fibrous with CASE +systemmanufacturer:JUMPJET:Odin’s Own Model 34z +systemmanufacturer:COMMUNICATIONS:Tek BattleCom +systemmanufacturer:TARGETING:FireScan with IndirecTrack diff --git a/megamek/data/mechfiles/mechs/3058Uu/Starslayer STY-3C.mtf b/megamek/data/mechfiles/mechs/3058Uu/Starslayer STY-3C.mtf index 87b2bfa6409..2bddc0e9ff6 100644 --- a/megamek/data/mechfiles/mechs/3058Uu/Starslayer STY-3C.mtf +++ b/megamek/data/mechfiles/mechs/3058Uu/Starslayer STY-3C.mtf @@ -151,4 +151,19 @@ Ferro-Fibrous -Empty- -Empty- +overview:The Starslayer was intended to replace the Crab as the Star League's standard medium 'Mech after Cosara Weaponries were unable to meet the SLDF's required production volumes. +capabilities:The Starslayer is built on a lightweight Thor-4 Endo Steel chassis and reaches a top speed of 86.4 km/h with its Magna 250 fusion engine. The Starslayer also has five Odin's Own Model 34z jump jets which give it the ability to jump up to one hundred and fifty meters. Finally, the design carries nine and a half tons of Norse-34 ferro-fibrous with CASE. The CASE protects the BattleMech from complete destruction in the event of an ammunition explosion. + +deployment:The primary weapons on the Starslayer are a pair of BlazeFire Systems Large Lasers that provide the 'Mech with a striking distance of up to four hundred and fifty meters. For close range combat, the Starslayer has two Defiance B3M medium lasers and a Defiance B4M small laser. Finally, to allow the Starslayer to find and exploit weak points in an enemy's armor, it also carries a TharHes 4 Pack SRM-4 launcher. The FireScan T&T system of the 3C and 3D is imported from Richvale. Normally used on LRM and SRM Carriers, the system seem incompatible with laser weaponry until computer add-ons fixed the issue. + +history:Though Blue Shot's design won selection in 2765, the Starslayer would also be plagued with technical delays with its tracking system that would delay full production until 2772 and the Amaris Civil War. Despite the SLDF's desperate need for matériel, tensions between General Kerensky and Archon Robert Steiner II would result in Blue Shot delaying SLDF shipments until 2781 due to lack of "up-to-date" shipping information and as a result the Starslayer would be far more common in the LCAF service than the SLDF. By now a thoroughly Lyran Commonwealth design, production of the original 2C Starslayer would cease during the technological decline of the early Succession Wars, with Blue Shot Weaponry resuming with the superior and updated STY-3C model in wake of the Clan Invasion. + +manufacturer:Blue Shot Weapons +primaryfactory:Loxley +systemmanufacturer:CHASSIS:Thor-4 Endo Steel +systemmanufacturer:ENGINE:Magna 250 +systemmanufacturer:ARMOR:Norse-34 Ferro-Fibrous with CASE +systemmanufacturer:JUMPJET:Odin’s Own Model 34z +systemmanufacturer:COMMUNICATIONS:Tek BattleCom +systemmanufacturer:TARGETING:FireScan with IndirecTrack diff --git a/megamek/data/mechfiles/mechs/3058Uu/Starslayer STY-3D.mtf b/megamek/data/mechfiles/mechs/3058Uu/Starslayer STY-3D.mtf index 6e320f18a72..df549294a24 100644 --- a/megamek/data/mechfiles/mechs/3058Uu/Starslayer STY-3D.mtf +++ b/megamek/data/mechfiles/mechs/3058Uu/Starslayer STY-3D.mtf @@ -150,4 +150,19 @@ Ferro-Fibrous -Empty- -Empty- +overview:The Starslayer was intended to replace the Crab as the Star League's standard medium 'Mech after Cosara Weaponries were unable to meet the SLDF's required production volumes. +capabilities:The Starslayer is built on a lightweight Thor-4 Endo Steel chassis and reaches a top speed of 86.4 km/h with its Magna 250 fusion engine. The Starslayer also has five Odin's Own Model 34z jump jets which give it the ability to jump up to one hundred and fifty meters. Finally, the design carries nine and a half tons of Norse-34 ferro-fibrous with CASE. The CASE protects the BattleMech from complete destruction in the event of an ammunition explosion. + +deployment:The 3D variant of the Starslayer is intended to allow the 'Mech to better engage an enemy at long ranges. By removing the SRM-4, the 3D is able to upgrade the large laser to an ER PPC, upgrade the small laser to a medium laser, and add an extra double heat sink. + +history:Though Blue Shot's design won selection in 2765, the Starslayer would also be plagued with technical delays with its tracking system that would delay full production until 2772 and the Amaris Civil War. Despite the SLDF's desperate need for matériel, tensions between General Kerensky and Archon Robert Steiner II would result in Blue Shot delaying SLDF shipments until 2781 due to lack of "up-to-date" shipping information and as a result the Starslayer would be far more common in the LCAF service than the SLDF. By now a thoroughly Lyran Commonwealth design, production of the original 2C Starslayer would cease during the technological decline of the early Succession Wars, with Blue Shot Weaponry resuming with the superior and updated STY-3C model in wake of the Clan Invasion. + +manufacturer:Blue Shot Weapons +primaryfactory:Loxley +systemmanufacturer:CHASSIS:Thor-4 Endo Steel +systemmanufacturer:ENGINE:Magna 250 +systemmanufacturer:ARMOR:Norse-34 Ferro-Fibrous with CASE +systemmanufacturer:JUMPJET:Odin’s Own Model 34z +systemmanufacturer:COMMUNICATIONS:Tek BattleCom +systemmanufacturer:TARGETING:FireScan with IndirecTrack diff --git a/megamek/data/mechfiles/mechs/3085u/ONN/Gunslinger GUN-2ERDr.mtf b/megamek/data/mechfiles/mechs/3085u/ONN/Gunslinger GUN-2ERDr.mtf index 86018629ad1..98d3a52255c 100644 --- a/megamek/data/mechfiles/mechs/3085u/ONN/Gunslinger GUN-2ERDr.mtf +++ b/megamek/data/mechfiles/mechs/3085u/ONN/Gunslinger GUN-2ERDr.mtf @@ -6,7 +6,7 @@ mul id:1350 Config:Biped TechBase:Inner Sphere Era:3078 -Source:Jihad +source:TRO:CI - Jihad Rules Level:4 Mass:85 @@ -153,4 +153,19 @@ Jump Jet -Empty- -Empty- +overview:The Clan invasion produced some strange bedfellows, the most unlikely of which was the Federated Commonwealth-Draconis Combine quasi-alliance. Though that relationship has deteriorated over the years, the Gunslinger stands as a testament to what can happen when two bitter enemies put aside their mutual hatred and work together to achieve a common goal. +capabilities:To power the Gunslinger, a VOX 255 XL engine is used to give the 'Mech a top speed of 54 km/h. This is augmented by a pair of HildCo Model 12 jump jets that allow the Gunslinger to traverse rough terrain and provide extra mobility at close ranges. The 'Mech is also equipped with a Guardian ECM Suite and a Beagle Active Probe, giving the Gunslinger superior detection capabilities and protection from advanced enemy electronic warfare equipment. Finally, the Gunslinger is protected by fifteen and a half tons of armor, giving the 'Mech excellent armor protection. + +deployment:This Gunslinger field refit replaces the C3 master computer and ECM with a then experimental C3 boosted master computer to cut through ECM commonly found during the Jihad in 3078. An ER Small Laser also is added to the head. + +history:On December 5, 3053, the first FedCom Gunslinger rolled off the assembly line at Defiance Industries. Because of issues with the Gauss weapons, it took nearly two years for the first Combine Gunslinger to leave the Quentin plant. Since then, both plants have built as many Gunslingers as they possibly can each year, severely taxing their resources while breaking production records year after year. Beginning with Operation Guerrero in 3057 and the Lyran Alliance's Jade Falcon invasion in 3058, the Gunslinger demonstrated its capabilities, as it has in every other significant military operation in the Inner Sphere since. As a result, the Gunslinger is still in high demand. + +manufacturer:Defiance Industries, Independence Weaponry +primaryfactory:Hesperus II,Quentin +systemmanufacturer:CHASSIS:Star League XT +systemmanufacturer:ENGINE:VOX 255 XL +systemmanufacturer:ARMOR:Kevlar 5000 +systemmanufacturer:JUMPJET:HildCo Model 12 +systemmanufacturer:COMMUNICATIONS:Nashan Quartet ComSy with Guardian ECM +systemmanufacturer:TARGETING:Nashan Diana Mark II Targeting Computer diff --git a/megamek/data/mechfiles/mechs/3085u/ONN/Nightsky NGS-6T.mtf b/megamek/data/mechfiles/mechs/3085u/ONN/Nightsky NGS-6T.mtf index e3fda49047c..b42e6262394 100644 --- a/megamek/data/mechfiles/mechs/3085u/ONN/Nightsky NGS-6T.mtf +++ b/megamek/data/mechfiles/mechs/3085u/ONN/Nightsky NGS-6T.mtf @@ -152,4 +152,19 @@ Jump Jet -Empty- -Empty- +overview:The Nightsky was a mid-range continuation of the Federated Commonwealth's successful Hatchetman-Axman series, which established melee combat weapons as a powerful and heat-efficient close-combat option for the experienced MechWarrior. Intended to provide both speed and firepower. +capabilities:The Nightsky is built around a massive Vlar 300 XL extralight engine that propels the 'Mech up to speeds of 97.2 km/h. Superb ground speed and the added maneuverability provided by six HildCo Model 13 jump jets that allow the Nightsky to jump up to 180 meters make the Nightsky a capable heavy recon 'Mech. It is also protected with nine and a half tons of armor, providing the Nightsky with good armor protection for its size. + +deployment:This variant of the Nightsky uses Triple Strength Myomer to maximize physical attack damage. It also uses one ER medium laser and a pair of ER small lasers. To make room for those weapons, it loses a medium pulse laser. + +history:After their introduction in 3053, Nightskys quickly proliferated throughout the Federated Commonwealth, with many replacing Hatchetmen or Axmen lost in the early years of the Clan invasion. The distribution of this design had become fairly even between the two once-allied states by the time of the Lyran secession from the Commonwealth, resulting in Nightskys appearing among as many pro-Victor Davion troops as pro-Katherine Steiner forces during the FedCom Civil War. + +manufacturer:Defiance Industries (Refit) +primaryfactory:Furillo +systemmanufacturer:CHASSIS:Dorwinion Standard +systemmanufacturer:ENGINE:Vlar 300 XL +systemmanufacturer:ARMOR:Kallon Royalstar +systemmanufacturer:JUMPJET:HildCo Model 13 +systemmanufacturer:COMMUNICATIONS:TharHes Calliope Hm10 +systemmanufacturer:TARGETING:TharHes Ares-8a diff --git a/megamek/data/mechfiles/mechs/3085u/ONN/Starslayer STY-3Dr.mtf b/megamek/data/mechfiles/mechs/3085u/ONN/Starslayer STY-3Dr.mtf index a6fb5ee1190..b40744bb0d6 100644 --- a/megamek/data/mechfiles/mechs/3085u/ONN/Starslayer STY-3Dr.mtf +++ b/megamek/data/mechfiles/mechs/3085u/ONN/Starslayer STY-3Dr.mtf @@ -149,4 +149,19 @@ Light Ferro-Fibrous -Empty- -Empty- +overview:The Starslayer was intended to replace the Crab as the Star League's standard medium 'Mech after Cosara Weaponries were unable to meet the SLDF's required production volumes. +capabilities:The Starslayer is built on a lightweight Thor-4 Endo Steel chassis and reaches a top speed of 86.4 km/h with its Magna 250 fusion engine. The Starslayer also has five Odin's Own Model 34z jump jets which give it the ability to jump up to one hundred and fifty meters. Finally, the design carries nine and a half tons of Norse-34 ferro-fibrous with CASE. The CASE protects the BattleMech from complete destruction in the event of an ammunition explosion. + +deployment:A heavy PPC forms the main gun for this variant. A Guardian ECM suite disrupts any C3 networks in the area. Turning the heat of the PPC into an asset, the Starslayer uses triple strength myomer to inflict heavy damage at close range. Light ferro-fibrous armor protects this 'Mech. + +history:Though Blue Shot's design won selection in 2765, the Starslayer would also be plagued with technical delays with its tracking system that would delay full production until 2772 and the Amaris Civil War. Despite the SLDF's desperate need for matériel, tensions between General Kerensky and Archon Robert Steiner II would result in Blue Shot delaying SLDF shipments until 2781 due to lack of "up-to-date" shipping information and as a result the Starslayer would be far more common in the LCAF service than the SLDF. By now a thoroughly Lyran Commonwealth design, production of the original 2C Starslayer would cease during the technological decline of the early Succession Wars, with Blue Shot Weaponry resuming with the superior and updated STY-3C model in wake of the Clan Invasion. + +manufacturer:Field Refit +primaryfactory:Various +systemmanufacturer:CHASSIS:Thor-4 Endo Steel +systemmanufacturer:ENGINE:Magna 250 +systemmanufacturer:ARMOR:Unknown +systemmanufacturer:JUMPJET:Odin’s Own Model 34z +systemmanufacturer:COMMUNICATIONS:Tek BattleCom with ECM +systemmanufacturer:TARGETING:FireScan with IndirecTrack diff --git a/megamek/data/mechfiles/mechs/Golden Century/Starslayer STY-2C-EC.mtf b/megamek/data/mechfiles/mechs/Golden Century/Starslayer STY-2C-EC.mtf index 6d6f29701c6..7586cba29a5 100644 --- a/megamek/data/mechfiles/mechs/Golden Century/Starslayer STY-2C-EC.mtf +++ b/megamek/data/mechfiles/mechs/Golden Century/Starslayer STY-2C-EC.mtf @@ -151,5 +151,20 @@ IS Ferro-Fibrous -Empty- -Empty- -history:An interim design built by the Nova Cats, the BattleMech’s lasers were all swapped for improved or early clan prototypes to support the new Streak 4 system won from the Star Adders. +overview:The Starslayer was intended to replace the Crab as the Star League's standard medium 'Mech after Cosara Weaponries were unable to meet the SLDF's required production volumes. + +capabilities:The Starslayer is built on a lightweight Thor-4 Endo Steel chassis and reaches a top speed of 86.4 km/h with its Magna 250 fusion engine. The Starslayer also has five Odin's Own Model 34z jump jets which give it the ability to jump up to one hundred and fifty meters. Finally, the design carries nine and a half tons of Norse-34 ferro-fibrous with CASE. The CASE protects the BattleMech from complete destruction in the event of an ammunition explosion. + +deployment:An interim design built by the Nova Cats, the BattleMech’s lasers were all swapped for improved or early Clan prototypes to support the new Streak 4 system won from the Star Adders. + +history:Though Blue Shot's design won selection in 2765, the Starslayer would also be plagued with technical delays with its tracking system that would delay full production until 2772 and the Amaris Civil War. Despite the SLDF's desperate need for matériel, tensions between General Kerensky and Archon Robert Steiner II would result in Blue Shot delaying SLDF shipments until 2781 due to lack of "up-to-date" shipping information and as a result the Starslayer would be far more common in the LCAF service than the SLDF. By now a thoroughly Lyran Commonwealth design, production of the original 2C Starslayer would cease during the technological decline of the early Succession Wars, with Blue Shot Weaponry resuming with the superior and updated STY-3C model in wake of the Clan Invasion. + +manufacturer:Brim Ironworks +primaryfactory:Brim +systemmanufacturer:CHASSIS:Thor-4 +systemmanufacturer:ENGINE:Magna 250 +systemmanufacturer:ARMOR:Norse-34 Ferro-Fibrous with CASE +systemmanufacturer:JUMPJET:Odin’s Own Model 34z +systemmanufacturer:COMMUNICATIONS:Tek BattleCom +systemmanufacturer:TARGETING:FireScan with IndirecTrack diff --git a/megamek/data/mechfiles/mechs/RS Unique/Gunslinger Jared.mtf b/megamek/data/mechfiles/mechs/RS Unique/Gunslinger Jared.mtf index 1bf8dd3cf39..c3fc3057e16 100644 --- a/megamek/data/mechfiles/mechs/RS Unique/Gunslinger Jared.mtf +++ b/megamek/data/mechfiles/mechs/RS Unique/Gunslinger Jared.mtf @@ -6,6 +6,7 @@ mul id:1348 Config:Biped TechBase:Inner Sphere Era:3063 +source:RS:Unique Mechs - Civil War Rules Level:2 Mass:85 @@ -140,3 +141,20 @@ Lower Leg Actuator Foot Actuator -Empty- ISMediumPulseLaser (R) + +overview:The Clan invasion produced some strange bedfellows, the most unlikely of which was the Federated Commonwealth-Draconis Combine quasi-alliance. Though that relationship has deteriorated over the years, the Gunslinger stands as a testament to what can happen when two bitter enemies put aside their mutual hatred and work together to achieve a common goal. + +capabilities:To power the Gunslinger, a VOX 255 XL engine is used to give the 'Mech a top speed of 54 km/h. This is augmented by a pair of HildCo Model 12 jump jets that allow the Gunslinger to traverse rough terrain and provide extra mobility at close ranges. The 'Mech is also equipped with a Guardian ECM Suite and a Beagle Active Probe, giving the Gunslinger superior detection capabilities and protection from advanced enemy electronic warfare equipment. Finally, the Gunslinger is protected by fifteen and a half tons of armor, giving the 'Mech excellent armor protection. + +deployment:This Gunslinger was uniquely customized for Lyran Alliance MechWarrior Jared Killian. The Gunslinger's arms were replaced with a pair of Zeus right arms. Each arm included Coventry Star Fire LRM-15 Launchers and Guided Technologies 2nd Gen Streak SRM 4 Launchers. The 'Mech's ammunition was placed in the side torsos. + +history:On December 5, 3053, the first FedCom Gunslinger rolled off the assembly line at Defiance Industries. Because of issues with the Gauss weapons, it took nearly two years for the first Combine Gunslinger to leave the Quentin plant. Since then, both plants have built as many Gunslingers as they possibly can each year, severely taxing their resources while breaking production records year after year. Beginning with Operation Guerrero in 3057 and the Lyran Alliance's Jade Falcon invasion in 3058, the Gunslinger demonstrated its capabilities, as it has in every other significant military operation in the Inner Sphere since. As a result, the Gunslinger is still in high demand. + +manufacturer:Field Refit +primaryfactory:Various +systemmanufacturer:CHASSIS:Star League XT +systemmanufacturer:ENGINE:VOX 255 XL +systemmanufacturer:ARMOR:Kevlar 5000 +systemmanufacturer:JUMPJET:HildCo Model 12 +systemmanufacturer:COMMUNICATIONS:Nashan Quartet ComSy with Guardian ECM +systemmanufacturer:TARGETING:Nashan Diana Mark II Targeting Computer \ No newline at end of file diff --git a/megamek/data/mechfiles/mechs/RS Unique/Merlin Porter.mtf b/megamek/data/mechfiles/mechs/RS Unique/Merlin Porter.mtf index 465def2d9b9..21542ee4e5c 100644 --- a/megamek/data/mechfiles/mechs/RS Unique/Merlin Porter.mtf +++ b/megamek/data/mechfiles/mechs/RS Unique/Merlin Porter.mtf @@ -2,6 +2,7 @@ Version:1.1 Merlin MLN-1B (Porter) mul id:2179 +source:RS:Unique Mechs-Civil War Config:Biped TechBase:Inner Sphere @@ -129,3 +130,20 @@ Lower Leg Actuator Foot Actuator Jump Jet Jump Jet + +overview:The Merlin uses components that are all reliable and readily available, making the Merlin a durable and easy-to-repair 'Mech. + +capabilities:The 'Mech is powered by a Pitban 240 fusion engine that gives it a top speed of 64.8 km/h. The Merlin carries ten and a half tons of armor, which is a respectable amount of protection for its weight. Additionally, the Merlin carries eighteen heat sinks to handle its heavy heat load. + +deployment:A uniquely customized Merlin introduced in 3064, which was created by a tech named Porter Romero on the world Armington. He salvaged the 'Mech from a pirate raid during the 3060s. Using a wrecked militia Bulldog for parts, he replaced the ruined PPC and LRM-5 with the tank's Large Laser and SRM 4 Launcher as well as adding additional armor. + +history:The Merlin debuted in 3010 as a product of the rebuilt Mountain Wolf BattleMechs. The Merlin was hailed as a technological marvel at the time it was released, as it was the first completely new design to be developed in over 100 years. + +manufacturer:Mountain Wolf BattleMechs, Vandenberg Mechanized Industries +primaryfactory:Alpheratz, New Vandenberg +systemmanufacturer:CHASSIS:Heavy Star QAT-4 +systemmanufacturer:ENGINE:Pitban 240 +systemmanufacturer:ARMOR:Longanecker PlastiSteel with CASE +systemmanufacturer:JUMPJET:Pitban LFT 50 +systemmanufacturer:COMMUNICATIONS:Magestrix Alpha +systemmanufacturer:TARGETING:Magestrix Gamma \ No newline at end of file diff --git a/megamek/data/mechfiles/mechs/Recognition Guide ilClan/Vol 10/Archer C.mtf b/megamek/data/mechfiles/mechs/Recognition Guide ilClan/Vol 10/Archer C.mtf index 4c82b633e9f..680c164cd78 100644 --- a/megamek/data/mechfiles/mechs/Recognition Guide ilClan/Vol 10/Archer C.mtf +++ b/megamek/data/mechfiles/mechs/Recognition Guide ilClan/Vol 10/Archer C.mtf @@ -5,7 +5,7 @@ mul id:90 Config:Biped techbase:Mixed (IS Chassis) -era:3050 +era:2824 source:Rec Guide:ilClan #10 - Clan Invasion rules level:3 diff --git a/megamek/data/mechfiles/mechs/Recognition Guide ilClan/Vol 12/Shadow Hawk C.mtf b/megamek/data/mechfiles/mechs/Recognition Guide ilClan/Vol 12/Shadow Hawk C.mtf index 0907d076bc8..e5afe710a31 100644 --- a/megamek/data/mechfiles/mechs/Recognition Guide ilClan/Vol 12/Shadow Hawk C.mtf +++ b/megamek/data/mechfiles/mechs/Recognition Guide ilClan/Vol 12/Shadow Hawk C.mtf @@ -5,7 +5,7 @@ mul id:2895 Config:Biped techbase:Mixed (IS Chassis) -era:3050 +era:2826 source:Rec Guide:ilClan #12 - Clan Invasion rules level:3 diff --git a/megamek/data/mechfiles/mechs/Recognition Guide ilClan/Vol 26/Caesar CES-5R.mtf b/megamek/data/mechfiles/mechs/Recognition Guide ilClan/Vol 26/Caesar CES-5R.mtf new file mode 100644 index 00000000000..b7664ef1f39 --- /dev/null +++ b/megamek/data/mechfiles/mechs/Recognition Guide ilClan/Vol 26/Caesar CES-5R.mtf @@ -0,0 +1,170 @@ +Version:1.3 +Caesar +CES-5R +mul id:9321 +Config:Biped +techbase:Inner Sphere +era:3148 +source:Rec Guide:ilClan #26 - Dark Age +rules level:3 + +mass:70 +engine:280 XL Engine(IS) +structure:IS Endo Steel +myomer:Standard +cockpit:Standard Cockpit +gyro:XL Gyro + +heat sinks:10 IS Double +walk mp:4 +jump mp:0 + +armor:Hardened(Inner Sphere) +LA armor:22 +RA armor:22 +LT armor:22 +RT armor:22 +CT armor:30 +HD armor:9 +LL armor:27 +RL armor:27 +RTL armor:8 +RTR armor:8 +RTC armor:11 + +Weapons:6 +ER Medium Laser, Right Arm +ER Medium Laser, Left Torso +ER Medium Laser, Right Torso +ER Medium Laser, Left Arm +Gauss Rifle, Right Torso +Snub-Nose PPC, Right Arm + +Left Arm: +Shoulder +Upper Arm Actuator +Lower Arm Actuator +Hand Actuator +ISERMediumLaser +IS Endo Steel +IS Endo Steel +IS Endo Steel +IS Endo Steel +IS Endo Steel +-Empty- +-Empty- + +Right Arm: +Shoulder +Upper Arm Actuator +Lower Arm Actuator +Hand Actuator +ISSNPPC +ISSNPPC +ISERMediumLaser +IS Endo Steel +IS Endo Steel +IS Endo Steel +IS Endo Steel +-Empty- + +Left Torso: +Fusion Engine +Fusion Engine +Fusion Engine +ISERMediumLaser (R) +IS Gauss Ammo +IS Gauss Ammo +IS Endo Steel +IS Endo Steel +IS Endo Steel +IS Endo Steel +IS Endo Steel +-Empty- + +Right Torso: +Fusion Engine +Fusion Engine +Fusion Engine +ISGaussRifle +ISGaussRifle +ISGaussRifle +ISGaussRifle +ISGaussRifle +ISGaussRifle +ISGaussRifle +ISERMediumLaser (R) +ISCASEII + +Center Torso: +Fusion Engine +Fusion Engine +Fusion Engine +Gyro +Gyro +Gyro +Gyro +Gyro +Gyro +Fusion Engine +Fusion Engine +Fusion Engine + +Head: +Life Support +Sensors +Cockpit +-Empty- +Sensors +Life Support +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- + +Left Leg: +Hip +Upper Leg Actuator +Lower Leg Actuator +Foot Actuator +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- + +Right Leg: +Hip +Upper Leg Actuator +Lower Leg Actuator +Foot Actuator +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- + +overview:Originally a reverse engineered version of the Capellan Confederation's Cataphract intended to mask development of the Federated Commonwealth's fearsome Axman, the Caesar would turn out to be a good but not great BattleMech in its own right. + +capabilities:The Caesar was built to do as much damage to an enemy at as great a stand-off range as possible. The 'Mech therefore carries primarily long-ranged armament. The 'Mech also uses an 280-rated XL engine and sixteen double heat sinks, both of which save significant amounts of weight, in order to carry as many weapons and as much armor as possible. The 'Mech utilizes CASE to protect against ammunition explosions should an enemy be able to breach the ten and a half tons of armor that protect it. + +deployment:No Information on this variant + +history:Supposedly the sole design intended to come out of Johnston Industries' then-new 'Mech lines on New Syrtis, the Caesar received notable public attention in an attempt to distract from development of the Axman. The finished 'Mech surprisingly enough proved to be a high-quality design itself. Though never attracting great sales, the Caesar would prove to be relatively popular in the Capellan March, among Lyran units on the Clan front, and with both FedCom-employed mercenaries and the Com Guards. Johnston attempted to redress its mediocre sales in the wake of the FedCom Civil War, developing two new variants intended to focus specifically on the qualities desired by the Lyran Alliance and Federated Suns. The resulting upswing in sales saw the Caesar in increasing use among those opposing the Word of Blake during the Jihad, with the LAAF in particular adopting the design almost as a means of honoring the assassinated Caesar Steiner. + +manufacturer:Johnston Industries +primaryfactory:New Syrtis +systemmanufacturer:CHASSIS:Dorwinion CES Standard +systemmanufacturer:ENGINE:GM 280 Extralight +systemmanufacturer:ARMOR:Kallon Royalstar with CASE +systemmanufacturer:COMMUNICATIONS:Johnston Wide Band +systemmanufacturer:TARGETING:Randar Pinpoint-HY + diff --git a/megamek/data/mechfiles/mechs/Recognition Guide ilClan/Vol 26/Flea FLE-21.mtf b/megamek/data/mechfiles/mechs/Recognition Guide ilClan/Vol 26/Flea FLE-21.mtf new file mode 100644 index 00000000000..47c7f99d13b --- /dev/null +++ b/megamek/data/mechfiles/mechs/Recognition Guide ilClan/Vol 26/Flea FLE-21.mtf @@ -0,0 +1,161 @@ +Version:1.3 +Flea +FLE-21 +mul id:9313 +Config:Biped +techbase:Inner Sphere +era:3139 +source:Rec Guide:ilClan #26 - Dark Age +rules level:2 + +mass:20 +engine:180 Light Engine(IS) +structure:IS Endo Steel +myomer:Standard + +heat sinks:10 IS Double +walk mp:9 +jump mp:0 + +armor:Stealth(Inner Sphere) +LA armor:4 +RA armor:4 +LT armor:5 +RT armor:5 +CT armor:8 +HD armor:5 +LL armor:4 +RL armor:4 +RTL armor:3 +RTR armor:3 +RTC armor:3 + +Weapons:3 +ER Medium Laser, Left Arm +ER Medium Laser, Right Arm +ER Flamer, Center Torso + +Left Arm: +Shoulder +Upper Arm Actuator +ISERMediumLaser +IS Endo Steel +IS Endo Steel +IS Endo Steel +IS Endo Steel +IS Stealth +IS Stealth +-Empty- +-Empty- +-Empty- + +Right Arm: +Shoulder +Upper Arm Actuator +ISERMediumLaser +IS Endo Steel +IS Endo Steel +IS Endo Steel +IS Endo Steel +IS Stealth +IS Stealth +-Empty- +-Empty- +-Empty- + +Left Torso: +Fusion Engine +Fusion Engine +ISDoubleHeatSink +ISDoubleHeatSink +ISDoubleHeatSink +ISDoubleHeatSink +ISDoubleHeatSink +ISDoubleHeatSink +IS Endo Steel +IS Endo Steel +IS Stealth +IS Stealth + +Right Torso: +Fusion Engine +Fusion Engine +ISDoubleHeatSink +ISDoubleHeatSink +ISDoubleHeatSink +ISGuardianECMSuite +ISGuardianECMSuite +IS Endo Steel +IS Endo Steel +IS Endo Steel +IS Stealth +IS Stealth + +Center Torso: +Fusion Engine +Fusion Engine +Fusion Engine +Gyro +Gyro +Gyro +Gyro +Fusion Engine +Fusion Engine +Fusion Engine +ER Flamer +Supercharger + +Head: +Life Support +Sensors +Cockpit +IS Endo Steel +Sensors +Life Support +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- + +Left Leg: +Hip +Upper Leg Actuator +Lower Leg Actuator +Foot Actuator +IS Stealth +IS Stealth +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- + +Right Leg: +Hip +Upper Leg Actuator +Lower Leg Actuator +Foot Actuator +IS Stealth +IS Stealth +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- + +overview:Focused on speed and firepower, the lightly armored Flea was an extremely rare sight until the arrival of the Wolf's Dragoons mercenary unit, with the design experiencing a revival as an inexpensive recon and anti-personnel militia 'Mech. +capabilities:The Flea's inability to jump makes it difficult to navigate difficult terrain. Its incredible speed, on the other hand, ensures that few 'Mechs of any era can keep up with it in the open. While this Flea has more weaponry than its ultra-light predecessor, its armour is still incapable of withstanding direct combat. The Flea should only engage in hit and run attacks, with experienced MechWarriors focusing on the run aspect. Another specialty of the Flea, especially in large numbers, is incendiary operations behind enemy lines. +deployment:No information available on current variant +history:Initially called the Trooper when it was introduced as the Free Worlds League's first light scout BattleMech in 2475, the design was so heavily flawed that it took 25 years before all the issues were corrected, with a new name selected to escape the bad press. The early prototype was designed by Colonel J. Marcus Llewelyn-Jaymes and his handpicked team at Toddlette Industries in a bid to create a dedicated reconnaissance BattleMech for the Free Worlds League Military. The design was considered highly maneuverable and lightweight at the time, and utilized a basic chassis similar to their larger WorkMechs; the 'Mech's systems appeared straightforward, with a power plant, gyroscope, cockpit, and other critical systems housed in an "armored-box" mounted on reinforced, armored "bird-walker" legs. Only with the help of Col. Llewelyn-Jaymes contacts in the military and government circles, and according to rumors, possible bribery of politicians and decision makers, the FWLM ultimately accepted delivery of the Trooper. While it was considered easy to maintain by technicians and logisticians, it wasn't long before it gained a poor reputation among those that piloted it. Since the design was based off their WorkMechs, it completely lacked any dedicated ejection mechanism, and forced pilots to manually exit should they become disabled. Additionally, the legs proved to be unable to cope with heavy combat, which became apparent in various failed trials before the FWLM's Minister of Defense. Despite these shortcomings, the League's Chief Armorer and Quartermaster General continued purchasing the prototype year after year. This ultimately led to the Trooper being selected as the very first FWLM 'Mech to be upgraded with "modern" technology in 2501 and rechristened as the FLE-4 Flea. While produced on and off until the early Succession Wars, excessive losses of the lightly armored design led Earthwerks to switch its production line to manufacturing heavier designs. This changed with the arrival of Wolf's Dragoons, who brought with them a large number of Fleas and reached an exclusive production arrangement with Earthwerks that resulted in the company opening new lines to replenish the Dragoons' losses in the Fourth Succession War.[9] With multiple lines on Asuncion, Bernardo and Victoria, after letting the Dragoons' exclusivity clause lapse, Earthwerks started selling the easy to manufacture, easy to maintain 'Mech by the DropShip load across the Inner Sphere. Originally produced exclusively for the Dragoons until the Capellan Confederation acquired the design's blueprints via a Maskirovka raid during the 3040s, the post–Helm Memory Core FLE-17 variant is based on the older FLE-15 model. Since the Dragoons used the Flea in a recon role more than an antipersonnel 'Mech, Earthwerks conceived a new design by incorporating recovered technology. Retaining the design's maximum speed of 97.2 km/h, the addition of an endo steel chassis frees up weight for a MASC system that allows the 'Mech's speed to be pushed up to 129.6 km/h in short bursts. The increase of speed is required to ensure survival on the modern battlefield, as the FLE-17 is only clad in a pitiful three tons of Livingston Ceramics armor plating. Once the FLE-17 plans were captured and the Dragoons' contract clause lapsed, Earthwerks began producing the new design almost exclusively for the Confederation until 3053, which saw use within their numerous militias. It was rarely seen among any of the other Great Houses' military, but some sightings did appear after on the mercenary markets with Dragoon serial numbers, which gave some credibility to reports of Wannamaker's Widowmakers operating an extensive salvage operation on Outreach. With the Confederation's later advances in stealth technology and light weaponry, the Flea became a logical test platform for new prototypes. These performed well, which encouraged Earthwerks to refit several older models. +manufacturer:Earthwerks-FWL, Inc., Earthwerks-FWL, Inc., Earthwerks Ltd. +primaryfactory:Asuncion, Bernardo, Grand Base +systemmanufacturer:CHASSIS:Earthwerk Trooper M +systemmanufacturer:ENGINE:Unknown Light Fusion +systemmanufacturer:ARMOR:Livingston Ceramics +systemmanufacturer:COMMUNICATIONS:Neil 2000 +systemmanufacturer:TARGETING:Dalban HiRez-B + diff --git a/megamek/data/mechfiles/mechs/Recognition Guide ilClan/Vol 26/Hermes II HER-7A.mtf b/megamek/data/mechfiles/mechs/Recognition Guide ilClan/Vol 26/Hermes II HER-7A.mtf new file mode 100644 index 00000000000..fc89c7f0d3c --- /dev/null +++ b/megamek/data/mechfiles/mechs/Recognition Guide ilClan/Vol 26/Hermes II HER-7A.mtf @@ -0,0 +1,163 @@ +Version:1.3 +Hermes II +HER-7A +mul id:9314 +Config:Biped +techbase:Mixed (IS Chassis) +era:3120 +source:Rec Guide:ilClan #26 - Late Republic +rules level:2 + +mass:40 +engine:240 Light Engine(IS) +structure:IS Endo Steel +myomer:Standard +cockpit:Standard Cockpit +gyro:XL Gyro + +heat sinks:10 IS Double +walk mp:6 +jump mp:0 + +armor:Standard(Inner Sphere) +LA armor:11 +RA armor:11 +LT armor:14 +RT armor:14 +CT armor:17 +HD armor:9 +LL armor:14 +RL armor:14 +RTL armor:5 +RTR armor:5 +RTC armor:6 + +Weapons:3 +Flamer, Left Arm +Medium X-Pulse Laser, Right Arm +Ultra AC/10, Right Torso + +Left Arm: +Shoulder +Upper Arm Actuator +Lower Arm Actuator +Flamer +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- + +Right Arm: +Shoulder +Upper Arm Actuator +Lower Arm Actuator +Hand Actuator +ISMediumXPulseLaser +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- + +Left Torso: +Fusion Engine +Fusion Engine +ISDoubleHeatSink +ISDoubleHeatSink +ISDoubleHeatSink +IS Endo Steel +IS Endo Steel +IS Endo Steel +IS Endo Steel +IS Endo Steel +IS Endo Steel +IS Endo Steel + +Right Torso: +Fusion Engine +Fusion Engine +CLUltraAC10 +CLUltraAC10 +CLUltraAC10 +CLUltraAC10 +Clan Ultra AC/10 Ammo +Clan Ultra AC/10 Ammo +Clan Ultra AC/10 Ammo +ISCASEII +IS Endo Steel +IS Endo Steel + +Center Torso: +Fusion Engine +Fusion Engine +Fusion Engine +Gyro +Gyro +Gyro +Gyro +Gyro +Gyro +Fusion Engine +Fusion Engine +Fusion Engine + +Head: +Life Support +Sensors +Cockpit +IS Endo Steel +Sensors +Life Support +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- + +Left Leg: +Hip +Upper Leg Actuator +Lower Leg Actuator +Foot Actuator +IS Endo Steel +IS Endo Steel +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- + +Right Leg: +Hip +Upper Leg Actuator +Lower Leg Actuator +Foot Actuator +IS Endo Steel +IS Endo Steel +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- + +overview:The Hermes II was first produced in 2798, based on the original Hermes BattleMech that had been used by the Star League. A heavy scout, the Hermes II boasted respectable weaponry, armoring, and speed, allowing it to easily brawl with lighter 'Mechs or survive an encounter with heavier 'Mechs and retreat. +capabilities:Seven and a half tons of armor provides the Hermes II with good protection, superior to that of the lighter scouting elements it's likely to encounter. The Hermes has respectable cruising speed with enough to scout ahead of the main force, although the heart of this reconnaissance 'Mech is its Irian E.A.R. communications system. Powerful enough to communicate with orbiting satellites, drawbacks to system include its bulk and the required surface area it takes up on the 'Mech in order to function. Out of all medium-weight 'Mechs at the time the Hermes II was the easiest to perform field maintenance on, leading to its nickname "old reliable." +deployment:No information on this variant +history:As combination scout and light strike platforms, Hermes II 'Mechs often operated alone, employed for missions for which lighter 'Mechs were too fragile and heavier 'Mechs too clumsy. The Hermes II was in its element when operating in a restrictive environment like a forest or city, where it could employ a most unusual tactic of setting its surroundings on fire to escape pursuit. Since most 'Mech pilots would naturally avoid a fire to prevent overheating and the flames interfered with most thermal scanners, starting a blaze allowed the Hermes II to more easily slip away. When operating as part of a team the Hermes II was usually paired with 'Mechs sharing similar performance statistics, such as the Vulcan or Phoenix Hawk, but it was also paired with heavier 'Mechs like the Hunchback or Centurion where it served as bait to draw the enemy in to its compatriot's heavier guns. When first produced, the Hermes II had its AC/5 mounted in the center of the torso, although this proved to be disastrous since even a minor hit to the chest rendered the weapon inoperable. A replacement model armed with lasers was temporarily deployed while Irian BattleMechs reworked the design and shifted the weapon to its current placement. The Hermes II stayed in production throughout the Succession Wars, with minor stoppages every time Irian's 'Mech factories were destroyed, and served almost exclusively with the Free Worlds League. A few could be found in the arsenals of the other Great Houses as a result of battlefield salvage, and IBMU was willing to sell the design to mercenary units; the company preferred to sell the 'Mech in large lots but was willing to make small custom orders for a premium. With the slow recovery of lostech Irian was not only able to begin producing the original Hermes again, but also upgrade the Hermes II, building upon the original Star League-era schematics they had saved to create the HER-5S model in 3050. As a result of the Clan Invasion and the accords reached by the Great Houses on Outreach, Irian began selling these upgraded models to the rest of the Inner Sphere. The HER-5S was also used to replace older variants within the Free Worlds League Military as part of a massive upgrade program, with the first models going to elite units such as the Free Worlds Guards and slowly trickling down to other units. This also meant a large number fell into the hands of the Word of Blake and were used on both sides of the Jihad. +manufacturer:Irian BattleMechs Unlimited, Irian BattleMechs Unlimited +primaryfactory:Irian,Shiro III +systemmanufacturer:CHASSIS:Irian Second Generation Class 40 Endo Steel +systemmanufacturer:ENGINE:Unknown Light Fusion +systemmanufacturer:ARMOR:Riese-456 +systemmanufacturer:COMMUNICATIONS:Irian E.A.R. +systemmanufacturer:TARGETING:Wasat Aggressor + diff --git a/megamek/data/mechfiles/mechs/Recognition Guide ilClan/Vol 26/Merlin C.mtf b/megamek/data/mechfiles/mechs/Recognition Guide ilClan/Vol 26/Merlin C.mtf new file mode 100644 index 00000000000..5902ce2b1c2 --- /dev/null +++ b/megamek/data/mechfiles/mechs/Recognition Guide ilClan/Vol 26/Merlin C.mtf @@ -0,0 +1,165 @@ +Version:1.3 +Merlin +C +mul id:9319 +Config:Biped +techbase:Clan +era:3130 +source:Rec Guide:ilClan #26 - Late Republic +rules level:3 + +mass:60 +engine:240 Fusion Engine(IS) +structure:IS Standard +myomer:Standard + +heat sinks:18 Clan Double +walk mp:4 +jump mp:4 + +armor:Ferro-Lamellor(Clan) +LA armor:16 +RA armor:16 +LT armor:18 +RT armor:18 +CT armor:26 +HD armor:9 +LL armor:19 +RL armor:19 +RTL armor:8 +RTR armor:8 +RTC armor:11 + +Weapons:6 +Improved Heavy Medium Laser, Left Arm +Improved Heavy Medium Laser, Right Arm +Heavy Machine Gun, Left Torso +Flamer, Left Torso +ER PPC, Right Torso +Streak LRM 5, Right Torso + +Left Arm: +Shoulder +Upper Arm Actuator +Lower Arm Actuator +CLImprovedMediumHeavyLaser +CLImprovedMediumHeavyLaser +Clan Ferro-Lamellor +Clan Ferro-Lamellor +Clan Ferro-Lamellor +Clan Ferro-Lamellor +Clan Ferro-Lamellor +-Empty- +-Empty- + +Right Arm: +Shoulder +Upper Arm Actuator +Lower Arm Actuator +CLImprovedMediumHeavyLaser +CLImprovedMediumHeavyLaser +Clan Ferro-Lamellor +Clan Ferro-Lamellor +Clan Ferro-Lamellor +Clan Ferro-Lamellor +Clan Ferro-Lamellor +-Empty- +-Empty- + +Left Torso: +CLDoubleHeatSink +CLDoubleHeatSink +CLDoubleHeatSink +CLDoubleHeatSink +CLDoubleHeatSink +CLDoubleHeatSink +CLDoubleHeatSink +CLDoubleHeatSink +CLHeavyMG +CLFlamer +Clan Streak LRM 5 Ammo +Clan Heavy Machine Gun Ammo - Half + +Right Torso: +CLDoubleHeatSink +CLDoubleHeatSink +CLDoubleHeatSink +CLDoubleHeatSink +CLDoubleHeatSink +CLDoubleHeatSink +CLDoubleHeatSink +CLDoubleHeatSink +CLERPPC +CLERPPC +CLStreakLRM5 +Clan Ferro-Lamellor + +Center Torso: +Fusion Engine +Fusion Engine +Fusion Engine +Gyro +Gyro +Gyro +Gyro +Fusion Engine +Fusion Engine +Fusion Engine +CLDoubleHeatSink +CLDoubleHeatSink + +Head: +Life Support +Sensors +Cockpit +Clan Ferro-Lamellor +Sensors +Life Support +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- + +Left Leg: +Hip +Upper Leg Actuator +Lower Leg Actuator +Foot Actuator +Jump Jet +Jump Jet +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- + +Right Leg: +Hip +Upper Leg Actuator +Lower Leg Actuator +Foot Actuator +Jump Jet +Jump Jet +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- + +overview:The Merlin uses components that are all reliable and readily available, making the Merlin a durable and easy-to-repair 'Mech. +capabilities:The 'Mech is powered by a Pitban 240 fusion engine that gives it a top speed of 64.8 km/h. The Merlin carries ten and a half tons of armor, which is a respectable amount of protection for its weight. Additionally, the Merlin carries eighteen heat sinks to handle its heavy heat load. +deployment:No Information Available +history:The Merlin debuted in 3010 as a product of the rebuilt Mountain Wolf BattleMechs. The Merlin was hailed as a technological marvel at the time it was released, as it was the first completely new design to be developed in over 100 years. +manufacturer:Mountain Wolf BattleMechs +primaryfactory:Alpheratz +systemmanufacturer:CHASSIS:Heavy Star QAT-4 +systemmanufacturer:ENGINE:Pitban 240 +systemmanufacturer:ARMOR:Compound LZ-7 +systemmanufacturer:JUMPJET:Pitban LFT 50 +systemmanufacturer:COMMUNICATIONS:Magestrix Alpha +systemmanufacturer:TARGETING:Magestrix Gamma + diff --git a/megamek/data/mechfiles/mechs/Recognition Guide ilClan/Vol 26/Merlin MLN-1D.mtf b/megamek/data/mechfiles/mechs/Recognition Guide ilClan/Vol 26/Merlin MLN-1D.mtf new file mode 100644 index 00000000000..feb17653de3 --- /dev/null +++ b/megamek/data/mechfiles/mechs/Recognition Guide ilClan/Vol 26/Merlin MLN-1D.mtf @@ -0,0 +1,169 @@ +Version:1.3 +Merlin +MLN-1D +mul id:9316 +Config:Biped +techbase:Inner Sphere +era:3090 +source:Rec Guide:ilClan #26 - Early Republic +rules level:2 + +mass:60 +engine:240 Fusion Engine(IS) +structure:IS Standard +myomer:Standard + +heat sinks:13 IS Double +walk mp:4 +jump mp:4 + +armor:Standard(Inner Sphere) +LA armor:16 +RA armor:16 +LT armor:18 +RT armor:18 +CT armor:26 +HD armor:9 +LL armor:19 +RL armor:19 +RTL armor:8 +RTR armor:8 +RTC armor:11 + +Weapons:6 +Light PPC, Right Arm +PPC, Right Torso +LRM 5, Right Torso +Heavy Machine Gun, Left Torso +Flamer, Left Torso +Light PPC, Left Arm + +Left Arm: +Shoulder +Upper Arm Actuator +Lower Arm Actuator +Light PPC +Light PPC +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- + +Right Arm: +Shoulder +Upper Arm Actuator +Lower Arm Actuator +Light PPC +Light PPC +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- + +Left Torso: +ISDoubleHeatSink +ISDoubleHeatSink +ISDoubleHeatSink +ISDoubleHeatSink +ISDoubleHeatSink +ISDoubleHeatSink +Heavy Machine Gun +Flamer +IS Ammo LRM-5 +IS Heavy Machine Gun Ammo - Half +ISCASE +-Empty- + +Right Torso: +ISDoubleHeatSink +ISDoubleHeatSink +ISDoubleHeatSink +ISDoubleHeatSink +ISDoubleHeatSink +ISDoubleHeatSink +PPC +PPC +PPC +LRM 5 +-Empty- +-Empty- + +Center Torso: +Fusion Engine +Fusion Engine +Fusion Engine +Gyro +Gyro +Gyro +Gyro +Fusion Engine +Fusion Engine +Fusion Engine +-Empty- +-Empty- + +Head: +Life Support +Sensors +Cockpit +-Empty- +Sensors +Life Support +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- + +Left Leg: +Hip +Upper Leg Actuator +Lower Leg Actuator +Foot Actuator +Jump Jet +Jump Jet +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- + +Right Leg: +Hip +Upper Leg Actuator +Lower Leg Actuator +Foot Actuator +Jump Jet +Jump Jet +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- + +overview:The Merlin uses components that are all reliable and readily available, making the Merlin a durable and easy-to-repair 'Mech. + +capabilities:The 'Mech is powered by a Pitban 240 fusion engine that gives it a top speed of 64.8 km/h. The Merlin carries ten and a half tons of armor, which is a respectable amount of protection for its weight. Additionally, the Merlin carries eighteen heat sinks to handle its heavy heat load. + +deployment:No Information Available + +history:The Merlin debuted in 3010 as a product of the rebuilt Mountain Wolf BattleMechs. The Merlin was hailed as a technological marvel at the time it was released, as it was the first completely new design to be developed in over 100 years. + +manufacturer:Mountain Wolf BattleMechs, Vandenberg Mechanized Industries +primaryfactory:Alpheratz, New Vandenberg +systemmanufacturer:CHASSIS:Heavy Star QAT-4 +systemmanufacturer:ENGINE:Pitban 240 +systemmanufacturer:ARMOR:Longanecker PlastiSteel with CASE +systemmanufacturer:JUMPJET:Pitban LFT 50 +systemmanufacturer:COMMUNICATIONS:Magestrix Alpha +systemmanufacturer:TARGETING:Magestrix Gamma + diff --git a/megamek/data/mechfiles/mechs/Recognition Guide ilClan/Vol 26/Merlin MLN-1E.mtf b/megamek/data/mechfiles/mechs/Recognition Guide ilClan/Vol 26/Merlin MLN-1E.mtf new file mode 100644 index 00000000000..0428c3aa209 --- /dev/null +++ b/megamek/data/mechfiles/mechs/Recognition Guide ilClan/Vol 26/Merlin MLN-1E.mtf @@ -0,0 +1,168 @@ +Version:1.3 +Merlin +MLN-1E +mul id:9316 +Config:Biped +techbase:Inner Sphere +era:3099 +source:Rec Guide:ilClan #26 - Early Republic +rules level:2 + +mass:60 +engine:240 Fusion Engine(IS) +structure:IS Standard +myomer:Standard + +heat sinks:12 IS Double +walk mp:4 +jump mp:4 + +armor:Standard(Inner Sphere) +LA armor:16 +RA armor:16 +LT armor:18 +RT armor:18 +CT armor:26 +HD armor:9 +LL armor:19 +RL armor:19 +RTL armor:8 +RTR armor:8 +RTC armor:11 + +Weapons:5 +Light PPC, Right Arm +Light PPC, Left Arm +Flamer, Left Torso +PPC, Right Torso +MML 5, Right Torso + +Left Arm: +Shoulder +Upper Arm Actuator +Lower Arm Actuator +Light PPC +Light PPC +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- + +Right Arm: +Shoulder +Upper Arm Actuator +Lower Arm Actuator +Light PPC +Light PPC +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- + +Left Torso: +ISDoubleHeatSink +ISDoubleHeatSink +ISDoubleHeatSink +ISDoubleHeatSink +ISDoubleHeatSink +ISDoubleHeatSink +Flamer +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- + +Right Torso: +ISDoubleHeatSink +ISDoubleHeatSink +ISDoubleHeatSink +PPC +PPC +PPC +ISMML5 +ISMML5 +ISMML5 +IS Ammo MML-5 SRM +IS Ammo MML-5 LRM +ISCASEII + +Center Torso: +Fusion Engine +Fusion Engine +Fusion Engine +Gyro +Gyro +Gyro +Gyro +Fusion Engine +Fusion Engine +Fusion Engine +-Empty- +-Empty- + +Head: +Life Support +Sensors +Cockpit +-Empty- +Sensors +Life Support +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- + +Left Leg: +Hip +Upper Leg Actuator +Lower Leg Actuator +Foot Actuator +Jump Jet +Jump Jet +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- + +Right Leg: +Hip +Upper Leg Actuator +Lower Leg Actuator +Foot Actuator +Jump Jet +Jump Jet +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- + +overview:The Merlin uses components that are all reliable and readily available, making the Merlin a durable and easy-to-repair 'Mech. + +capabilities:The 'Mech is powered by a Pitban 240 fusion engine that gives it a top speed of 64.8 km/h. The Merlin carries ten and a half tons of armor, which is a respectable amount of protection for its weight. Additionally, the Merlin carries eighteen heat sinks to handle its heavy heat load. + +deployment:No Information Available + +history:The Merlin debuted in 3010 as a product of the rebuilt Mountain Wolf BattleMechs. The Merlin was hailed as a technological marvel at the time it was released, as it was the first completely new design to be developed in over 100 years. + +manufacturer:Mountain Wolf BattleMechs, Vandenberg Mechanized Industries +primaryfactory:Alpheratz, New Vandenberg +systemmanufacturer:CHASSIS:Heavy Star QAT-4 +systemmanufacturer:ENGINE:Pitban 240 +systemmanufacturer:ARMOR:Longanecker PlastiSteel with CASE +systemmanufacturer:JUMPJET:Pitban LFT 50 +systemmanufacturer:COMMUNICATIONS:Magestrix Alpha +systemmanufacturer:TARGETING:Magestrix Gamma + diff --git a/megamek/data/mechfiles/mechs/Recognition Guide ilClan/Vol 26/Merlin MLN-1P.mtf b/megamek/data/mechfiles/mechs/Recognition Guide ilClan/Vol 26/Merlin MLN-1P.mtf new file mode 100644 index 00000000000..7ca4962734f --- /dev/null +++ b/megamek/data/mechfiles/mechs/Recognition Guide ilClan/Vol 26/Merlin MLN-1P.mtf @@ -0,0 +1,168 @@ +Version:1.3 +Merlin +MLN-1P +mul id:9318 +Config:Biped +techbase:Inner Sphere +era:3114 +source:Rec Guide:ilClan #26 - Late Republic +rules level:2 + +mass:60 +engine:240 Fusion Engine(IS) +structure:IS Standard +myomer:Standard + +heat sinks:13 IS Double +walk mp:4 +jump mp:4 + +armor:Heavy Ferro-Fibrous(Inner Sphere) +LA armor:16 +RA armor:16 +LT armor:18 +RT armor:18 +CT armor:26 +HD armor:9 +LL armor:19 +RL armor:19 +RTL armor:8 +RTR armor:8 +RTC armor:11 + +Weapons:5 +Medium VSP Laser, Left Arm +Medium VSP Laser, Right Arm +Flamer, Left Torso +Large VSP Laser, Right Torso +LRM 5, Right Torso + +Left Arm: +Shoulder +Upper Arm Actuator +Lower Arm Actuator +ISMediumVSPLaser +ISMediumVSPLaser +IS Heavy Ferro-Fibrous +IS Heavy Ferro-Fibrous +IS Heavy Ferro-Fibrous +IS Heavy Ferro-Fibrous +IS Heavy Ferro-Fibrous +IS Heavy Ferro-Fibrous +IS Heavy Ferro-Fibrous + +Right Arm: +Shoulder +Upper Arm Actuator +Lower Arm Actuator +ISMediumVSPLaser +ISMediumVSPLaser +IS Heavy Ferro-Fibrous +IS Heavy Ferro-Fibrous +IS Heavy Ferro-Fibrous +IS Heavy Ferro-Fibrous +IS Heavy Ferro-Fibrous +IS Heavy Ferro-Fibrous +IS Heavy Ferro-Fibrous + +Left Torso: +ISDoubleHeatSink +ISDoubleHeatSink +ISDoubleHeatSink +ISDoubleHeatSink +ISDoubleHeatSink +ISDoubleHeatSink +Flamer +IS Ammo LRM-5 +IS Heavy Ferro-Fibrous +IS Heavy Ferro-Fibrous +IS Heavy Ferro-Fibrous +IS Heavy Ferro-Fibrous + +Right Torso: +ISDoubleHeatSink +ISDoubleHeatSink +ISDoubleHeatSink +ISDoubleHeatSink +ISDoubleHeatSink +ISDoubleHeatSink +ISLargeVSPLaser +ISLargeVSPLaser +ISLargeVSPLaser +ISLargeVSPLaser +LRM 5 +-Empty- + +Center Torso: +Fusion Engine +Fusion Engine +Fusion Engine +Gyro +Gyro +Gyro +Gyro +Fusion Engine +Fusion Engine +Fusion Engine +IS Heavy Ferro-Fibrous +IS Heavy Ferro-Fibrous + +Head: +Life Support +Sensors +Cockpit +IS Heavy Ferro-Fibrous +Sensors +Life Support +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- + +Left Leg: +Hip +Upper Leg Actuator +Lower Leg Actuator +Foot Actuator +Jump Jet +Jump Jet +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- + +Right Leg: +Hip +Upper Leg Actuator +Lower Leg Actuator +Foot Actuator +Jump Jet +Jump Jet +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- + +overview:The Merlin uses components that are all reliable and readily available, making the Merlin a durable and easy-to-repair 'Mech. + +capabilities:The 'Mech is powered by a Pitban 240 fusion engine that gives it a top speed of 64.8 km/h. The Merlin carries ten and a half tons of armor, which is a respectable amount of protection for its weight. Additionally, the Merlin carries eighteen heat sinks to handle its heavy heat load. + +deployment:No Information Available + +history:The Merlin debuted in 3010 as a product of the rebuilt Mountain Wolf BattleMechs. The Merlin was hailed as a technological marvel at the time it was released, as it was the first completely new design to be developed in over 100 years. + +manufacturer:Field Refit +primaryfactory:Various +systemmanufacturer:CHASSIS:Heavy Star QAT-4 +systemmanufacturer:ENGINE:Pitban 240 +systemmanufacturer:ARMOR:StarSlab-7 Heavy Ferro-Fibrous +systemmanufacturer:JUMPJET:Pitban LFT 50 +systemmanufacturer:COMMUNICATIONS:Magestrix Alpha +systemmanufacturer:TARGETING:Magestrix Gamma + diff --git a/megamek/data/mechfiles/mechs/Recognition Guide ilClan/Vol 26/Naga II A.mtf b/megamek/data/mechfiles/mechs/Recognition Guide ilClan/Vol 26/Naga II A.mtf new file mode 100644 index 00000000000..fb4be48b2f0 --- /dev/null +++ b/megamek/data/mechfiles/mechs/Recognition Guide ilClan/Vol 26/Naga II A.mtf @@ -0,0 +1,161 @@ +Version:1.3 +Naga II +A +mul id:9323 +Config:Biped Omnimech +techbase:Clan +era:2866 +source:Rec Guide:ilClan #26 - Early Succession War +rules level:2 + +mass:80 +engine:400 XL (Clan) Engine(IS) +structure:Clan Endo Steel +myomer:Standard + +heat sinks:16 Clan Double +base chassis heat sinks:12 +walk mp:5 +jump mp:0 + +armor:Standard(Inner Sphere) +LA armor:14 +RA armor:14 +LT armor:15 +RT armor:15 +CT armor:17 +HD armor:9 +LL armor:16 +RL armor:16 +RTL armor:9 +RTR armor:9 +RTC armor:10 + +Weapons:5 +LB 20-X AC, Left Arm +ER Large Laser, Right Arm +ER Large Laser, Right Arm +Streak SRM 6, Left Torso +ER Small Laser, Center Torso + +Left Arm: +Shoulder +Upper Arm Actuator +CLLBXAC20 (OMNIPOD) +CLLBXAC20 (OMNIPOD) +CLLBXAC20 (OMNIPOD) +CLLBXAC20 (OMNIPOD) +CLLBXAC20 (OMNIPOD) +CLLBXAC20 (OMNIPOD) +CLLBXAC20 (OMNIPOD) +CLLBXAC20 (OMNIPOD) +CLLBXAC20 (OMNIPOD) +-Empty- + +Right Arm: +Shoulder +Upper Arm Actuator +Lower Arm Actuator +Hand Actuator +CLDoubleHeatSink (OMNIPOD) +CLDoubleHeatSink (OMNIPOD) +CLDoubleHeatSink (OMNIPOD) +CLDoubleHeatSink (OMNIPOD) +CLDoubleHeatSink (OMNIPOD) +CLDoubleHeatSink (OMNIPOD) +CLERLargeLaser (OMNIPOD) +CLERLargeLaser (OMNIPOD) + +Left Torso: +Fusion Engine +Fusion Engine +CLStreakSRM6 (OMNIPOD) +CLStreakSRM6 (OMNIPOD) +Clan Streak SRM 6 Ammo (OMNIPOD) +Clan LB 20-X AC Ammo (OMNIPOD) +Clan LB 20-X AC Ammo (OMNIPOD) +Clan LB 20-X Cluster Ammo (OMNIPOD) +-Empty- +-Empty- +-Empty- +-Empty- + +Right Torso: +Fusion Engine +Fusion Engine +CLDoubleHeatSink (OMNIPOD) +CLDoubleHeatSink (OMNIPOD) +Clan Endo Steel +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- + +Center Torso: +Fusion Engine +Fusion Engine +Fusion Engine +Gyro +Gyro +Gyro +Gyro +Fusion Engine +Fusion Engine +Fusion Engine +CLERSmallLaser (OMNIPOD) +Clan Endo Steel + +Head: +Life Support +Sensors +Cockpit +Clan Endo Steel +Sensors +Life Support +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- + +Left Leg: +Hip +Upper Leg Actuator +Lower Leg Actuator +Foot Actuator +Clan Endo Steel +Clan Endo Steel +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- + +Right Leg: +Hip +Upper Leg Actuator +Lower Leg Actuator +Foot Actuator +Clan Endo Steel +Clan Endo Steel +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- + +overview:The Naga II is a revived relic from the Clans' early triumphs and setbacks in creating the OmniMech. +manufacturer:Refit +primaryfactory:Various +systemmanufacturer:CHASSIS:Type BMH-7 Endo Steel +systemmanufacturer:ENGINE:Fusion 400 XL +systemmanufacturer:ARMOR:Forged Type 34 Standard +systemmanufacturer:COMMUNICATIONS:Type G3, Mk. XII +systemmanufacturer:TARGETING:Version Kappa-III TTS + diff --git a/megamek/data/mechfiles/mechs/Recognition Guide ilClan/Vol 26/Naga II B.mtf b/megamek/data/mechfiles/mechs/Recognition Guide ilClan/Vol 26/Naga II B.mtf new file mode 100644 index 00000000000..7482b50c3ee --- /dev/null +++ b/megamek/data/mechfiles/mechs/Recognition Guide ilClan/Vol 26/Naga II B.mtf @@ -0,0 +1,162 @@ +Version:1.3 +Naga II +B +mul id:9324 +Config:Biped Omnimech +techbase:Clan +era:2866 +source:Rec Guide:ilClan #26 - Early Succession War +rules level:2 + +mass:80 +engine:400 XL (Clan) Engine(IS) +structure:Clan Endo Steel +myomer:Standard + +heat sinks:12 Clan Double +base chassis heat sinks:12 +walk mp:5 +jump mp:0 + +armor:Standard(Inner Sphere) +LA armor:14 +RA armor:14 +LT armor:15 +RT armor:15 +CT armor:17 +HD armor:9 +LL armor:16 +RL armor:16 +RTL armor:9 +RTR armor:9 +RTC armor:10 + +Weapons:6 +LRM 20, Left Arm +LRM 20, Left Arm +LRM 20, Right Arm +LRM 20, Right Arm +Narc, Right Torso +Anti-Missile System, Left Torso + +Left Arm: +Shoulder +Upper Arm Actuator +CLLRM20 (OMNIPOD) +CLLRM20 (OMNIPOD) +CLLRM20 (OMNIPOD) +CLLRM20 (OMNIPOD) +CLLRM20 (OMNIPOD) +CLLRM20 (OMNIPOD) +CLLRM20 (OMNIPOD) +CLLRM20 (OMNIPOD) +-Empty- +-Empty- + +Right Arm: +Shoulder +Upper Arm Actuator +CLLRM20 (OMNIPOD) +CLLRM20 (OMNIPOD) +CLLRM20 (OMNIPOD) +CLLRM20 (OMNIPOD) +CLLRM20 (OMNIPOD) +CLLRM20 (OMNIPOD) +CLLRM20 (OMNIPOD) +CLLRM20 (OMNIPOD) +-Empty- +-Empty- + +Left Torso: +Fusion Engine +Fusion Engine +CLAntiMissileSystem (OMNIPOD) +CLAMS Ammo (OMNIPOD) +Clan Ammo LRM-20 (Clan) Narc-capable (OMNIPOD) +Clan Ammo LRM-20 (Clan) Narc-capable (OMNIPOD) +Clan Ammo LRM-20 (Clan) Narc-capable (OMNIPOD) +Clan Endo Steel +-Empty- +-Empty- +-Empty- +-Empty- + +Right Torso: +Fusion Engine +Fusion Engine +CLNarcBeacon (OMNIPOD) +ISNarc Pods (OMNIPOD) +ISNarc Pods (OMNIPOD) +Clan Ammo LRM-20 (Clan) Narc-capable (OMNIPOD) +Clan Ammo LRM-20 (Clan) Narc-capable (OMNIPOD) +Clan Ammo LRM-20 (Clan) Narc-capable (OMNIPOD) +-Empty- +-Empty- +-Empty- +-Empty- + +Center Torso: +Fusion Engine +Fusion Engine +Fusion Engine +Gyro +Gyro +Gyro +Gyro +Fusion Engine +Fusion Engine +Fusion Engine +Clan Endo Steel +-Empty- + +Head: +Life Support +Sensors +Cockpit +Clan Endo Steel +Sensors +Life Support +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- + +Left Leg: +Hip +Upper Leg Actuator +Lower Leg Actuator +Foot Actuator +Clan Endo Steel +Clan Endo Steel +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- + +Right Leg: +Hip +Upper Leg Actuator +Lower Leg Actuator +Foot Actuator +Clan Endo Steel +Clan Endo Steel +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- + +overview:The Naga II is a revived relic from the Clans' early triumphs and setbacks in creating the OmniMech. +manufacturer:Refit +primaryfactory:Various +systemmanufacturer:CHASSIS:Type BMH-7 Endo Steel +systemmanufacturer:ENGINE:Fusion 400 XL +systemmanufacturer:ARMOR:Forged Type 34 Standard +systemmanufacturer:COMMUNICATIONS:Type G3, Mk. XII +systemmanufacturer:TARGETING:Version Kappa-III TTS + diff --git a/megamek/data/mechfiles/mechs/Recognition Guide ilClan/Vol 26/Naga II C.mtf b/megamek/data/mechfiles/mechs/Recognition Guide ilClan/Vol 26/Naga II C.mtf new file mode 100644 index 00000000000..d34e6bc0361 --- /dev/null +++ b/megamek/data/mechfiles/mechs/Recognition Guide ilClan/Vol 26/Naga II C.mtf @@ -0,0 +1,166 @@ +Version:1.3 +Naga II +C +mul id:9325 +Config:Biped Omnimech +techbase:Clan +era:2866 +source:Rec Guide:ilClan #26 - Early Succession War +rules level:2 + +mass:80 +engine:400 XL (Clan) Engine(IS) +structure:Clan Endo Steel +myomer:Standard + +heat sinks:13 Clan Double +base chassis heat sinks:12 +walk mp:5 +jump mp:0 + +armor:Standard(Inner Sphere) +LA armor:14 +RA armor:14 +LT armor:15 +RT armor:15 +CT armor:17 +HD armor:9 +LL armor:16 +RL armor:16 +RTL armor:9 +RTR armor:9 +RTC armor:10 + +Weapons:10 +Streak SRM 6, Left Arm +Large Pulse Laser, Left Arm +Medium Pulse Laser, Right Arm +Medium Pulse Laser, Left Arm +Ultra AC/5, Right Arm +LRM 15, Left Torso +Machine Gun, Right Torso +Machine Gun, Left Torso +Machine Gun, Right Torso +Machine Gun, Left Torso + +Left Arm: +Shoulder +Upper Arm Actuator +CLStreakSRM6 (OMNIPOD) +CLStreakSRM6 (OMNIPOD) +CLLargePulseLaser (OMNIPOD) +CLLargePulseLaser (OMNIPOD) +CLMediumPulseLaser (OMNIPOD) +Clan Streak SRM 6 Ammo (OMNIPOD) +-Empty- +-Empty- +-Empty- +-Empty- + +Right Arm: +Shoulder +Upper Arm Actuator +CLUltraAC5 (OMNIPOD) +CLUltraAC5 (OMNIPOD) +CLUltraAC5 (OMNIPOD) +CLMediumPulseLaser (OMNIPOD) +Clan Ultra AC/5 Ammo (OMNIPOD) +Clan Ultra AC/5 Ammo (OMNIPOD) +-Empty- +-Empty- +-Empty- +-Empty- + +Left Torso: +Fusion Engine +Fusion Engine +CLLRM15 (OMNIPOD) +CLLRM15 (OMNIPOD) +CLMG (OMNIPOD) +CLMG (OMNIPOD) +Clan Ammo LRM-15 (OMNIPOD) +Clan Ammo LRM-15 (OMNIPOD) +Clan Endo Steel +-Empty- +-Empty- +-Empty- + +Right Torso: +Fusion Engine +Fusion Engine +CLDoubleHeatSink (OMNIPOD) +CLDoubleHeatSink (OMNIPOD) +CLMG (OMNIPOD) +CLMG (OMNIPOD) +Clan Machine Gun Ammo - Full (OMNIPOD) +Clan Endo Steel +-Empty- +-Empty- +-Empty- +-Empty- + +Center Torso: +Fusion Engine +Fusion Engine +Fusion Engine +Gyro +Gyro +Gyro +Gyro +Fusion Engine +Fusion Engine +Fusion Engine +Clan Endo Steel +-Empty- + +Head: +Life Support +Sensors +Cockpit +-Empty- +Sensors +Life Support +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- + +Left Leg: +Hip +Upper Leg Actuator +Lower Leg Actuator +Foot Actuator +Clan Endo Steel +Clan Endo Steel +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- + +Right Leg: +Hip +Upper Leg Actuator +Lower Leg Actuator +Foot Actuator +Clan Endo Steel +Clan Endo Steel +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- + +overview:The Naga II is a revived relic from the Clans' early triumphs and setbacks in creating the OmniMech. +manufacturer:Refit +primaryfactory:Various +systemmanufacturer:CHASSIS:Type BMH-7 Endo Steel +systemmanufacturer:ENGINE:Fusion 400 XL +systemmanufacturer:ARMOR:Forged Type 34 Standard +systemmanufacturer:COMMUNICATIONS:Type G3, Mk. XII +systemmanufacturer:TARGETING:Version Kappa-III TTS + diff --git a/megamek/data/mechfiles/mechs/Recognition Guide ilClan/Vol 26/Naga II H.mtf b/megamek/data/mechfiles/mechs/Recognition Guide ilClan/Vol 26/Naga II H.mtf new file mode 100644 index 00000000000..cd85eaee73e --- /dev/null +++ b/megamek/data/mechfiles/mechs/Recognition Guide ilClan/Vol 26/Naga II H.mtf @@ -0,0 +1,162 @@ +Version:1.3 +Naga II +H +mul id:9326 +Config:Biped Omnimech +techbase:Clan +era:3059 +source:Rec Guide:ilClan #26 - Clan Invasion +rules level:2 + +mass:80 +engine:400 XL (Clan) Engine(IS) +structure:Clan Endo Steel +myomer:Standard + +heat sinks:16 Clan Double +base chassis heat sinks:12 +walk mp:5 +jump mp:0 + +armor:Standard(Inner Sphere) +LA armor:14 +RA armor:14 +LT armor:15 +RT armor:15 +CT armor:17 +HD armor:9 +LL armor:16 +RL armor:16 +RTL armor:9 +RTR armor:9 +RTC armor:10 + +Weapons:6 +Gauss Rifle, Left Arm +Heavy Large Laser, Right Arm +Heavy Medium Laser, Right Arm +Heavy Medium Laser, Right Arm +Heavy Small Laser, Center Torso +LRM 20, Left Torso + +Left Arm: +Shoulder +Upper Arm Actuator +CLGaussRifle (OMNIPOD) +CLGaussRifle (OMNIPOD) +CLGaussRifle (OMNIPOD) +CLGaussRifle (OMNIPOD) +CLGaussRifle (OMNIPOD) +CLGaussRifle (OMNIPOD) +Clan Gauss Ammo (OMNIPOD) +Clan Gauss Ammo (OMNIPOD) +-Empty- +-Empty- + +Right Arm: +Shoulder +Upper Arm Actuator +Lower Arm Actuator +Hand Actuator +CLHeavyLargeLaser (OMNIPOD) +CLHeavyLargeLaser (OMNIPOD) +CLHeavyLargeLaser (OMNIPOD) +CLHeavyMediumLaser (OMNIPOD) +CLHeavyMediumLaser (OMNIPOD) +CLHeavyMediumLaser (OMNIPOD) +CLHeavyMediumLaser (OMNIPOD) +-Empty- + +Left Torso: +Fusion Engine +Fusion Engine +CLLRM20 (OMNIPOD) +CLLRM20 (OMNIPOD) +CLLRM20 (OMNIPOD) +CLLRM20 (OMNIPOD) +Clan Ammo LRM-20 (OMNIPOD) +Clan Ammo LRM-20 (OMNIPOD) +Clan Endo Steel +-Empty- +-Empty- +-Empty- + +Right Torso: +Fusion Engine +Fusion Engine +CLDoubleHeatSink (OMNIPOD) +CLDoubleHeatSink (OMNIPOD) +CLDoubleHeatSink (OMNIPOD) +CLDoubleHeatSink (OMNIPOD) +CLDoubleHeatSink (OMNIPOD) +CLDoubleHeatSink (OMNIPOD) +CLDoubleHeatSink (OMNIPOD) +CLDoubleHeatSink (OMNIPOD) +Clan Endo Steel +-Empty- + +Center Torso: +Fusion Engine +Fusion Engine +Fusion Engine +Gyro +Gyro +Gyro +Gyro +Fusion Engine +Fusion Engine +Fusion Engine +CLHeavySmallLaser (OMNIPOD) +Clan Endo Steel + +Head: +Life Support +Sensors +Cockpit +-Empty- +Sensors +Life Support +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- + +Left Leg: +Hip +Upper Leg Actuator +Lower Leg Actuator +Foot Actuator +Clan Endo Steel +Clan Endo Steel +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- + +Right Leg: +Hip +Upper Leg Actuator +Lower Leg Actuator +Foot Actuator +Clan Endo Steel +Clan Endo Steel +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- + +overview:The Naga II is a revived relic from the Clans' early triumphs and setbacks in creating the OmniMech. +manufacturer:Refit +primaryfactory:Various +systemmanufacturer:CHASSIS:Type BMH-7 Endo Steel +systemmanufacturer:ENGINE:Fusion 400 XL +systemmanufacturer:ARMOR:Forged Type 34 Standard +systemmanufacturer:COMMUNICATIONS:Type G3, Mk. XII +systemmanufacturer:TARGETING:Version Kappa-III TTS + diff --git a/megamek/data/mechfiles/mechs/Recognition Guide ilClan/Vol 26/Naga II Prime.mtf b/megamek/data/mechfiles/mechs/Recognition Guide ilClan/Vol 26/Naga II Prime.mtf new file mode 100644 index 00000000000..6f5c7a0b254 --- /dev/null +++ b/megamek/data/mechfiles/mechs/Recognition Guide ilClan/Vol 26/Naga II Prime.mtf @@ -0,0 +1,160 @@ +Version:1.3 +Naga II +Prime +mul id:9322 +Config:Biped Omnimech +techbase:Clan +era:2866 +source:Rec Guide:ilClan #26 - Early Succession War +rules level:2 + +mass:80 +engine:400 XL (Clan) Engine(IS) +structure:Clan Endo Steel +myomer:Standard + +heat sinks:12 Clan Double +base chassis heat sinks:12 +walk mp:5 +jump mp:0 + +armor:Standard(Inner Sphere) +LA armor:14 +RA armor:14 +LT armor:15 +RT armor:15 +CT armor:17 +HD armor:9 +LL armor:16 +RL armor:16 +RTL armor:9 +RTR armor:9 +RTC armor:10 + +Weapons:4 +Ultra AC/10, Right Arm +LRM 20, Right Torso +ER Small Laser, Center Torso +LB 10-X AC, Left Arm + +Left Arm: +Shoulder +Upper Arm Actuator +CLLBXAC10 (OMNIPOD) +CLLBXAC10 (OMNIPOD) +CLLBXAC10 (OMNIPOD) +CLLBXAC10 (OMNIPOD) +CLLBXAC10 (OMNIPOD) +Clan LB 10-X AC Ammo (OMNIPOD) +Clan LB 10-X Cluster Ammo (OMNIPOD) +-Empty- +-Empty- +-Empty- + +Right Arm: +Shoulder +Upper Arm Actuator +CLUltraAC10 (OMNIPOD) +CLUltraAC10 (OMNIPOD) +CLUltraAC10 (OMNIPOD) +CLUltraAC10 (OMNIPOD) +Clan Ultra AC/10 Ammo (OMNIPOD) +Clan Ultra AC/10 Ammo (OMNIPOD) +-Empty- +-Empty- +-Empty- +-Empty- + +Left Torso: +Fusion Engine +Fusion Engine +Clan Endo Steel +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- + +Right Torso: +Fusion Engine +Fusion Engine +CLLRM20 (OMNIPOD) +CLLRM20 (OMNIPOD) +CLLRM20 (OMNIPOD) +CLLRM20 (OMNIPOD) +Clan Ammo LRM-20 (OMNIPOD) +Clan Ammo LRM-20 (OMNIPOD) +-Empty- +-Empty- +-Empty- +-Empty- + +Center Torso: +Fusion Engine +Fusion Engine +Fusion Engine +Gyro +Gyro +Gyro +Gyro +Fusion Engine +Fusion Engine +Fusion Engine +CLERSmallLaser (OMNIPOD) +Clan Endo Steel + +Head: +Life Support +Sensors +Cockpit +Clan Endo Steel +Sensors +Life Support +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- + +Left Leg: +Hip +Upper Leg Actuator +Lower Leg Actuator +Foot Actuator +Clan Endo Steel +Clan Endo Steel +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- + +Right Leg: +Hip +Upper Leg Actuator +Lower Leg Actuator +Foot Actuator +Clan Endo Steel +Clan Endo Steel +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- + +overview:The Naga II is a revived relic from the Clans' early triumphs and setbacks in creating the OmniMech. +manufacturer:Refit +primaryfactory:Various +systemmanufacturer:CHASSIS:Type BMH-7 Endo Steel +systemmanufacturer:ENGINE:Fusion 400 XL +systemmanufacturer:ARMOR:Forged Type 34 Standard +systemmanufacturer:COMMUNICATIONS:Type G3, Mk. XII +systemmanufacturer:TARGETING:Version Kappa-III TTS + diff --git a/megamek/data/mechfiles/mechs/Recognition Guide ilClan/Vol 26/Naga II W.mtf b/megamek/data/mechfiles/mechs/Recognition Guide ilClan/Vol 26/Naga II W.mtf new file mode 100644 index 00000000000..61027df3a03 --- /dev/null +++ b/megamek/data/mechfiles/mechs/Recognition Guide ilClan/Vol 26/Naga II W.mtf @@ -0,0 +1,161 @@ +Version:1.3 +Naga II +W +mul id:9327 +Config:Biped Omnimech +techbase:Clan +era:3138 +source:Rec Guide:ilClan #26 - Dark Age +rules level:2 + +mass:80 +engine:400 XL (Clan) Engine(IS) +structure:Clan Endo Steel +myomer:Standard + +heat sinks:13 Clan Double +base chassis heat sinks:12 +walk mp:5 +jump mp:0 + +armor:Standard(Inner Sphere) +LA armor:14 +RA armor:14 +LT armor:15 +RT armor:15 +CT armor:17 +HD armor:9 +LL armor:16 +RL armor:16 +RTL armor:9 +RTR armor:9 +RTC armor:10 + +Weapons:5 +Rotary AC/5, Left Arm +ER PPC, Right Arm +ER Medium Laser, Left Torso +Streak LRM 15, Right Torso +ER Small Laser, Center Torso + +Left Arm: +Shoulder +Upper Arm Actuator +CLRotaryAC5 (OMNIPOD) +CLRotaryAC5 (OMNIPOD) +CLRotaryAC5 (OMNIPOD) +CLRotaryAC5 (OMNIPOD) +CLRotaryAC5 (OMNIPOD) +CLRotaryAC5 (OMNIPOD) +CLRotaryAC5 (OMNIPOD) +CLRotaryAC5 (OMNIPOD) +-Empty- +-Empty- + +Right Arm: +Shoulder +Upper Arm Actuator +CLERPPC (OMNIPOD) +CLERPPC (OMNIPOD) +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- + +Left Torso: +Fusion Engine +Fusion Engine +CLDoubleHeatSink (OMNIPOD) +CLDoubleHeatSink (OMNIPOD) +CLERMediumLaser (OMNIPOD) +CLRotaryAC5 Ammo (OMNIPOD) +CLRotaryAC5 Ammo (OMNIPOD) +CLRotaryAC5 Ammo (OMNIPOD) +CLCASEII (OMNIPOD) +Clan Endo Steel +-Empty- +-Empty- + +Right Torso: +Fusion Engine +Fusion Engine +CLStreakLRM15 (OMNIPOD) +CLStreakLRM15 (OMNIPOD) +CLStreakLRM15 (OMNIPOD) +Clan Streak LRM 15 Ammo (OMNIPOD) +Clan Streak LRM 15 Ammo (OMNIPOD) +CLCASEII (OMNIPOD) +Clan Endo Steel +-Empty- +-Empty- +-Empty- + +Center Torso: +Fusion Engine +Fusion Engine +Fusion Engine +Gyro +Gyro +Gyro +Gyro +Fusion Engine +Fusion Engine +Fusion Engine +CLERSmallLaser (OMNIPOD) +Clan Endo Steel + +Head: +Life Support +Sensors +Cockpit +-Empty- +Sensors +Life Support +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- + +Left Leg: +Hip +Upper Leg Actuator +Lower Leg Actuator +Foot Actuator +Clan Endo Steel +Clan Endo Steel +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- + +Right Leg: +Hip +Upper Leg Actuator +Lower Leg Actuator +Foot Actuator +Clan Endo Steel +Clan Endo Steel +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- + +overview:The Naga II is a revived relic from the Clans' early triumphs and setbacks in creating the OmniMech. +manufacturer:Refit +primaryfactory:Various +systemmanufacturer:CHASSIS:Type BMH-7 Endo Steel +systemmanufacturer:ENGINE:Fusion 400 XL +systemmanufacturer:ARMOR:Forged Type 34 Standard +systemmanufacturer:COMMUNICATIONS:Type G3, Mk. XII +systemmanufacturer:TARGETING:Version Kappa-III TTS + diff --git a/megamek/data/mechfiles/mechs/Recognition Guide ilClan/Vol 26/Quickdraw QKD-9G.mtf b/megamek/data/mechfiles/mechs/Recognition Guide ilClan/Vol 26/Quickdraw QKD-9G.mtf new file mode 100644 index 00000000000..03b4625454e --- /dev/null +++ b/megamek/data/mechfiles/mechs/Recognition Guide ilClan/Vol 26/Quickdraw QKD-9G.mtf @@ -0,0 +1,166 @@ +Version:1.3 +Quickdraw +QKD-9G +mul id:9320 +Config:Biped +techbase:Mixed (IS Chassis) +era:3144 +source:Rec Guide:ilClan #26 - Dark Age +rules level:2 + +mass:60 +engine:300 Light Engine(IS) +structure:Clan Endo Steel +myomer:Standard + +heat sinks:12 IS Double +walk mp:5 +jump mp:5 + +armor:Ferro-Fibrous(Inner Sphere) +LA armor:17 +RA armor:17 +LT armor:20 +RT armor:20 +CT armor:26 +HD armor:9 +LL armor:24 +RL armor:24 +RTL armor:7 +RTR armor:7 +RTC armor:8 + +Weapons:7 +ER Medium Laser, Left Arm +ER Medium Laser, Right Arm +Streak SRM 4, Center Torso +Streak SRM 6, Left Torso +Medium Laser, Right Torso +Medium Laser, Right Torso +Streak SRM 4, Left Torso + +Left Arm: +Shoulder +Upper Arm Actuator +Lower Arm Actuator +Hand Actuator +ISERMediumLaser +Clan Endo Steel +Clan Endo Steel +IS Ferro-Fibrous +IS Ferro-Fibrous +IS Ferro-Fibrous +IS Ferro-Fibrous +IS Ferro-Fibrous + +Right Arm: +Shoulder +Upper Arm Actuator +Lower Arm Actuator +Hand Actuator +ISERMediumLaser +Clan Endo Steel +Clan Endo Steel +IS Ferro-Fibrous +IS Ferro-Fibrous +IS Ferro-Fibrous +IS Ferro-Fibrous +IS Ferro-Fibrous + +Left Torso: +Fusion Engine +Fusion Engine +Jump Jet +Jump Jet +CLStreakSRM6 +CLStreakSRM6 +CLStreakSRM4 +Clan Streak SRM 6 Ammo +Clan Streak SRM 4 Ammo +ISCASEII +Clan Endo Steel +IS Ferro-Fibrous + +Right Torso: +Fusion Engine +Fusion Engine +Jump Jet +Jump Jet +Medium Laser (R) +Medium Laser (R) +ISMASC +ISMASC +ISMASC +ISTargeting Computer +Supercharger +IS Ferro-Fibrous + +Center Torso: +Fusion Engine +Fusion Engine +Fusion Engine +Gyro +Gyro +Gyro +Gyro +Fusion Engine +Fusion Engine +Fusion Engine +Jump Jet +CLStreakSRM4 + +Head: +Life Support +Sensors +Cockpit +-Empty- +Sensors +Life Support +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- + +Left Leg: +Hip +Upper Leg Actuator +Lower Leg Actuator +Foot Actuator +Clan Endo Steel +IS Ferro-Fibrous +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- + +Right Leg: +Hip +Upper Leg Actuator +Lower Leg Actuator +Foot Actuator +Clan Endo Steel +IS Ferro-Fibrous +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- + +overview:Few business decisions have been as questionable as those that lead to the original reasoning for the Quickdraw. Intended to replace the Rifleman, the Quickdraw lacked any of the capabilities that made the Rifleman such a popular fire support platform. Had the Star League stood for longer, perhaps the Quickdraw would have faded into obscurity, but the rapid start of the Succession Wars only seven years after the Quickdraw's introduction instead sent it into the armies of every Great House. There it created its own legacy as a generalist workhouse, able to fill many different roles with its maneuverable movement profile and varied armament. +capabilities: Many Quickdraw variants carry weapons for every angle, including rarely seen rear-mount firepower. With its specially-modified arm actuators allowing it to flip its arms towards the rear, the Quickdraw is well suited for forays in the midst of an enemy formation. Pilots must be cautious of the Quickdraw's fragility in physical combat, however. The ankle actuators, though allowing the Quickdraw unparalleled stability on uneven ground, are susceptible to damage that can quickly paralize the BattleMech. +deployment: The Quickdraw shows few favorites, and has notable concentrations in most armies of the Inner Sphere. The Draconis Combine and Free Worlds League are both home to manufacturing lines for the design, and the 'Mech tends to be a more common sight in most of their formations as a result. Unlike many other lower-technology BattleMechs, the Quickdraw QKD-4G survived through the worst of the fighting of the past century, and remains common even in this post-Jihad world. +manufacturer:Technicron Manufacturing +primaryfactory:Savannah +systemmanufacturer:CHASSIS:Unknown +systemmanufacturer:ENGINE:Unknown +systemmanufacturer:ARMOR:Unknown +systemmanufacturer:COMMUNICATIONS:Garret +systemmode:COMMUNICATIONS:T12E +systemmanufacturer:TARGETING:Dynatec +systemmode:TARGETING:2180 + diff --git a/megamek/data/mechfiles/mechs/Recognition Guide ilClan/Vol 26/Starslayer STY-4C.mtf b/megamek/data/mechfiles/mechs/Recognition Guide ilClan/Vol 26/Starslayer STY-4C.mtf new file mode 100644 index 00000000000..9a9f64d0b01 --- /dev/null +++ b/megamek/data/mechfiles/mechs/Recognition Guide ilClan/Vol 26/Starslayer STY-4C.mtf @@ -0,0 +1,165 @@ +Version:1.3 +Starslayer +STY-4C +mul id:9315 +Config:Biped +techbase:Mixed (IS Chassis) +era:3145 +source:Rec Guide:ilClan #26 - Dark Age +rules level:2 + +mass:50 +engine:250 Fusion Engine(IS) +structure:IS Endo Steel +myomer:Triple-Strength + +heat sinks:13 IS Double +walk mp:5 +jump mp:5 + +armor:Standard(Inner Sphere) +LA armor:16 +RA armor:16 +LT armor:19 +RT armor:19 +CT armor:25 +HD armor:9 +LL armor:24 +RL armor:24 +RTL armor:5 +RTR armor:5 +RTC armor:6 + +Weapons:6 +Improved Heavy Large Laser, Right Arm +ER Medium Laser, Left Torso +ER Medium Laser, Left Torso +Improved Heavy Large Laser, Right Torso +ER Small Laser, Head +Streak SRM 4 (I-OS), Left Torso + +Left Arm: +Shoulder +Upper Arm Actuator +Lower Arm Actuator +Hand Actuator +IS Endo Steel +IS Endo Steel +IS Endo Steel +IS Endo Steel +IS Endo Steel +Triple Strength Myomer +Triple Strength Myomer +Triple Strength Myomer + +Right Arm: +Shoulder +Upper Arm Actuator +Lower Arm Actuator +ISDoubleHeatSink +ISDoubleHeatSink +ISDoubleHeatSink +CLImprovedHeavyLargeLaser +CLImprovedHeavyLargeLaser +CLImprovedHeavyLargeLaser +Triple Strength Myomer +Triple Strength Myomer +Triple Strength Myomer + +Left Torso: +ISDoubleHeatSink +ISDoubleHeatSink +ISDoubleHeatSink +Jump Jet +Jump Jet +CLERMediumLaser +CLERMediumLaser +CLStreakSRM4 (IOS) +Coolant Pod +IS Endo Steel +IS Endo Steel +-Empty- + +Right Torso: +ISDoubleHeatSink +ISDoubleHeatSink +ISDoubleHeatSink +Jump Jet +Jump Jet +CLImprovedHeavyLargeLaser +CLImprovedHeavyLargeLaser +CLImprovedHeavyLargeLaser +IS Endo Steel +IS Endo Steel +IS Endo Steel +-Empty- + +Center Torso: +Fusion Engine +Fusion Engine +Fusion Engine +Gyro +Gyro +Gyro +Gyro +Fusion Engine +Fusion Engine +Fusion Engine +Jump Jet +-Empty- + +Head: +Life Support +Sensors +Cockpit +CLERSmallLaser (R) +Sensors +Life Support +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- + +Left Leg: +Hip +Upper Leg Actuator +Lower Leg Actuator +Foot Actuator +IS Endo Steel +IS Endo Steel +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- + +Right Leg: +Hip +Upper Leg Actuator +Lower Leg Actuator +Foot Actuator +IS Endo Steel +IS Endo Steel +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- + +overview:The Starslayer was intended to replace the Crab as the Star League's standard medium 'Mech after Cosara Weaponries were unable to meet the SLDF's required production volumes. +capabilities:The Starslayer is built on a lightweight Thor-4 Endo Steel chassis and reaches a top speed of 86.4 km/h with its Magna 250 fusion engine. The Starslayer also has five Odin's Own Model 34z jump jets which give it the ability to jump up to one hundred and fifty meters. Finally, the design carries nine and a half tons of Norse-34 ferro-fibrous with CASE. The CASE protects the BattleMech from complete destruction in the event of an ammunition explosion. +deployment:No information on this variant +history:Though Blue Shot's design won selection in 2765, the Starslayer would also be plagued with technical delays with its tracking system that would delay full production until 2772 and the Amaris Civil War. Despite the SLDF's desperate need for matériel, tensions between General Kerensky and Archon Robert Steiner II would result in Blue Shot delaying SLDF shipments until 2781 due to lack of "up-to-date" shipping information and as a result the Starslayer would be far more common in the LCAF service than the SLDF. By now a thoroughly Lyran Commonwealth design, production of the original 2C Starslayer would cease during the technological decline of the early Succession Wars, with Blue Shot Weaponry resuming with the superior and updated STY-3C model in wake of the Clan Invasion. +manufacturer:Blue Shot Weapons +primaryfactory:Loxley +systemmanufacturer:CHASSIS:Thor-4 Endo Steel +systemmanufacturer:ENGINE:Magna 250 +systemmanufacturer:ARMOR:Unknown +systemmanufacturer:JUMPJET:Odin’s Own Model 34z +systemmanufacturer:COMMUNICATIONS:Tek BattleCom +systemmanufacturer:TARGETING:FireScan with IndirecTrack + diff --git a/megamek/data/mechfiles/mechs/Recognition Guide ilClan/Vol 27/Gunslinger GUN-3ERD.mtf b/megamek/data/mechfiles/mechs/Recognition Guide ilClan/Vol 27/Gunslinger GUN-3ERD.mtf new file mode 100644 index 00000000000..75b346bcbc6 --- /dev/null +++ b/megamek/data/mechfiles/mechs/Recognition Guide ilClan/Vol 27/Gunslinger GUN-3ERD.mtf @@ -0,0 +1,170 @@ +Version:1.3 +Gunslinger +GUN-3ERD +mul id:9354 +Config:Biped +techbase:Mixed (IS Chassis) +era:3131 +source:Rec Guide:ilClan #27 - Dark Age +rules level:3 + +mass:85 +engine:255 XL (Clan) Engine +structure:IS Standard +myomer:Standard +cockpit:Standard Cockpit +gyro:XL Gyro + +heat sinks:10 IS Double +walk mp:3 +jump mp:2 + +armor:Ballistic-Reinforced(Inner Sphere) +LA armor:25 +RA armor:25 +LT armor:25 +RT armor:25 +CT armor:34 +HD armor:9 +LL armor:32 +RL armor:32 +RTL armor:11 +RTR armor:11 +RTC armor:17 + +Weapons:9 +Small X-Pulse Laser, Right Leg +Small X-Pulse Laser, Head +Gauss Rifle, Left Arm +Gauss Rifle, Right Arm +ER Medium Laser, Left Torso +ER Medium Laser, Left Torso +ER Medium Laser, Right Torso +ER Medium Laser, Right Torso +Small X-Pulse Laser, Left Leg + +Left Arm: +Shoulder +Upper Arm Actuator +Lower Arm Actuator +ISGaussRifle +ISGaussRifle +ISGaussRifle +ISGaussRifle +ISGaussRifle +ISGaussRifle +ISGaussRifle +ISCASEII +-Empty- + +Right Arm: +Shoulder +Upper Arm Actuator +Lower Arm Actuator +ISGaussRifle +ISGaussRifle +ISGaussRifle +ISGaussRifle +ISGaussRifle +ISGaussRifle +ISGaussRifle +ISCASEII +-Empty- + +Left Torso: +Fusion Engine +Fusion Engine +CLERMediumLaser +CLERMediumLaser +IS Gauss Ammo +IS Gauss Ammo +IS Ballistic-Reinforced +IS Ballistic-Reinforced +IS Ballistic-Reinforced +IS Ballistic-Reinforced +IS Ballistic-Reinforced +-Empty- + +Right Torso: +Fusion Engine +Fusion Engine +CLERMediumLaser +CLERMediumLaser +IS Gauss Ammo +IS Gauss Ammo +IS Ballistic-Reinforced +IS Ballistic-Reinforced +IS Ballistic-Reinforced +IS Ballistic-Reinforced +IS Ballistic-Reinforced +-Empty- + +Center Torso: +Fusion Engine +Fusion Engine +Fusion Engine +Gyro +Gyro +Gyro +Gyro +Gyro +Gyro +Fusion Engine +Fusion Engine +Fusion Engine + +Head: +Life Support +Sensors +Cockpit +ISSmallXPulseLaser +Sensors +Life Support +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- + +Left Leg: +Hip +Upper Leg Actuator +Lower Leg Actuator +Foot Actuator +Jump Jet +ISSmallXPulseLaser (R) +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- + +Right Leg: +Hip +Upper Leg Actuator +Lower Leg Actuator +Foot Actuator +Jump Jet +ISSmallXPulseLaser (R) +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- + +overview:The Clan invasion produced some strange bedfellows, the most unlikely of which was the Federated Commonwealth-Draconis Combine quasi-alliance. Though that relationship has deteriorated over the years, the Gunslinger stands as a testament to what can happen when two bitter enemies put aside their mutual hatred and work together to achieve a common goal. +capabilities:To power the Gunslinger, a VOX 255 XL engine is used to give the 'Mech a top speed of 54 km/h. This is augmented by a pair of HildCo Model 12 jump jets that allow the Gunslinger to traverse rough terrain and provide extra mobility at close ranges. The 'Mech is also equipped with a Guardian ECM Suite and a Beagle Active Probe, giving the Gunslinger superior detection capabilities and protection from advanced enemy electronic warfare equipment. Finally, the Gunslinger is protected by fifteen and a half tons of armor, giving the 'Mech excellent armor protection. +deployment:No information on this variant +history:On December 5, 3053, the first FedCom Gunslinger rolled off the assembly line at Defiance Industries. Because of issues with the Gauss weapons, it took nearly two years for the first Combine Gunslinger to leave the Quentin plant. Since then, both plants have built as many Gunslingers as they possibly can each year, severely taxing their resources while breaking production records year after year. Beginning with Operation Guerrero in 3057 and the Lyran Alliance's Jade Falcon invasion in 3058, the Gunslinger demonstrated its capabilities, as it has in every other significant military operation in the Inner Sphere since. As a result, the Gunslinger is still in high demand. +manufacturer:Defiance Industries, Independence Weaponry +primaryfactory:Hesperus II,Quentin +systemmanufacturer:CHASSIS:Star League XT +systemmanufacturer:ENGINE:Various Clan 255 XL +systemmanufacturer:ARMOR:Kevlar 5000 +systemmanufacturer:JUMPJET:HildCo Model 12 +systemmanufacturer:COMMUNICATIONS:Nashan Quartet ComSy with Guardian ECM +systemmanufacturer:TARGETING:Nashan Diana Mark II Targeting Computer + diff --git a/megamek/data/mechfiles/mechs/Recognition Guide ilClan/Vol 27/Nightsky NGS-7S.mtf b/megamek/data/mechfiles/mechs/Recognition Guide ilClan/Vol 27/Nightsky NGS-7S.mtf new file mode 100644 index 00000000000..8fba8e9e508 --- /dev/null +++ b/megamek/data/mechfiles/mechs/Recognition Guide ilClan/Vol 27/Nightsky NGS-7S.mtf @@ -0,0 +1,163 @@ +Version:1.3 +Nightsky +NGS-7S +mul id:9352 +Config:Biped +techbase:Mixed (IS Chassis) +era:3142 +source:Rec Guide:ilClan #27 - Dark Age +rules level:3 + +mass:50 +engine:300 XL (Clan) Engine +structure:IS Standard +myomer:Standard + +heat sinks:13 IS Double +walk mp:6 +jump mp:6 + +armor:Heavy Ferro-Fibrous(Inner Sphere) +LA armor:15 +RA armor:15 +LT armor:18 +RT armor:18 +CT armor:23 +HD armor:9 +LL armor:22 +RL armor:22 +RTL armor:5 +RTR armor:5 +RTC armor:6 + +Weapons:4 +Large X-Pulse Laser, Left Arm +ER Medium Laser, Left Torso +ER Medium Laser, Right Torso +Small X-Pulse Laser, Head + +Left Arm: +Shoulder +Upper Arm Actuator +Lower Arm Actuator +Hand Actuator +ISDoubleHeatSink +ISDoubleHeatSink +ISDoubleHeatSink +ISLargeXPulseLaser +ISLargeXPulseLaser +IS Heavy Ferro-Fibrous +IS Heavy Ferro-Fibrous +-Empty- + +Right Arm: +Shoulder +Upper Arm Actuator +Lower Arm Actuator +Hand Actuator +Hatchet +Hatchet +Hatchet +Hatchet +ISAES +ISAES +IS Heavy Ferro-Fibrous +-Empty- + +Left Torso: +Fusion Engine +Fusion Engine +CLERMediumLaser +IS Heavy Ferro-Fibrous +IS Heavy Ferro-Fibrous +IS Heavy Ferro-Fibrous +IS Heavy Ferro-Fibrous +IS Heavy Ferro-Fibrous +IS Heavy Ferro-Fibrous +IS Heavy Ferro-Fibrous +IS Heavy Ferro-Fibrous +IS Heavy Ferro-Fibrous + +Right Torso: +Fusion Engine +Fusion Engine +CLERMediumLaser +IS Heavy Ferro-Fibrous +IS Heavy Ferro-Fibrous +IS Heavy Ferro-Fibrous +IS Heavy Ferro-Fibrous +IS Heavy Ferro-Fibrous +IS Heavy Ferro-Fibrous +IS Heavy Ferro-Fibrous +IS Heavy Ferro-Fibrous +IS Heavy Ferro-Fibrous + +Center Torso: +Fusion Engine +Fusion Engine +Fusion Engine +Gyro +Gyro +Gyro +Gyro +Fusion Engine +Fusion Engine +Fusion Engine +Jump Jet +Jump Jet + +Head: +Life Support +Sensors +Cockpit +ISSmallXPulseLaser +Sensors +Life Support +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- + +Left Leg: +Hip +Upper Leg Actuator +Lower Leg Actuator +Foot Actuator +Jump Jet +Jump Jet +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- + +Right Leg: +Hip +Upper Leg Actuator +Lower Leg Actuator +Foot Actuator +Jump Jet +Jump Jet +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- + +overview:The Nightsky was a mid-range continuation of the Federated Commonwealth's successful Hatchetman-Axman series, which established melee combat weapons as a powerful and heat-efficient close-combat option for the experienced MechWarrior. Intended to provide both speed and firepower. +capabilities:The Nightsky is built around a massive Vlar 300 XL extralight engine that propels the 'Mech up to speeds of 97.2 km/h. Superb ground speed and the added maneuverability provided by six HildCo Model 13 jump jets that allow the Nightsky to jump up to 180 meters make the Nightsky a capable heavy recon 'Mech. It is also protected with nine and a half tons of armor, providing the Nightsky with good armor protection for its size. +deployment:No information on this variant +history:After their introduction in 3053, Nightskys quickly proliferated throughout the Federated Commonwealth, with many replacing Hatchetmen or Axmen lost in the early years of the Clan invasion. The distribution of this design had become fairly even between the two once-allied states by the time of the Lyran secession from the Commonwealth, resulting in Nightskys appearing among as many pro-Victor Davion troops as pro-Katherine Steiner forces during the FedCom Civil War. +manufacturer:Defiance Industries +primaryfactory:Hesperus II +systemmanufacturer:CHASSIS:Dorwinion Standard +systemmanufacturer:ENGINE:Vlar Light 300 +systemmanufacturer:ARMOR:Kallon Royalstar +systemmanufacturer:JUMPJET:HildCo Model 13 +systemmanufacturer:COMMUNICATIONS:TharHes Calliope Hm10 +systemmanufacturer:TARGETING:TharHes Ares-8a + diff --git a/megamek/data/mechfiles/mechs/Recognition Guide ilClan/Vol 27/Penetrator PTR-8D.mtf b/megamek/data/mechfiles/mechs/Recognition Guide ilClan/Vol 27/Penetrator PTR-8D.mtf new file mode 100644 index 00000000000..7512b0293e8 --- /dev/null +++ b/megamek/data/mechfiles/mechs/Recognition Guide ilClan/Vol 27/Penetrator PTR-8D.mtf @@ -0,0 +1,170 @@ +Version:1.3 +Penetrator +PTR-8D +mul id:9353 +Config:Biped +techbase:Inner Sphere +era:3144 +source:Rec Guide:ilClan #27 - Dark Age +rules level:3 + +mass:75 +engine:300 Fusion Engine(IS) +structure:IS Endo Steel +myomer:Standard +cockpit:Standard Cockpit +gyro:Compact Gyro + +heat sinks:13 IS Double +walk mp:4 +jump mp:4 + +armor:Reflective(Inner Sphere) +LA armor:21 +RA armor:21 +LT armor:24 +RT armor:24 +CT armor:34 +HD armor:9 +LL armor:26 +RL armor:26 +RTL armor:7 +RTR armor:7 +RTC armor:9 + +Weapons:9 +Large Re-engineered Laser, Left Arm +Large Re-engineered Laser, Right Arm +Medium Laser, Left Torso +Medium Laser, Right Torso +Medium Laser, Left Torso +Medium Laser, Right Torso +Medium Laser, Left Torso +Medium Laser, Right Torso +Laser AMS, Center Torso + +Left Arm: +Shoulder +Upper Arm Actuator +Lower Arm Actuator +Large Re-engineered Laser +Large Re-engineered Laser +Large Re-engineered Laser +Large Re-engineered Laser +Large Re-engineered Laser +IS Endo Steel +IS Endo Steel +IS Reflective +IS Reflective + +Right Arm: +Shoulder +Upper Arm Actuator +Lower Arm Actuator +Large Re-engineered Laser +Large Re-engineered Laser +Large Re-engineered Laser +Large Re-engineered Laser +Large Re-engineered Laser +IS Endo Steel +IS Endo Steel +IS Reflective +IS Reflective + +Left Torso: +Medium Laser +Medium Laser +Medium Laser +Coolant Pod +IS Endo Steel +IS Endo Steel +IS Endo Steel +IS Endo Steel +IS Endo Steel +IS Reflective +IS Reflective +IS Reflective + +Right Torso: +ISDoubleHeatSink +ISDoubleHeatSink +ISDoubleHeatSink +Medium Laser +Medium Laser +Medium Laser +IS Endo Steel +IS Endo Steel +IS Endo Steel +IS Endo Steel +IS Endo Steel +IS Reflective + +Center Torso: +Fusion Engine +Fusion Engine +Fusion Engine +Gyro +Gyro +Fusion Engine +Fusion Engine +Fusion Engine +ISLaserAntiMissileSystem +ISLaserAntiMissileSystem +IS Reflective +IS Reflective + +Head: +Life Support +Sensors +Cockpit +-Empty- +Sensors +Life Support +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- + +Left Leg: +Hip +Upper Leg Actuator +Lower Leg Actuator +Foot Actuator +Jump Jet +Jump Jet +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- + +Right Leg: +Hip +Upper Leg Actuator +Lower Leg Actuator +Foot Actuator +Jump Jet +Jump Jet +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- + +overview:The designers at Kallon Industries used the Black Hawk Clan OmniMech as the basis for the Penetrator. +capabilities:The Penetrator has an all energy weapons arsenal and uses twelve double heat sinks to handle the massive heat load from its weapons. The 'Mech is lacking in speed though when compared to the Black Hawk. This is because the 'Mechs designers used a Vlar 300 fusion engine for its combat durability, giving the 'Mech a top speed of 64.8 km/h. To help offset the 'Mech's lack of mobility, the Penetrator has four Anderson 398 jump jets giving it added mobility with a jumping distance of one hundred and twenty meters. The Penetrator also carries a respectable thirteen tons of armor. The 'Mech's heavy armor protection, +deployment:No information on this variant available +history:With the threat of the Clans looming over it, the Federated Commonwealth dispatched a large number of Penetrators to units stationed in Lyran space. Following the secession of the Commonwealth's Lyran half and the formation of the Lyran Alliance under Katherine Steiner-Davion in 3058, many Penetrators ended up on the LAAF's rolls. Penetrators served on both sides of the FedCom Civil War, demonstrating their toughness yet again. The 'Mech's low reliance on ammunition made it ideal for the mobile campaigns that defined that conflict. Archer's Avengers and other allied forces conducted a planet-hopping campaign, always staying one step ahead of the Loyalist forces pursuing them. The Avengers had to live off the land because reliable supply lines were almost non-existent. The Penetrator was an ideal combat unit because it required little ammunition and had few advanced components. Several Penetrators were captured by mercenary units during the FedCom Civil War. According to rumors, Kallon Industries may soon change its policy of only selling the design to the Federated Commonwealth and now the Federated Suns. +manufacturer:Kallon Weapon Industries +primaryfactory:Talon (Wernke) +systemmanufacturer:CHASSIS:Crucis G Endo-Steel +systemmanufacturer:ENGINE:Vlar 300 +systemmanufacturer:ARMOR:StarGuard Reflec +systemmanufacturer:JUMPJET:Anderson 398 +systemmanufacturer:COMMUNICATIONS:Dalban Micronics +systemmanufacturer:TARGETING:Matabushi Sentinel + diff --git a/megamek/data/mechfiles/mechs/3055U/Phantom F.mtf b/megamek/data/mechfiles/mechs/Recognition Guide ilClan/Vol 27/Phantom F.mtf similarity index 98% rename from megamek/data/mechfiles/mechs/3055U/Phantom F.mtf rename to megamek/data/mechfiles/mechs/Recognition Guide ilClan/Vol 27/Phantom F.mtf index 9eab0f962f2..1b2606d840f 100644 --- a/megamek/data/mechfiles/mechs/3055U/Phantom F.mtf +++ b/megamek/data/mechfiles/mechs/Recognition Guide ilClan/Vol 27/Phantom F.mtf @@ -6,7 +6,7 @@ mul id:4818 Config:Biped Omnimech TechBase:Clan Era:3068 -Source:TRO 3055 - Jihad +Source:Rec Guide:ilClan #27 - Jihad Rules Level:3 Mass:40 diff --git a/megamek/data/mechfiles/mechs/Recognition Guide ilClan/Vol 27/Phantom G.mtf b/megamek/data/mechfiles/mechs/Recognition Guide ilClan/Vol 27/Phantom G.mtf new file mode 100644 index 00000000000..92cdcf9977c --- /dev/null +++ b/megamek/data/mechfiles/mechs/Recognition Guide ilClan/Vol 27/Phantom G.mtf @@ -0,0 +1,161 @@ +Version:1.3 +Phantom +G +mul id:9346 +Config:Biped Omnimech +techbase:Clan +era:3090 +source:Rec Guide:ilClan #27 - Early Republic +rules level:2 + +mass:40 +engine:360 XL (Clan) Engine(IS) +structure:Clan Endo Steel +myomer:Standard + +heat sinks:12 Clan Double +base chassis heat sinks:12 +walk mp:9 +jump mp:0 + +armor:Ferro-Fibrous(Clan) +LA armor:12 +RA armor:12 +LT armor:11 +RT armor:11 +CT armor:12 +HD armor:9 +LL armor:13 +RL armor:13 +RTL armor:7 +RTR armor:7 +RTC armor:8 + +Weapons:2 +ProtoMech AC/4, Left Arm +ER Medium Laser, Right Arm + +Left Arm: +Shoulder +Upper Arm Actuator +CLProtoMechAC4 (OMNIPOD) +CLProtoMechAC4 (OMNIPOD) +CLProtoMechAC4 (OMNIPOD) +Clan ProtoMech AC/4 Ammo (OMNIPOD) +Clan Endo Steel +Clan Ferro-Fibrous +-Empty- +-Empty- +-Empty- +-Empty- + +Right Arm: +Shoulder +Upper Arm Actuator +Lower Arm Actuator +Hand Actuator +CLERMediumLaser (OMNIPOD) +Clan Endo Steel +Clan Ferro-Fibrous +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- + +Left Torso: +Fusion Engine +Fusion Engine +Clan Endo Steel +Clan Ferro-Fibrous +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- + +Right Torso: +Fusion Engine +Fusion Engine +Clan Endo Steel +Clan Ferro-Fibrous +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- + +Center Torso: +Fusion Engine +Fusion Engine +Fusion Engine +Gyro +Gyro +Gyro +Gyro +Fusion Engine +Fusion Engine +Fusion Engine +Clan Endo Steel +-Empty- + +Head: +Life Support +Sensors +Cockpit +Clan Ferro-Fibrous +Sensors +Life Support +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- + +Left Leg: +Hip +Upper Leg Actuator +Lower Leg Actuator +Foot Actuator +Clan Endo Steel +Clan Ferro-Fibrous +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- + +Right Leg: +Hip +Upper Leg Actuator +Lower Leg Actuator +Foot Actuator +Clan Endo Steel +Clan Ferro-Fibrous +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- + +overview:The Phantom was pushed into production by Khan Phelan Ward shortly before the Refusal War between Clan Wolf and Clan Jade Falcon, designed around Khan Ward's extensive experience with Inner Sphere tactics. +capabilities:Intended to push a medium reconnaisance 'Mech to the most extreme limits, the Phantom is built on a lightweight Type-A Endo Steel chassis and is propelled to a top speed of 151.2 km/h by a Light Force 360 XL Engine. The Phantom also boasts strong protection for its size with six tons of Composite A-2 Ferro-Fibrous armor. +deployment:No information on this variant +history:After the Wars of Reaving, the Phantom replaced the Fire Moth Omnimech for the remaining Home Clans because of its similar role and heavier profile. +manufacturer:W-5 Facilities, Wolf Clan Site 1 +primaryfactory:Eden, Arc-Royal +systemmanufacturer:CHASSIS:Type-A Endo Steel +systemmanufacturer:ENGINE:Light Force 360 (XL) +systemmanufacturer:ARMOR:Composite A-2 Ferro-Fibrous +systemmanufacturer:COMMUNICATIONS:Howler 79 +systemmanufacturer:TARGETING:Model 92 “Stalker†+ diff --git a/megamek/data/mechfiles/mechs/Recognition Guide ilClan/Vol 27/Phantom I.mtf b/megamek/data/mechfiles/mechs/Recognition Guide ilClan/Vol 27/Phantom I.mtf new file mode 100644 index 00000000000..dc25b86a61b --- /dev/null +++ b/megamek/data/mechfiles/mechs/Recognition Guide ilClan/Vol 27/Phantom I.mtf @@ -0,0 +1,162 @@ +Version:1.3 +Phantom +I +mul id:9347 +Config:Biped Omnimech +techbase:Clan +era:3141 +source:Rec Guide:ilClan #27 - Dark Age +rules level:2 + +mass:40 +engine:360 XL (Clan) Engine(IS) +structure:Clan Endo Steel +myomer:Standard + +heat sinks:12 Clan Double +base chassis heat sinks:12 +walk mp:9 +jump mp:0 + +armor:Ferro-Fibrous(Clan) +LA armor:12 +RA armor:12 +LT armor:11 +RT armor:11 +CT armor:12 +HD armor:9 +LL armor:13 +RL armor:13 +RTL armor:7 +RTR armor:7 +RTC armor:8 + +Weapons:3 +Improved Heavy Large Laser, Left Arm +ER Medium Laser, Right Arm +Light TAG, Left Torso + +Left Arm: +Shoulder +Upper Arm Actuator +CLImprovedHeavyLargeLaser (OMNIPOD) +CLImprovedHeavyLargeLaser (OMNIPOD) +CLImprovedHeavyLargeLaser (OMNIPOD) +Clan Endo Steel +Clan Ferro-Fibrous +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- + +Right Arm: +Shoulder +Upper Arm Actuator +Lower Arm Actuator +Hand Actuator +CLERMediumLaser (OMNIPOD) +Clan Endo Steel +Clan Ferro-Fibrous +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- + +Left Torso: +Fusion Engine +Fusion Engine +CLLightTAG (OMNIPOD) +Clan Endo Steel +Clan Ferro-Fibrous +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- + +Right Torso: +Fusion Engine +Fusion Engine +Clan Endo Steel +Clan Ferro-Fibrous +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- + +Center Torso: +Fusion Engine +Fusion Engine +Fusion Engine +Gyro +Gyro +Gyro +Gyro +Fusion Engine +Fusion Engine +Fusion Engine +CLTargeting Computer (OMNIPOD) +Clan Endo Steel + +Head: +Life Support +Sensors +Cockpit +Clan Ferro-Fibrous +Sensors +Life Support +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- + +Left Leg: +Hip +Upper Leg Actuator +Lower Leg Actuator +Foot Actuator +Clan Endo Steel +Clan Ferro-Fibrous +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- + +Right Leg: +Hip +Upper Leg Actuator +Lower Leg Actuator +Foot Actuator +Clan Endo Steel +Clan Ferro-Fibrous +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- + +overview:The Phantom was pushed into production by Khan Phelan Ward shortly before the Refusal War between Clan Wolf and Clan Jade Falcon, designed around Khan Ward's extensive experience with Inner Sphere tactics. +capabilities:Intended to push a medium reconnaisance 'Mech to the most extreme limits, the Phantom is built on a lightweight Type-A Endo Steel chassis and is propelled to a top speed of 151.2 km/h by a Light Force 360 XL Engine. The Phantom also boasts strong protection for its size with six tons of Composite A-2 Ferro-Fibrous armor. +deployment:No information on this variant +history:After the Wars of Reaving, the Phantom replaced the Fire Moth Omnimech for the remaining Home Clans because of its similar role and heavier profile. +manufacturer:Earthwerks-FWL, Inc., Manufacturing Plant SFF-TS1 +primaryfactory:Keystone,CSF Tsunami Mobile Production Facility +systemmanufacturer:CHASSIS:Type-A Endo Steel +systemmanufacturer:ENGINE:Light Force 360 (XL) +systemmanufacturer:ARMOR:Composite A-2 Ferro-Fibrous +systemmanufacturer:COMMUNICATIONS:Howler 79 +systemmanufacturer:TARGETING:Model 92 “Stalker†+ diff --git a/megamek/data/mechfiles/mechs/Recognition Guide ilClan/Vol 27/Phantom J.mtf b/megamek/data/mechfiles/mechs/Recognition Guide ilClan/Vol 27/Phantom J.mtf new file mode 100644 index 00000000000..adfbb12da33 --- /dev/null +++ b/megamek/data/mechfiles/mechs/Recognition Guide ilClan/Vol 27/Phantom J.mtf @@ -0,0 +1,164 @@ +Version:1.3 +Phantom +J +mul id:9348 +Config:Biped Omnimech +techbase:Clan +era:3141 +source:Rec Guide:ilClan #27 - Dark Age +rules level:2 + +mass:40 +engine:360 XL (Clan) Engine(IS) +structure:Clan Endo Steel +myomer:Standard + +heat sinks:12 Clan Double +base chassis heat sinks:12 +walk mp:9 +jump mp:0 + +armor:Ferro-Fibrous(Clan) +LA armor:12 +RA armor:12 +LT armor:11 +RT armor:11 +CT armor:12 +HD armor:9 +LL armor:13 +RL armor:13 +RTL armor:7 +RTR armor:7 +RTC armor:8 + +Weapons:5 +ER Medium Laser, Left Arm +ER Medium Laser, Left Arm +ER Medium Laser, Left Arm +Improved Heavy Medium Laser, Right Arm +ER Small Laser, Left Torso + +Left Arm: +Shoulder +Upper Arm Actuator +CLERMediumLaser (OMNIPOD) +CLERMediumLaser (OMNIPOD) +CLERMediumLaser (OMNIPOD) +Clan Endo Steel +Clan Ferro-Fibrous +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- + +Right Arm: +Shoulder +Upper Arm Actuator +Lower Arm Actuator +Hand Actuator +CLImprovedMediumHeavyLaser (OMNIPOD) +CLImprovedMediumHeavyLaser (OMNIPOD) +Clan Endo Steel +Clan Ferro-Fibrous +-Empty- +-Empty- +-Empty- +-Empty- + +Left Torso: +Fusion Engine +Fusion Engine +CLERSmallLaser (OMNIPOD) +Clan Endo Steel +Clan Ferro-Fibrous +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- + +Right Torso: +Fusion Engine +Fusion Engine +Clan Endo Steel +Clan Ferro-Fibrous +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- + +Center Torso: +Fusion Engine +Fusion Engine +Fusion Engine +Gyro +Gyro +Gyro +Gyro +Fusion Engine +Fusion Engine +Fusion Engine +Supercharger (OMNIPOD) +Clan Endo Steel + +Head: +Life Support +Sensors +Cockpit +Clan Ferro-Fibrous +Sensors +Life Support +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- + +Left Leg: +Hip +Upper Leg Actuator +Lower Leg Actuator +Foot Actuator +Clan Endo Steel +Clan Ferro-Fibrous +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- + +Right Leg: +Hip +Upper Leg Actuator +Lower Leg Actuator +Foot Actuator +Clan Endo Steel +Clan Ferro-Fibrous +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- + +overview:The Phantom was pushed into production by Khan Phelan Ward shortly before the Refusal War between Clan Wolf and Clan Jade Falcon, designed around Khan Ward's extensive experience with Inner Sphere tactics. +capabilities:Intended to push a medium reconnaisance 'Mech to the most extreme limits, the Phantom is built on a lightweight Type-A Endo Steel chassis and is propelled to a top speed of 151.2 km/h by a Light Force 360 XL Engine. The Phantom also boasts strong protection for its size with six tons of Composite A-2 Ferro-Fibrous armor. +deployment:No information on this variant +history:After the Wars of Reaving, the Phantom replaced the Fire Moth Omnimech for the remaining Home Clans because of its similar role and heavier profile. +manufacturer:Earthwerks-FWL, Inc., Manufacturing Plant SFF-TS1 +primaryfactory:Keystone,CSF Tsunami Mobile Production Facility +systemmanufacturer:CHASSIS:Type-A Endo Steel +systemmanufacturer:ENGINE:Light Force 360 (XL) +systemmanufacturer:ARMOR:Composite A-2 Ferro-Fibrous +systemmanufacturer:COMMUNICATIONS:Howler 79 +systemmanufacturer:TARGETING:Model 92 “Stalker†+ diff --git a/megamek/data/mechfiles/mechs/Recognition Guide ilClan/Vol 27/Phantom K.mtf b/megamek/data/mechfiles/mechs/Recognition Guide ilClan/Vol 27/Phantom K.mtf new file mode 100644 index 00000000000..8b08e20b14b --- /dev/null +++ b/megamek/data/mechfiles/mechs/Recognition Guide ilClan/Vol 27/Phantom K.mtf @@ -0,0 +1,160 @@ +Version:1.3 +Phantom +K +mul id:9349 +Config:Biped Omnimech +techbase:Clan +era:3141 +source:Rec Guide:ilClan #27 - Dark Age +rules level:2 + +mass:40 +engine:360 XL (Clan) Engine(IS) +structure:Clan Endo Steel +myomer:Standard + +heat sinks:12 Clan Double +base chassis heat sinks:12 +walk mp:9 +jump mp:0 + +armor:Ferro-Fibrous(Clan) +LA armor:12 +RA armor:12 +LT armor:11 +RT armor:11 +CT armor:12 +HD armor:9 +LL armor:13 +RL armor:13 +RTL armor:7 +RTR armor:7 +RTC armor:8 + +Weapons:1 +ER Large Laser, Left Torso + +Left Arm: +Shoulder +Upper Arm Actuator +Clan Endo Steel +Clan Ferro-Fibrous +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- + +Right Arm: +Shoulder +Upper Arm Actuator +Lower Arm Actuator +Hand Actuator +Clan Endo Steel +Clan Ferro-Fibrous +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- + +Left Torso: +Fusion Engine +Fusion Engine +CLERLargeLaser (OMNIPOD) +Clan Endo Steel +Clan Ferro-Fibrous +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- + +Right Torso: +Fusion Engine +Fusion Engine +WatchdogECMSuite (OMNIPOD) +WatchdogECMSuite (OMNIPOD) +Clan Endo Steel +Clan Ferro-Fibrous +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- + +Center Torso: +Fusion Engine +Fusion Engine +Fusion Engine +Gyro +Gyro +Gyro +Gyro +Fusion Engine +Fusion Engine +Fusion Engine +CLTargeting Computer (OMNIPOD) +Clan Endo Steel + +Head: +Life Support +Sensors +Cockpit +Clan Ferro-Fibrous +Sensors +Life Support +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- + +Left Leg: +Hip +Upper Leg Actuator +Lower Leg Actuator +Foot Actuator +Clan Endo Steel +Clan Ferro-Fibrous +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- + +Right Leg: +Hip +Upper Leg Actuator +Lower Leg Actuator +Foot Actuator +Clan Endo Steel +Clan Ferro-Fibrous +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- + +overview:The Phantom was pushed into production by Khan Phelan Ward shortly before the Refusal War between Clan Wolf and Clan Jade Falcon, designed around Khan Ward's extensive experience with Inner Sphere tactics. +capabilities:Intended to push a medium reconnaisance 'Mech to the most extreme limits, the Phantom is built on a lightweight Type-A Endo Steel chassis and is propelled to a top speed of 151.2 km/h by a Light Force 360 XL Engine. The Phantom also boasts strong protection for its size with six tons of Composite A-2 Ferro-Fibrous armor. +deployment:No information on this variant +history:After the Wars of Reaving, the Phantom replaced the Fire Moth Omnimech for the remaining Home Clans because of its similar role and heavier profile. +manufacturer:Earthwerks-FWL, Inc., Manufacturing Plant SFF-TS1 +primaryfactory:Keystone,CSF Tsunami Mobile Production Facility +systemmanufacturer:CHASSIS:Type-A Endo Steel +systemmanufacturer:ENGINE:Light Force 360 (XL) +systemmanufacturer:ARMOR:Composite A-2 Ferro-Fibrous +systemmanufacturer:COMMUNICATIONS:Howler 79 +systemmanufacturer:TARGETING:Model 92 “Stalker†+ diff --git a/megamek/data/mechfiles/mechs/Recognition Guide ilClan/Vol 27/Phantom L.mtf b/megamek/data/mechfiles/mechs/Recognition Guide ilClan/Vol 27/Phantom L.mtf new file mode 100644 index 00000000000..eae9288df78 --- /dev/null +++ b/megamek/data/mechfiles/mechs/Recognition Guide ilClan/Vol 27/Phantom L.mtf @@ -0,0 +1,163 @@ +Version:1.3 +Phantom +L +mul id:9350 +Config:Biped Omnimech +techbase:Clan +era:3142 +source:Rec Guide:ilClan #27 - Dark Age +rules level:2 + +mass:40 +engine:360 XL (Clan) Engine(IS) +structure:Clan Endo Steel +myomer:Standard + +heat sinks:12 Clan Double +base chassis heat sinks:12 +walk mp:9 +jump mp:0 + +armor:Ferro-Fibrous(Clan) +LA armor:12 +RA armor:12 +LT armor:11 +RT armor:11 +CT armor:12 +HD armor:9 +LL armor:13 +RL armor:13 +RTL armor:7 +RTR armor:7 +RTC armor:8 + +Weapons:4 +AP Gauss Rifle, Left Arm +AP Gauss Rifle, Left Arm +AP Gauss Rifle, Left Arm +Plasma Cannon, Right Arm + +Left Arm: +Shoulder +Upper Arm Actuator +CLAPGaussRifle (OMNIPOD) +CLAPGaussRifle (OMNIPOD) +CLAPGaussRifle (OMNIPOD) +CLAPGaussRifle Ammo (OMNIPOD) +Clan Endo Steel +Clan Ferro-Fibrous +-Empty- +-Empty- +-Empty- +-Empty- + +Right Arm: +Shoulder +Upper Arm Actuator +Lower Arm Actuator +Hand Actuator +CLPlasmaCannon (OMNIPOD) +CLPlasmaCannonAmmo (OMNIPOD) +Clan Endo Steel +Clan Ferro-Fibrous +-Empty- +-Empty- +-Empty- +-Empty- + +Left Torso: +Fusion Engine +Fusion Engine +Clan Endo Steel +Clan Ferro-Fibrous +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- + +Right Torso: +Fusion Engine +Fusion Engine +Clan Endo Steel +Clan Ferro-Fibrous +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- + +Center Torso: +Fusion Engine +Fusion Engine +Fusion Engine +Gyro +Gyro +Gyro +Gyro +Fusion Engine +Fusion Engine +Fusion Engine +Clan Endo Steel +-Empty- + +Head: +Life Support +Sensors +Cockpit +Clan Ferro-Fibrous +Sensors +Life Support +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- + +Left Leg: +Hip +Upper Leg Actuator +Lower Leg Actuator +Foot Actuator +Clan Endo Steel +Clan Ferro-Fibrous +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- + +Right Leg: +Hip +Upper Leg Actuator +Lower Leg Actuator +Foot Actuator +Clan Endo Steel +Clan Ferro-Fibrous +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- + +overview:The Phantom was pushed into production by Khan Phelan Ward shortly before the Refusal War between Clan Wolf and Clan Jade Falcon, designed around Khan Ward's extensive experience with Inner Sphere tactics. +capabilities:Intended to push a medium reconnaisance 'Mech to the most extreme limits, the Phantom is built on a lightweight Type-A Endo Steel chassis and is propelled to a top speed of 151.2 km/h by a Light Force 360 XL Engine. The Phantom also boasts strong protection for its size with six tons of Composite A-2 Ferro-Fibrous armor. +deployment:No information on this variant +history:After the Wars of Reaving, the Phantom replaced the Fire Moth Omnimech for the remaining Home Clans because of its similar role and heavier profile. +manufacturer:Earthwerks-FWL, Inc., Manufacturing Plant SFF-TS1 +primaryfactory:Keystone,CSF Tsunami Mobile Production Facility +systemmanufacturer:CHASSIS:Type-A Endo Steel +systemmanufacturer:ENGINE:Light Force 360 (XL) +systemmanufacturer:ARMOR:Composite A-2 Ferro-Fibrous +systemmanufacturer:COMMUNICATIONS:Howler 79 +systemmanufacturer:TARGETING:Model 92 “Stalker†+ diff --git a/megamek/data/mechfiles/mechs/Recognition Guide ilClan/Vol 27/Phantom R.mtf b/megamek/data/mechfiles/mechs/Recognition Guide ilClan/Vol 27/Phantom R.mtf new file mode 100644 index 00000000000..d208c2eae86 --- /dev/null +++ b/megamek/data/mechfiles/mechs/Recognition Guide ilClan/Vol 27/Phantom R.mtf @@ -0,0 +1,164 @@ +Version:1.3 +Phantom +R +mul id:9351 +Config:Biped Omnimech +techbase:Mixed (Clan Chassis) +era:3145 +source:Rec Guide:ilClan #27 - Dark Age +rules level:2 + +mass:40 +engine:360 XL (Clan) Engine +structure:Clan Endo Steel +myomer:Standard + +heat sinks:12 Clan Double +base chassis heat sinks:12 +walk mp:9 +jump mp:0 + +armor:Ferro-Fibrous(Clan) +LA armor:12 +RA armor:12 +LT armor:11 +RT armor:11 +CT armor:12 +HD armor:9 +LL armor:13 +RL armor:13 +RTL armor:7 +RTR armor:7 +RTC armor:8 + +Weapons:5 +SRM 6, Left Arm +Medium Laser, Right Arm +Medium Laser, Right Arm +Improved Heavy Medium Laser, Right Torso +Improved Heavy Medium Laser, Left Torso + +Left Arm: +Shoulder +Upper Arm Actuator +CLSRM6 (OMNIPOD) +Clan Ammo SRM-6 (OMNIPOD) +Clan Endo Steel +Clan Ferro-Fibrous +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- + +Right Arm: +Shoulder +Upper Arm Actuator +Lower Arm Actuator +Hand Actuator +Medium Laser (OMNIPOD) +Medium Laser (OMNIPOD) +Clan Endo Steel +Clan Ferro-Fibrous +-Empty- +-Empty- +-Empty- +-Empty- + +Left Torso: +Fusion Engine +Fusion Engine +CLImprovedMediumHeavyLaser (OMNIPOD) +CLImprovedMediumHeavyLaser (OMNIPOD) +Clan Endo Steel +Clan Ferro-Fibrous +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- + +Right Torso: +Fusion Engine +Fusion Engine +CLImprovedMediumHeavyLaser (OMNIPOD) +CLImprovedMediumHeavyLaser (OMNIPOD) +Clan Endo Steel +Clan Ferro-Fibrous +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- + +Center Torso: +Fusion Engine +Fusion Engine +Fusion Engine +Gyro +Gyro +Gyro +Gyro +Fusion Engine +Fusion Engine +Fusion Engine +Clan Endo Steel +-Empty- + +Head: +Life Support +Sensors +Cockpit +Clan Ferro-Fibrous +Sensors +Life Support +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- + +Left Leg: +Hip +Upper Leg Actuator +Lower Leg Actuator +Foot Actuator +Clan Endo Steel +Clan Ferro-Fibrous +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- + +Right Leg: +Hip +Upper Leg Actuator +Lower Leg Actuator +Foot Actuator +Clan Endo Steel +Clan Ferro-Fibrous +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- + +overview:The Phantom was pushed into production by Khan Phelan Ward shortly before the Refusal War between Clan Wolf and Clan Jade Falcon, designed around Khan Ward's extensive experience with Inner Sphere tactics. +capabilities:Intended to push a medium reconnaisance 'Mech to the most extreme limits, the Phantom is built on a lightweight Type-A Endo Steel chassis and is propelled to a top speed of 151.2 km/h by a Light Force 360 XL Engine. The Phantom also boasts strong protection for its size with six tons of Composite A-2 Ferro-Fibrous armor. +deployment:No information on this variant +history:After the Wars of Reaving, the Phantom replaced the Fire Moth Omnimech for the remaining Home Clans because of its similar role and heavier profile. +manufacturer:Earthwerks-FWL, Inc., Manufacturing Plant SFF-TS1 +primaryfactory:Keystone,CSF Tsunami Mobile Production Facility +systemmanufacturer:CHASSIS:Type-A Endo Steel +systemmanufacturer:ENGINE:Light Force 360 (XL) +systemmanufacturer:ARMOR:Composite A-2 Ferro-Fibrous +systemmanufacturer:COMMUNICATIONS:Howler 79 +systemmanufacturer:TARGETING:Model 92 “Stalker†+ diff --git a/megamek/data/mechfiles/mechs/Recognition Guide ilClan/Vol 27/Phantom T.mtf b/megamek/data/mechfiles/mechs/Recognition Guide ilClan/Vol 27/Phantom T.mtf new file mode 100644 index 00000000000..e5f4d706c93 --- /dev/null +++ b/megamek/data/mechfiles/mechs/Recognition Guide ilClan/Vol 27/Phantom T.mtf @@ -0,0 +1,163 @@ +Version:1.3 +Phantom +T +mul id:9345 +Config:Biped Omnimech +techbase:Clan +era:3142 +source:Rec Guide:ilClan #27 - Dark Age +rules level:2 + +mass:40 +engine:360 XL (Clan) Engine(IS) +structure:Clan Endo Steel +myomer:Standard + +heat sinks:12 Clan Double +base chassis heat sinks:12 +walk mp:9 +jump mp:0 + +armor:Ferro-Fibrous(Clan) +LA armor:12 +RA armor:12 +LT armor:11 +RT armor:11 +CT armor:12 +HD armor:9 +LL armor:13 +RL armor:13 +RTL armor:7 +RTR armor:7 +RTC armor:8 + +Weapons:4 +LRM 5, Left Arm +ER Medium Pulse Laser, Right Arm +ER Small Laser, Left Torso +Micro Pulse Laser, Left Torso + +Left Arm: +Shoulder +Upper Arm Actuator +Lower Arm Actuator +CLLRM5 (OMNIPOD) +CLArtemisV (OMNIPOD) +CLArtemisV (OMNIPOD) +Clan Ammo LRM-5 (Clan) Artemis V-capable (OMNIPOD) +Clan Endo Steel +Clan Ferro-Fibrous +-Empty- +-Empty- +-Empty- + +Right Arm: +Shoulder +Upper Arm Actuator +Lower Arm Actuator +Hand Actuator +CLERMediumPulseLaser (OMNIPOD) +CLERMediumPulseLaser (OMNIPOD) +Clan Endo Steel +Clan Ferro-Fibrous +-Empty- +-Empty- +-Empty- +-Empty- + +Left Torso: +Fusion Engine +Fusion Engine +CLERSmallLaser (OMNIPOD) +CLMicroPulseLaser (OMNIPOD) +Clan Endo Steel +Clan Ferro-Fibrous +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- + +Right Torso: +Fusion Engine +Fusion Engine +Clan Endo Steel +Clan Ferro-Fibrous +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- + +Center Torso: +Fusion Engine +Fusion Engine +Fusion Engine +Gyro +Gyro +Gyro +Gyro +Fusion Engine +Fusion Engine +Fusion Engine +Clan Endo Steel +-Empty- + +Head: +Life Support +Sensors +Cockpit +Clan Ferro-Fibrous +Sensors +Life Support +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- + +Left Leg: +Hip +Upper Leg Actuator +Lower Leg Actuator +Foot Actuator +Clan Endo Steel +Clan Ferro-Fibrous +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- + +Right Leg: +Hip +Upper Leg Actuator +Lower Leg Actuator +Foot Actuator +Clan Endo Steel +Clan Ferro-Fibrous +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- + +overview:The Phantom was pushed into production by Khan Phelan Ward shortly before the Refusal War between Clan Wolf and Clan Jade Falcon, designed around Khan Ward's extensive experience with Inner Sphere tactics. +capabilities:Intended to push a medium reconnaisance 'Mech to the most extreme limits, the Phantom is built on a lightweight Type-A Endo Steel chassis and is propelled to a top speed of 151.2 km/h by a Light Force 360 XL Engine. The Phantom also boasts strong protection for its size with six tons of Composite A-2 Ferro-Fibrous armor. +deployment:No information on this variant +history:After the Wars of Reaving, the Phantom replaced the Fire Moth Omnimech for the remaining Home Clans because of its similar role and heavier profile. +manufacturer:Earthwerks-FWL, Inc., Manufacturing Plant SFF-TS1 +primaryfactory:Keystone,CSF Tsunami Mobile Production Facility +systemmanufacturer:CHASSIS:Type-A Endo Steel +systemmanufacturer:ENGINE:Light Force 360 (XL) +systemmanufacturer:ARMOR:Composite A-2 Ferro-Fibrous +systemmanufacturer:COMMUNICATIONS:Howler 79 +systemmanufacturer:TARGETING:Model 92 “Stalker†+ diff --git a/megamek/data/mechfiles/mechs/Recognition Guide ilClan/Vol 6/Marauder C.mtf b/megamek/data/mechfiles/mechs/Recognition Guide ilClan/Vol 6/Marauder C.mtf index 36280659421..590ba04d25a 100644 --- a/megamek/data/mechfiles/mechs/Recognition Guide ilClan/Vol 6/Marauder C.mtf +++ b/megamek/data/mechfiles/mechs/Recognition Guide ilClan/Vol 6/Marauder C.mtf @@ -5,7 +5,7 @@ mul id:2032 Config:Biped techbase:Mixed (Clan Chassis) -era:3050 +era:2827 source:Rec Guide:ilClan #6 - Clan Invasion rules level:4 diff --git a/megamek/data/mechfiles/mechs/Recognition Guide ilClan/Vol 7/Warhammer C 2.mtf b/megamek/data/mechfiles/mechs/Recognition Guide ilClan/Vol 7/Warhammer C 2.mtf index b2345b14c1d..275c63f77dc 100644 --- a/megamek/data/mechfiles/mechs/Recognition Guide ilClan/Vol 7/Warhammer C 2.mtf +++ b/megamek/data/mechfiles/mechs/Recognition Guide ilClan/Vol 7/Warhammer C 2.mtf @@ -1,20 +1,19 @@ -Version:1.0 +Version:1.3 Warhammer C 2 mul id:7565 - Config:Biped techbase:Mixed (IS Chassis) era:3052 source:Rec Guide:ilClan #7 - Clan Invasion -rules level:4 +rules level:3 mass:70 engine:280 Fusion Engine(IS) structure:IS Standard myomer:Standard -heat sinks:18 Double +heat sinks:18 IS Double walk mp:4 jump mp:0 diff --git a/megamek/data/mechfiles/mechs/Recognition Guide ilClan/Vol 7/Warhammer C 3.mtf b/megamek/data/mechfiles/mechs/Recognition Guide ilClan/Vol 7/Warhammer C 3.mtf index e0ef96e06fb..f67c557797f 100644 --- a/megamek/data/mechfiles/mechs/Recognition Guide ilClan/Vol 7/Warhammer C 3.mtf +++ b/megamek/data/mechfiles/mechs/Recognition Guide ilClan/Vol 7/Warhammer C 3.mtf @@ -1,155 +1,155 @@ -Version:1.1 -Warhammer -C 3 - -Config:Biped -techbase:Clan -era:2850 -source:Rec Guide:ilClan #7 - Clan Invasion -rules level:2 - -mass:70 -engine:280 XL (Clan) Engine(IS) -structure:Clan Endo Steel -myomer:Standard - -heat sinks:17 Clan Double -walk mp:4 -jump mp:0 - -armor:Standard(Clan) -LA armor:22 -RA armor:22 -LT armor:22 -RT armor:22 -CT armor:33 -HD armor:9 -LL armor:30 -RL armor:30 -RTL armor:8 -RTR armor:8 -RTC armor:11 - -Weapons:8 -ER PPC, Left Arm -ER PPC, Right Arm -Streak SRM 6, Left Torso -ER Medium Laser, Left Torso -Medium Pulse Laser, Left Torso -Streak SRM 6, Right Torso -ER Medium Laser, Right Torso -Medium Pulse Laser, Right Torso - -Left Arm: -Shoulder -Upper Arm Actuator -Lower Arm Actuator -CLDoubleHeatSink -CLDoubleHeatSink -CLERPPC -CLERPPC -Clan Endo Steel -Clan Endo Steel --Empty- --Empty- --Empty- - -Right Arm: -Shoulder -Upper Arm Actuator -Lower Arm Actuator -CLDoubleHeatSink -CLDoubleHeatSink -CLERPPC -CLERPPC -Clan Endo Steel -Clan Endo Steel --Empty- --Empty- --Empty- - -Left Torso: -Fusion Engine -Fusion Engine -CLStreakSRM6 -CLStreakSRM6 -CLERMediumLaser -CLMediumPulseLaser -Clan Streak SRM 6 Ammo -Clan Endo Steel -CLTargeting Computer -CLTargeting Computer -CLTargeting Computer -CLTargeting Computer - -Right Torso: -Fusion Engine -Fusion Engine -CLDoubleHeatSink -CLDoubleHeatSink -CLDoubleHeatSink -CLDoubleHeatSink -CLStreakSRM6 -CLStreakSRM6 -CLERMediumLaser -CLMediumPulseLaser -Clan Streak SRM 6 Ammo -Clan Endo Steel - -Center Torso: -Fusion Engine -Fusion Engine -Fusion Engine -Gyro -Gyro -Gyro -Gyro -Fusion Engine -Fusion Engine -Fusion Engine -CLDoubleHeatSink -CLDoubleHeatSink - -Head: -Life Support -Sensors -Cockpit -CLECMSuite -Sensors -Life Support --Empty- --Empty- --Empty- --Empty- --Empty- --Empty- - -Left Leg: -Hip -Upper Leg Actuator -Lower Leg Actuator -Foot Actuator -CLDoubleHeatSink -CLDoubleHeatSink --Empty- --Empty- --Empty- --Empty- --Empty- --Empty- - -Right Leg: -Hip -Upper Leg Actuator -Lower Leg Actuator -Foot Actuator -ISAntiPersonnelPod -Clan Endo Steel --Empty- --Empty- --Empty- --Empty- --Empty- --Empty- - +Version:1.3 +Warhammer +C 3 +mul id:7566 +Config:Biped +techbase:Clan +era:2862 +source:Rec Guide:ilClan #7 - Early Succession War +rules level:2 + +mass:70 +engine:280 XL (Clan) Engine(IS) +structure:Clan Endo Steel +myomer:Standard + +heat sinks:17 Clan Double +walk mp:4 +jump mp:0 + +armor:Standard(Clan) +LA armor:22 +RA armor:22 +LT armor:22 +RT armor:22 +CT armor:33 +HD armor:9 +LL armor:30 +RL armor:30 +RTL armor:8 +RTR armor:8 +RTC armor:11 + +Weapons:8 +ER PPC, Left Arm +ER PPC, Right Arm +Streak SRM 6, Left Torso +ER Medium Laser, Left Torso +Medium Pulse Laser, Left Torso +Streak SRM 6, Right Torso +ER Medium Laser, Right Torso +Medium Pulse Laser, Right Torso + +Left Arm: +Shoulder +Upper Arm Actuator +Lower Arm Actuator +CLDoubleHeatSink +CLDoubleHeatSink +CLERPPC +CLERPPC +Clan Endo Steel +Clan Endo Steel +-Empty- +-Empty- +-Empty- + +Right Arm: +Shoulder +Upper Arm Actuator +Lower Arm Actuator +CLDoubleHeatSink +CLDoubleHeatSink +CLERPPC +CLERPPC +Clan Endo Steel +Clan Endo Steel +-Empty- +-Empty- +-Empty- + +Left Torso: +Fusion Engine +Fusion Engine +CLStreakSRM6 +CLStreakSRM6 +CLERMediumLaser +CLMediumPulseLaser +Clan Streak SRM 6 Ammo +Clan Endo Steel +CLTargeting Computer +CLTargeting Computer +CLTargeting Computer +CLTargeting Computer + +Right Torso: +Fusion Engine +Fusion Engine +CLDoubleHeatSink +CLDoubleHeatSink +CLDoubleHeatSink +CLDoubleHeatSink +CLStreakSRM6 +CLStreakSRM6 +CLERMediumLaser +CLMediumPulseLaser +Clan Streak SRM 6 Ammo +Clan Endo Steel + +Center Torso: +Fusion Engine +Fusion Engine +Fusion Engine +Gyro +Gyro +Gyro +Gyro +Fusion Engine +Fusion Engine +Fusion Engine +CLDoubleHeatSink +CLDoubleHeatSink + +Head: +Life Support +Sensors +Cockpit +CLECMSuite +Sensors +Life Support +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- + +Left Leg: +Hip +Upper Leg Actuator +Lower Leg Actuator +Foot Actuator +CLDoubleHeatSink +CLDoubleHeatSink +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- + +Right Leg: +Hip +Upper Leg Actuator +Lower Leg Actuator +Foot Actuator +ISAntiPersonnelPod +Clan Endo Steel +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- +-Empty- + diff --git a/megamek/data/mechfiles/mechs/Recognition Guide ilClan/Vol 7/Warhammer C.mtf b/megamek/data/mechfiles/mechs/Recognition Guide ilClan/Vol 7/Warhammer C.mtf index 40b769f83ac..21f5b36bf64 100644 --- a/megamek/data/mechfiles/mechs/Recognition Guide ilClan/Vol 7/Warhammer C.mtf +++ b/megamek/data/mechfiles/mechs/Recognition Guide ilClan/Vol 7/Warhammer C.mtf @@ -1,13 +1,12 @@ -Version:1.0 +Version:1.3 Warhammer C mul id:3479 - Config:Biped techbase:Mixed (IS Chassis) -era:3050 +era:2825 source:Rec Guide:ilClan #7 - Clan Invasion -rules level:4 +rules level:3 mass:70 engine:280 Fusion Engine(IS) diff --git a/megamek/data/mechfiles/mechs/Recognition Guide ilClan/Vol 8/Rifleman C.mtf b/megamek/data/mechfiles/mechs/Recognition Guide ilClan/Vol 8/Rifleman C.mtf index f6d27e0c0ca..4854ee88e97 100644 --- a/megamek/data/mechfiles/mechs/Recognition Guide ilClan/Vol 8/Rifleman C.mtf +++ b/megamek/data/mechfiles/mechs/Recognition Guide ilClan/Vol 8/Rifleman C.mtf @@ -5,7 +5,7 @@ mul id:2693 Config:Biped techbase:Mixed (IS Chassis) -era:3052 +era:2826 source:Rec Guide:ilClan #8 - Clan Invasion rules level:4 diff --git a/megamek/data/mechfiles/mechs/XTRs/Boondocks/Merlin MLN-SX.mtf b/megamek/data/mechfiles/mechs/XTRs/Boondocks/Merlin MLN-SX.mtf index 5344ebcc50f..17f58e3aeb8 100644 --- a/megamek/data/mechfiles/mechs/XTRs/Boondocks/Merlin MLN-SX.mtf +++ b/megamek/data/mechfiles/mechs/XTRs/Boondocks/Merlin MLN-SX.mtf @@ -149,4 +149,19 @@ Jump Jet -Empty- -Empty- +overview:The Merlin uses components that are all reliable and readily available, making the Merlin a durable and easy-to-repair 'Mech. +capabilities:The 'Mech is powered by a Pitban 240 fusion engine that gives it a top speed of 64.8 km/h. The Merlin carries ten and a half tons of armor, which is a respectable amount of protection for its weight. Additionally, the Merlin carries eighteen heat sinks to handle its heavy heat load. + +deployment:An experimental variant of the Merlin which was created by the FedSuns' Sabanillas Mining Company and developed in 3075. Created by retired FedSun Major Caleb Gruber, he used his company to produce three of these modified Merlins. Gruber had the Merlin's internal structured strengthened by installing Endo-Composite Internal Structure and switching out the Standard Pitban Fusion Engine for a Lighter version. He then added five tons of Armored Shielding to protect the 'Mech's engine and side torsos. Gruber then exchanged the original 1A's medium lasers for Blakist tech Medium VSP Lasers. He then added ancient or Retrotech Laser Insulators to help cool down the VSP lasers. Lastly, he exchanged the old PPC for a Bombast Laser. The MLN-SX also sports 14 Double heat sinks. + +history:The Merlin debuted in 3010 as a product of the rebuilt Mountain Wolf BattleMechs. The Merlin was hailed as a technological marvel at the time it was released, as it was the first completely new design to be developed in over 100 years. + +manufacturer:Sabanillas Mining Company +primaryfactory:Sabanillas +systemmanufacturer:CHASSIS:Heavy Star QAT-4 Endo-Composite +systemmanufacturer:ENGINE:Pitban 240 Light Fusion +systemmanufacturer:ARMOR:Longanecker PlastiSteel with CASE +systemmanufacturer:JUMPJET:Pitban LFT 50 +systemmanufacturer:COMMUNICATIONS:Magestrix Alpha +systemmanufacturer:TARGETING:Magestrix Gamma diff --git a/megamek/data/mechfiles/name_changes.txt b/megamek/data/mechfiles/name_changes.txt index afa5042baa7..d5a96ab1c1a 100644 --- a/megamek/data/mechfiles/name_changes.txt +++ b/megamek/data/mechfiles/name_changes.txt @@ -726,6 +726,8 @@ Vector (Attack)|Vector Combat Support VTOL (Attack) Vector (EW)|Vector Combat Support VTOL (EW) Vector (Scout)|Vector Combat Support VTOL (Scout) Vector (Transport)|Vector Combat Support VTOL (Transport) +LTV-4 Hover Tank (Standard)|Hawk Hover Tank (LTV-4) +Falcon Hover Tank (Standard)|Falcon Hover Tank #Warships Aegis Heavy Cruiser (Clan)|Aegis Heavy Cruiser (2843) diff --git a/megamek/data/mechfiles/vehicles/3039u/Axel Heavy Tank Mk 1.blk b/megamek/data/mechfiles/vehicles/3039u/Axel Heavy Tank Mk 1.blk index df719d854b4..a95c114fc3a 100644 --- a/megamek/data/mechfiles/vehicles/3039u/Axel Heavy Tank Mk 1.blk +++ b/megamek/data/mechfiles/vehicles/3039u/Axel Heavy Tank Mk 1.blk @@ -3,7 +3,7 @@ 1 -# Write the version number just in case... +##Write the version number just in case... MAM0 @@ -28,6 +28,10 @@ Mk 1 3036 + +3036 + + IS Level 1 @@ -36,6 +40,9 @@ IS Level 1 Tracked + + + 3 @@ -81,6 +88,30 @@ Machine Gun Autocannon/20 + +To make room for the engine, the tank is only protected by ten and a half tons of armor. The internal combustion engine also reduces the top speed of the tank to 54 km/h. + + + +The Axel series of heavy tanks are based on the popular Rommel design, but uses an internal combustion engine. + + + +The Axel Mk 1 retains the heavy hitting AC/20 of the Rommel, and upgrades the LRM system to a ten tube launcher. A Machine Gun mounted in the bow of the tank allows the driver to engage infantry units, while a second machine gun is added to the turret. The LRM has two tons of ammunition available, while the autocannon has four tons of ammo. A half ton of machine gun ammunition is provided. + + + +The tank was produced by engineers working for the Free Rasalhague Republic. Despite the lighter armor and lower top speed, the Axel family was widely used by the Free Rasalhague Republic. + + + +Benson and Bjorn + + + +Spittal + + TRO 3039 - Succession Wars @@ -88,3 +119,8 @@ TRO 3039 - Succession Wars 65.0 + + +PETROCHEMICALS + + diff --git a/megamek/data/mechfiles/vehicles/3039u/Axel Heavy Tank Mk 2.blk b/megamek/data/mechfiles/vehicles/3039u/Axel Heavy Tank Mk 2.blk index 0c5907e4cb4..d17aa434d6d 100644 --- a/megamek/data/mechfiles/vehicles/3039u/Axel Heavy Tank Mk 2.blk +++ b/megamek/data/mechfiles/vehicles/3039u/Axel Heavy Tank Mk 2.blk @@ -89,3 +89,39 @@ TRO 3039 - Succession Wars 65.0 + + +To make room for the engine, the tank is only protected by ten and a half tons of armor. The internal combustion engine also reduces the top speed of the tank to 54 km/h. + + + +The Axel series of heavy tanks are based on the popular Rommel design, but uses an internal combustion engine. + + + +Developed in parallel with the Axel Mk 1, the Axel Mk 2 removes a half-ton of armor and one ton of LRM ammunition to make room for a Vehicle Flamer. It has the same performance and protection as the Axel Mk 1. + + + +The tank was produced by engineers working for the Free Rasalhague Republic. Despite the lighter armor and lower top speed, the Axel family was widely used by the Free Rasalhague Republic. + + + +Benson and Bjorn + + + +Spittal + + + +TRO 3039 - Succession Wars + + + +65.0 + + + +PETROCHEMICALS + \ No newline at end of file diff --git a/megamek/data/mechfiles/vehicles/3039u/Condor Heavy Hover Tank (Davion).blk b/megamek/data/mechfiles/vehicles/3039u/Condor Heavy Hover Tank (Davion).blk index 76eabda9c86..5176230f6dc 100644 --- a/megamek/data/mechfiles/vehicles/3039u/Condor Heavy Hover Tank (Davion).blk +++ b/megamek/data/mechfiles/vehicles/3039u/Condor Heavy Hover Tank (Davion).blk @@ -84,3 +84,35 @@ TRO 3039 - Succession Wars 50.0 + + +Although expensive to buy and to maintain, this immense hovercraft is capable of a flank speed of 129 km/h and a cruising speed of 86 km/h, making it one of the fastest vehicles in its weight class and as fast as the speediest 'Mechs and vehicles. Six tons of StarSlab/9.5 Mk II armor give the Condor considerable protection for its role, though the bulk is concentrated on the front and turret, notably weakening the sides. Unlike tracked or wheeled vehicles of the same weight, the Condor is intended to attack enemies "on the fly" at medium ranges, + + + +A heavy cavalry unit designed for rapid reaction to a shifting battle, the Condor is one of the few heavy hover tanks available. + + + +A 2952 variant popular among AFFS units, House Davion forces generally strip both the lasers from the turret for two Autocannon/2s, with forty-five shots of ammunition per gun. + + + +Introduced a few short years before the formation of the original Star League, the Condor remained one of Red Devil Industries main sellers for centuries and was widely distributed across the Inner Sphere, with the militaries of the Lyran Commonwealth, Federated Suns and Capellan Confederation fielding the majority during the Succession Wars. With the loss of Red Devil's factories with the capture of Pandora by Clan Jade Falcon in 3064, the design was secured by Quikscell Company, who developed an advanced new-tech refresh of the venerable and still highly popular design, even selling the unassembled components of the tank in kit form in effort to keep up with demand. Red Devil actually builds their own under license. Originally, Defiance Industries declined to allow the company to do so, which led to Red Devil offering a bounty for used or slightly damaged lasers taken in combat to recondition and install on new Condors. When Defiance noticed that some of its flagship BattleMech designs, such as the Zeus, attracted undue fire from foes attempting to cash in on the bounty, they quickly relented. Not nearly as notable, the reliable SureFire MiniGun, mounted on the body, is intended as an anti-personnel weapon. + + + +Field Refit + + + +Various + + + +CHASSIS:Unknown +ENGINE:Jones 165 ICE +ARMOR:StarSlab/9.5 Mk II +COMMUNICATIONS:TharHes KR-A P/Comm +TARGETING:TharHes Mars 1 + \ No newline at end of file diff --git a/megamek/data/mechfiles/vehicles/3039u/Condor Heavy Hover Tank (Flamer).blk b/megamek/data/mechfiles/vehicles/3039u/Condor Heavy Hover Tank (Flamer).blk index c88122a7c3b..e672bcb9fd0 100644 --- a/megamek/data/mechfiles/vehicles/3039u/Condor Heavy Hover Tank (Flamer).blk +++ b/megamek/data/mechfiles/vehicles/3039u/Condor Heavy Hover Tank (Flamer).blk @@ -86,3 +86,35 @@ TRO 3039 - Succession Wars 50.0 + + +Although expensive to buy and to maintain, this immense hovercraft is capable of a flank speed of 129 km/h and a cruising speed of 86 km/h, making it one of the fastest vehicles in its weight class and as fast as the speediest 'Mechs and vehicles. Six tons of StarSlab/9.5 Mk II armor give the Condor considerable protection for its role, though the bulk is concentrated on the front and turret, notably weakening the sides. Unlike tracked or wheeled vehicles of the same weight, the Condor is intended to attack enemies "on the fly" at medium ranges, + + + +A heavy cavalry unit designed for rapid reaction to a shifting battle, the Condor is one of the few heavy hover tanks available. + + + +This 3025 version of Condor changes the weapons array and adds armor. A vehicular Flamer is mounted fore and aft, each with a ton of ammunition. The turret contains a pair of Machine Guns and trio of medium lasers. + + + +Introduced a few short years before the formation of the original Star League, the Condor remained one of Red Devil Industries main sellers for centuries and was widely distributed across the Inner Sphere, with the militaries of the Lyran Commonwealth, Federated Suns and Capellan Confederation fielding the majority during the Succession Wars. With the loss of Red Devil's factories with the capture of Pandora by Clan Jade Falcon in 3064, the design was secured by Quikscell Company, who developed an advanced new-tech refresh of the venerable and still highly popular design, even selling the unassembled components of the tank in kit form in effort to keep up with demand. Red Devil actually builds their own under license. Originally, Defiance Industries declined to allow the company to do so, which led to Red Devil offering a bounty for used or slightly damaged lasers taken in combat to recondition and install on new Condors. When Defiance noticed that some of its flagship BattleMech designs, such as the Zeus, attracted undue fire from foes attempting to cash in on the bounty, they quickly relented. Not nearly as notable, the reliable SureFire MiniGun, mounted on the body, is intended as an anti-personnel weapon. + + + +Field Refit + + + +Various + + + +CHASSIS:Unknown +ENGINE:Jones 165 ICE +ARMOR:StarSlab/9.5 Mk II +COMMUNICATIONS:TharHes KR-A P/Comm +TARGETING:TharHes Mars 1 + \ No newline at end of file diff --git a/megamek/data/mechfiles/vehicles/3039u/Condor Heavy Hover Tank (Liao).blk b/megamek/data/mechfiles/vehicles/3039u/Condor Heavy Hover Tank (Liao).blk index ed9a077b88e..9babe459722 100644 --- a/megamek/data/mechfiles/vehicles/3039u/Condor Heavy Hover Tank (Liao).blk +++ b/megamek/data/mechfiles/vehicles/3039u/Condor Heavy Hover Tank (Liao).blk @@ -81,3 +81,35 @@ TRO 3039 - Succession Wars 50.0 + + +Although expensive to buy and to maintain, this immense hovercraft is capable of a flank speed of 129 km/h and a cruising speed of 86 km/h, making it one of the fastest vehicles in its weight class and as fast as the speediest 'Mechs and vehicles. Six tons of StarSlab/9.5 Mk II armor give the Condor considerable protection for its role, though the bulk is concentrated on the front and turret, notably weakening the sides. Unlike tracked or wheeled vehicles of the same weight, the Condor is intended to attack enemies "on the fly" at medium ranges, + + + +A heavy cavalry unit designed for rapid reaction to a shifting battle, the Condor is one of the few heavy hover tanks available. + + + +A 2878 variant sighted in House Liao space, the CCAF strip out the Whirlwind and opt for four medium lasers instead. + + + +Introduced a few short years before the formation of the original Star League, the Condor remained one of Red Devil Industries main sellers for centuries and was widely distributed across the Inner Sphere, with the militaries of the Lyran Commonwealth, Federated Suns and Capellan Confederation fielding the majority during the Succession Wars. With the loss of Red Devil's factories with the capture of Pandora by Clan Jade Falcon in 3064, the design was secured by Quikscell Company, who developed an advanced new-tech refresh of the venerable and still highly popular design, even selling the unassembled components of the tank in kit form in effort to keep up with demand. Red Devil actually builds their own under license. Originally, Defiance Industries declined to allow the company to do so, which led to Red Devil offering a bounty for used or slightly damaged lasers taken in combat to recondition and install on new Condors. When Defiance noticed that some of its flagship BattleMech designs, such as the Zeus, attracted undue fire from foes attempting to cash in on the bounty, they quickly relented. Not nearly as notable, the reliable SureFire MiniGun, mounted on the body, is intended as an anti-personnel weapon. + + + +Field Refit + + + +Various + + + +CHASSIS:Unknown +ENGINE:Jones 165 ICE +ARMOR:StarSlab/9.5 Mk II +COMMUNICATIONS:TharHes KR-A P/Comm +TARGETING:TharHes Mars 1 + \ No newline at end of file diff --git a/megamek/data/mechfiles/vehicles/3039u/Condor Heavy Hover Tank.blk b/megamek/data/mechfiles/vehicles/3039u/Condor Heavy Hover Tank.blk index 15591f794e2..0bc157d158a 100644 --- a/megamek/data/mechfiles/vehicles/3039u/Condor Heavy Hover Tank.blk +++ b/megamek/data/mechfiles/vehicles/3039u/Condor Heavy Hover Tank.blk @@ -83,3 +83,35 @@ TRO 3039 - Age of War 50.0 + + +Although expensive to buy and to maintain, this immense hovercraft is capable of a flank speed of 129 km/h and a cruising speed of 86 km/h, making it one of the fastest vehicles in its weight class and as fast as the speediest 'Mechs and vehicles. Six tons of StarSlab/9.5 Mk II armor give the Condor considerable protection for its role, though the bulk is concentrated on the front and turret, notably weakening the sides. Unlike tracked or wheeled vehicles of the same weight, the Condor is intended to attack enemies "on the fly" at medium ranges, + + + +A heavy cavalry unit designed for rapid reaction to a shifting battle, the Condor is one of the few heavy hover tanks available. + + + +The Condor is intended to attack enemies "on the fly" at medium ranges, carrying a GM Whirlwind Class 5 autocannon and a pair of Defiance B3M medium lasers in its turret. While many manufacturers are forced to buy the popular Defiance B3M medium laser at the going market rate. + + + +Introduced a few short years before the formation of the original Star League, the Condor remained one of Red Devil Industries main sellers for centuries and was widely distributed across the Inner Sphere, with the militaries of the Lyran Commonwealth, Federated Suns and Capellan Confederation fielding the majority during the Succession Wars. With the loss of Red Devil's factories with the capture of Pandora by Clan Jade Falcon in 3064, the design was secured by Quikscell Company, who developed an advanced new-tech refresh of the venerable and still highly popular design, even selling the unassembled components of the tank in kit form in effort to keep up with demand. Red Devil actually builds their own under license. Originally, Defiance Industries declined to allow the company to do so, which led to Red Devil offering a bounty for used or slightly damaged lasers taken in combat to recondition and install on new Condors. When Defiance noticed that some of its flagship BattleMech designs, such as the Zeus, attracted undue fire from foes attempting to cash in on the bounty, they quickly relented. Not nearly as notable, the reliable SureFire MiniGun, mounted on the body, is intended as an anti-personnel weapon. + + + +Red Devil Industries,Jalastar Aerospace + + + +Pandora,Panpour + + + +CHASSIS:Unknown +ENGINE:Jones 165 ICE +ARMOR:StarSlab/9.5 Mk II +COMMUNICATIONS:TharHes KR-A P/Comm +TARGETING:TharHes Mars 1 + diff --git a/megamek/data/mechfiles/vehicles/3039u/Maxim Heavy Hover Transport (SRM2).blk b/megamek/data/mechfiles/vehicles/3039u/Maxim Heavy Hover Transport (SRM2).blk index cc8f5091127..b8da95c2e9f 100644 --- a/megamek/data/mechfiles/vehicles/3039u/Maxim Heavy Hover Transport (SRM2).blk +++ b/megamek/data/mechfiles/vehicles/3039u/Maxim Heavy Hover Transport (SRM2).blk @@ -94,3 +94,36 @@ TRO 3039 - Succession Wars 50.0 + + +The Maxim transport fulfilled an infantryman's dream. Its single infantry bay is configured to carry an entire foot platoon with enough space for them to check their weapons and move around comfortably. +The seats are all padded and face the centre of the vehicle, allowing infantry to communicate with one another and boost morale. Unlike other craft, the crew of the Maxim can deflate the rear portion of the hover skirt when disembarking or mounting up. In a combat situation, the Maxim also performs admirably. With its short- and long-range missiles, the hovertank can provide cover fire in any direction for a debarking infantry platoon. + + + +While many infantry transports have been popular, none have reached the iconic status of the Maxim. + + + +Another common modification, this moves the side-mounted SRM-2s into the turret for a wider range of fire. + + + +Nobody anticipated how quickly the Maxim would become a success after it was designed and manufactured by Maxim Transport Industries, a start-up company on Al Na'ir led by a retired infantry general. The Maxim has spread to every corner of the Inner Sphere and is now considered the standard for troop transports. Many units rejoiced at the prospect of being able to transport their infantry platoons in a single vehicle rather than three or four separate vehicles. The company thrived and later opened plants on Skye and Sian, with plans to open plants on Atreus and Kathil once several more vehicles could be produced. While the Maxim was a huge success, many of MTI's other forays into the military market were abysmal failures, and the company barely survived. During the beginning of 3037, a massive scandal erupted throughout the company, effectively ending it. Accusations of inappropriate behaviour among coworkers, embezzlement, and rumours of bizarre hazing rituals led to the company's demise and dissolution. Sensing an opportunity, prominent corporations purchased nearby Maxim facilities at low rates, and in the case of the Sian facility, with armed force. + + + +Field Refit + + + +Field Refit + + + +CHASSIS:Unknown +ENGINE:PowerTech 165 Highlift ICE +ARMOR:ArcShield V +COMMUNICATIONS:Maxim New Standard I/O +TARGETING:Maxim New Standard TargetTrack + \ No newline at end of file diff --git a/megamek/data/mechfiles/vehicles/3039u/Maxim Heavy Hover Transport (SRM4).blk b/megamek/data/mechfiles/vehicles/3039u/Maxim Heavy Hover Transport (SRM4).blk index 818e39201d5..ed333283c78 100644 --- a/megamek/data/mechfiles/vehicles/3039u/Maxim Heavy Hover Transport (SRM4).blk +++ b/megamek/data/mechfiles/vehicles/3039u/Maxim Heavy Hover Transport (SRM4).blk @@ -95,3 +95,36 @@ TRO 3039 - Succession Wars 50.0 + + +The Maxim transport fulfilled an infantryman's dream. Its single infantry bay is configured to carry an entire foot platoon with enough space for them to check their weapons and move around comfortably. +The seats are all padded and face the centre of the vehicle, allowing infantry to communicate with one another and boost morale. Unlike other craft, the crew of the Maxim can deflate the rear portion of the hover skirt when disembarking or mounting up. In a combat situation, the Maxim also performs admirably. With its short- and long-range missiles, the hovertank can provide cover fire in any direction for a debarking infantry platoon. + + + +While many infantry transports have been popular, none have reached the iconic status of the Maxim. + + + +Virtually similar to the SRM variant, this Maxim sacrifices one of the SRM-4s to carry additional ammo. + + + +Nobody anticipated how quickly the Maxim would become a success after it was designed and manufactured by Maxim Transport Industries, a start-up company on Al Na'ir led by a retired infantry general. The Maxim has spread to every corner of the Inner Sphere and is now considered the standard for troop transports. Many units rejoiced at the prospect of being able to transport their infantry platoons in a single vehicle rather than three or four separate vehicles. The company thrived and later opened plants on Skye and Sian, with plans to open plants on Atreus and Kathil once several more vehicles could be produced. While the Maxim was a huge success, many of MTI's other forays into the military market were abysmal failures, and the company barely survived. During the beginning of 3037, a massive scandal erupted throughout the company, effectively ending it. Accusations of inappropriate behaviour among coworkers, embezzlement, and rumours of bizarre hazing rituals led to the company's demise and dissolution. Sensing an opportunity, prominent corporations purchased nearby Maxim facilities at low rates, and in the case of the Sian facility, with armed force. + + + +Field Refit + + + +Field Refit + + + +CHASSIS:Unknown +ENGINE:PowerTech 165 Highlift ICE +ARMOR:ArcShield V +COMMUNICATIONS:Maxim New Standard I/O +TARGETING:Maxim New Standard TargetTrack + \ No newline at end of file diff --git a/megamek/data/mechfiles/vehicles/3039u/Maxim Heavy Hover Transport.blk b/megamek/data/mechfiles/vehicles/3039u/Maxim Heavy Hover Transport.blk index 0545f35d34b..a14ee45fd7f 100644 --- a/megamek/data/mechfiles/vehicles/3039u/Maxim Heavy Hover Transport.blk +++ b/megamek/data/mechfiles/vehicles/3039u/Maxim Heavy Hover Transport.blk @@ -94,3 +94,36 @@ TRO 3039 - Star League 50.0 + + +The Maxim transport fulfilled an infantryman's dream. Its single infantry bay is configured to carry an entire foot platoon with enough space for them to check their weapons and move around comfortably. +The seats are all padded and face the centre of the vehicle, allowing infantry to communicate with one another and boost morale. Unlike other craft, the crew of the Maxim can deflate the rear portion of the hover skirt when disembarking or mounting up. In a combat situation, the Maxim also performs admirably. With its short- and long-range missiles, the hovertank can provide cover fire in any direction for a debarking infantry platoon. + + + +While many infantry transports have been popular, none have reached the iconic status of the Maxim. + + + +The Maxim provides a heavy amount of firepower for an APC, designed to provide covering fire for deploying infantry and to support them in the field. Twin forward facing and a rear facing LongFire V LRM-5 provide long range fire, while side-mounted Sureshot II SRM-2s and a turret-mounted SureShot Mk VI SRM-6 provide close range support. A set of three machine guns in the turret deal with any unarmored infantry it may encounter. + + + +Nobody anticipated how quickly the Maxim would become a success after it was designed and manufactured by Maxim Transport Industries, a start-up company on Al Na'ir led by a retired infantry general. The Maxim has spread to every corner of the Inner Sphere and is now considered the standard for troop transports. Many units rejoiced at the prospect of being able to transport their infantry platoons in a single vehicle rather than three or four separate vehicles. The company thrived and later opened plants on Skye and Sian, with plans to open plants on Atreus and Kathil once several more vehicles could be produced. While the Maxim was a huge success, many of MTI's other forays into the military market were abysmal failures, and the company barely survived. During the beginning of 3037, a massive scandal erupted throughout the company, effectively ending it. Accusations of inappropriate behaviour among coworkers, embezzlement, and rumours of bizarre hazing rituals led to the company's demise and dissolution. Sensing an opportunity, prominent corporations purchased nearby Maxim facilities at low rates, and in the case of the Sian facility, with armed force. + + + +Maxim Transport Industries,Scarborough Manufacturers,Hellespont Industrials,Maxim Transport Industries,Cyclops, Incorporated,Maxim Transport Industries + + + +Al Na'ir,Al Na'ir,Sian,Sian,Skye,Skye + + + +CHASSIS:Unknown +ENGINE:PowerTech 165 Highlift ICE +ARMOR:ArcShield V +COMMUNICATIONS:Maxim New Standard I/O +TARGETING:Maxim New Standard TargetTrack + \ No newline at end of file diff --git a/megamek/data/mechfiles/vehicles/3039u/Patton Tank.blk b/megamek/data/mechfiles/vehicles/3039u/Patton Tank.blk index 827968660cc..be7fcfb5ad5 100644 --- a/megamek/data/mechfiles/vehicles/3039u/Patton Tank.blk +++ b/megamek/data/mechfiles/vehicles/3039u/Patton Tank.blk @@ -3,7 +3,7 @@ 1 -# Write the version number just in case... +##Write the version number just in case... MAM0 @@ -28,6 +28,10 @@ Patton Tank 3027 + +3027 + + IS Level 1 @@ -36,6 +40,9 @@ IS Level 1 Tracked + + + 4 @@ -77,6 +84,37 @@ LRM 5 Autocannon/10 + +The Patton mounts an AC/10, giving it twice the ammunition capacity and superior firing range while also enabling it to be fitted with more armor. The Patton is capable of fighting in short-ranged and urban environments, but is far more suited than the Rommel to engaging targets at medium to long range. + + + +The Patton tank is a 65-ton armored combat vehicle, specializing in conventional armored warfare. Identical to its twin, the Rommel, in every way but armament and armor configuration, the Patton has primarily served with the Lyran Commonwealth and the Lyran Alliance. + + + +The Patton uses a single Defiance Killer Type T Autocannon/10 as its main armament. While not as able to cripple 'Mechs when compared to the Rommel's AC/20, the Patton has a longer ranged AC/10 and 14.5T of armor. More armor than the Rommel, and indeed many mechs. The Patton adds a Coventry Five-Tube LRM-5 for added punch at range. To counterattacking infantry, a turret-mounted Defiance ASL Small Laser, and a front-mounted Hotshot Flamer are equipped. + + + +Designed concurrently with the Rommel, Defiance Industries decided that a vehicle to replace 'Mechs was needed in the early 3000s. Since 'Mech production was nearly at a standstill, the ability to produce and field armored vehicles became a necessity no Successor State could ignore. + + + +Defiance Industries, General Motors + + + +Hesperus II,Salem + + + +ENGINE:Magna 260 +ARMOR:Durallex Heavy +COMMUNICATIONS:TharHes Muse 54-58K +TARGETING:TharHes Mars5 + + TRO 3039 - Succession Wars @@ -84,3 +122,4 @@ TRO 3039 - Succession Wars 65.0 + diff --git a/megamek/data/mechfiles/vehicles/3039u/Rommel Tank.blk b/megamek/data/mechfiles/vehicles/3039u/Rommel Tank.blk index b139d7a4186..8b23513130c 100644 --- a/megamek/data/mechfiles/vehicles/3039u/Rommel Tank.blk +++ b/megamek/data/mechfiles/vehicles/3039u/Rommel Tank.blk @@ -78,10 +78,45 @@ LRM 5 Autocannon/20 + +65.0 + + + +With its default main weapon being the massive and immensely powerful but short-ranged AC/20, the Rommel is best suited to close range and urban fighting, where its heavy gun can be put to excellent use. A Rommel may lie in wait around a corner or down an alley, and then use its devastating armament to cripple or destroy a BattleMech when it comes into view. The main advantage the Rommel has over other, older designs is a combination of higher speed and more armor. With even more armor than a Demolisher tank, the Rommel can sustain more punishment, yet slip away faster to fight again from another position. + + + +The Rommel tank is a 65-ton armored combat vehicle, specializing in close range fighting and urban combat. Identical to its twin, the Patton, in every way but armament and armor configuration, the Rommel has primarily served with the Lyran Commonwealth and the Lyran Alliance. + + + +The Rommel uses a single Defiance 'Mech Hunter Autocannon/20 as its main armament. Able to cripple light and medium 'Mechs with a single well-placed shot from the main gun, the Rommel can also keep an enemy at bay with a Coventry Five-Tube LRM-5 System while retreating to another position. If attacked by infantry, or as a last resort, the tank commander can aim a single Defiance A5L Small Laser. + + + +The Rommel was designed concurrently with the Patton in the early 3000s, when Defiance Industries decided that an armored combat vehicle capable of replacing 'Mechs was needed. Since 'Mech production was nearly at a standstill, the ability to produce and field armored vehicles became a necessity for every Successor State. + + + +Defiance Industries, General Motors,Alliance Defenders Limited + + + +Hesperus II,Salem,Alpheratz + + + +ENGINE:Magna 260 +ARMOR:Durallex Heavy +COMMUNICATIONS:TharHes Muse 54-58K +TARGETING:TharHes Mars5 + + TRO 3039 - Succession Wars 65.0 - + \ No newline at end of file diff --git a/megamek/data/mechfiles/vehicles/3058Uu/Axel Heavy Tank IIC (Standard).blk b/megamek/data/mechfiles/vehicles/3058Uu/Axel Heavy Tank IIC (Standard).blk index 12b2bcb813b..4423d4d3b56 100644 --- a/megamek/data/mechfiles/vehicles/3058Uu/Axel Heavy Tank IIC (Standard).blk +++ b/megamek/data/mechfiles/vehicles/3058Uu/Axel Heavy Tank IIC (Standard).blk @@ -98,3 +98,35 @@ Jihad 65.0 + + +To make room for the engine, the tank is only protected by ten and a half tons of armor. The internal combustion engine also reduces the top speed of the tank to 54 km/h. + + + +The Axel series of heavy tanks are based on the popular Rommel design, but uses an internal combustion engine. + + + +Created during the Jihad, this version of the Axel uses a fusion engine to reach a top speed of 64 km/h. The weaponry has been completely replaced with Clan equipment. The weapons include an AP Gauss Rifle, Large Pulse Laser, and two LRM-15 missile launchers equipped with Artemis IV fire control systems. The tank is protected by an ECM Suite, CASE and eleven and a half tons of ferro-fibrous armor. + + + +The tank was produced by engineers working for the Free Rasalhague Republic. Despite the lighter armor and lower top speed, the Axel family was widely used by the Free Rasalhague Republic. + + + +Benson and Bjorn + + + +Spittal + + + +Rec Guide:ilClan #27 - Jihad + + + +65.0 + diff --git a/megamek/data/mechfiles/vehicles/3058Uu/Axel Heavy Tank IIC (XL).blk b/megamek/data/mechfiles/vehicles/3058Uu/Axel Heavy Tank IIC (XL).blk index 66b7862abad..50fbfd12456 100644 --- a/megamek/data/mechfiles/vehicles/3058Uu/Axel Heavy Tank IIC (XL).blk +++ b/megamek/data/mechfiles/vehicles/3058Uu/Axel Heavy Tank IIC (XL).blk @@ -29,7 +29,7 @@ Axel Heavy Tank IIC -Clan Level 3 +Clan Level 2 @@ -101,3 +101,35 @@ Jihad 65.0 + + +To make room for the engine, the tank is only protected by ten and a half tons of armor. The internal combustion engine also reduces the top speed of the tank to 54 km/h. + + + +The Axel series of heavy tanks are based on the popular Rommel design, but uses an internal combustion engine. + + + +Also introduced during the Jihad, this version of the Axel uses an XL fusion engine to reach a top speed of 84 km/h. Like the standard Axel IIC, the tank is protected by an ECM Suite, CASE and eleven and a half tons of ferro-fibrous armor. The weapons include an AP Gauss Rifle, ER Large Laser, and two LRM-15 missile launchers equipped with Artemis IV fire control systems. It also carries an advanced Targeting Computer. + + + +The tank was produced by engineers working for the Free Rasalhague Republic. Despite the lighter armor and lower top speed, the Axel family was widely used by the Free Rasalhague Republic. + + + +Benson and Bjorn + + + +Spittal + + + +Rec Guide:ilClan #27 - Jihad + + + +65.0 + diff --git a/megamek/data/mechfiles/vehicles/3058Uu/Condor Heavy Hover Tank (Laser).blk b/megamek/data/mechfiles/vehicles/3058Uu/Condor Heavy Hover Tank (Laser).blk deleted file mode 100644 index 35f613284e2..00000000000 --- a/megamek/data/mechfiles/vehicles/3058Uu/Condor Heavy Hover Tank (Laser).blk +++ /dev/null @@ -1,68 +0,0 @@ -#building block data file - -1 - -#Write the version number just in case... - -MAM0 - - -Tank - - -Condor Heavy Hover Tank - - -(Laser) - - - -681 - - -50 - - -8 - - -36 -24 -24 -16 -20 - - -ISERMediumLaser -ISERMediumLaser -ISERMediumLaser -ISERMediumLaser -ISSRM2 -ISSRM2 -ISSRM2 - - -ISSRM2 Ammo -ISSRM2 Ammo - - -IS Level 2 - - -3061 - - -0 - - -0 - - -0 - - -Hover - - -Clan Invasion - diff --git a/megamek/data/mechfiles/vehicles/3058Uu/Galleon Light Tank GAL-100.blk b/megamek/data/mechfiles/vehicles/3058Uu/Galleon Light Tank GAL-100.blk index db3209af5ae..111c50712d0 100644 --- a/megamek/data/mechfiles/vehicles/3058Uu/Galleon Light Tank GAL-100.blk +++ b/megamek/data/mechfiles/vehicles/3058Uu/Galleon Light Tank GAL-100.blk @@ -2,16 +2,20 @@ 1 -#Write the version number just in case... + +##Write the version number just in case... MAM0 + Tank + Galleon Light Tank + GAL-100 @@ -19,46 +23,103 @@ GAL-100 1175 - -30 - + + +2692 + + + +2692 + + + +IS Level 1 + + + +Tracked + + + + + 6 - + + +1 + + + 11 10 10 11 14 - - -ISMediumLaser - + + + + + + + + -ISSmallLaser +Small Laser + -ISSmallLaser +Small Laser - -IS Level 1 - - -2692 - - -0 - - -0 - - -1 - - -Tracked - + + + + + +Medium Laser + + + +With a top speed faster than most 'Mechs, the Galleon was well-armed but lacked protection, carrying only three and a half tons of armor. + + + +A light combat vehicle that first saw production in 2692] the Galleon proved to be an economical means of supporting infantry and BattleMechs. + + + +The Galleon is armed with a single Jackson Model 17 medium laser and a pair of Model 12 Small Lasers. These weapons provide decent firepower for its weight class, enabling the Galleon to worry contemporary 'Mechs of the same tonnage as itself. + + + +Despite this, the vehicle served well during the Amaris Civil War, and after the Exodus, these tracked vehicles mostly fell into the possession of the Draconis Combine and the Free Worlds League. The Galleon is often paired with the Harasser Missile Platform. + + + +Amity,Andurien,Holt,Indicass,Irian,Kendall + + + +Brooks Incorporated,Brooks Incorporated,Brooks Incorporated,Ceres Metals Industries,Brooks Incorporated,Brooks Incorporated + + + +ENGINE:GTEM 180 +ARMOR:3/StarSlab 6 +COMMUNICATIONS:Maxell 500 +TARGETING:Maxell TA50 + + -Succession Wars +TRO3058U - Succession Wars + + +30.0 + + + +PETROCHEMICALS + + diff --git a/megamek/data/mechfiles/vehicles/3058Uu/Galleon Light Tank GAL-102.blk b/megamek/data/mechfiles/vehicles/3058Uu/Galleon Light Tank GAL-102.blk index 9947373b574..5a005f33e61 100644 --- a/megamek/data/mechfiles/vehicles/3058Uu/Galleon Light Tank GAL-102.blk +++ b/megamek/data/mechfiles/vehicles/3058Uu/Galleon Light Tank GAL-102.blk @@ -62,6 +62,38 @@ IS Level 2 Tracked + + +With a top speed faster than most 'Mechs, the Galleon was well-armed but lacked protection, carrying only three and a half tons of armor. + + + +A light combat vehicle that first saw production in 2692 the Galleon proved to be an economical means of supporting infantry and BattleMechs. + + + +This 3048 upgrade uses a fusion engine to increase the Galleon's top speed to 119 km/h. The medium laser is upgraded to a Priestly 600p Medium Pulse Laser, while the small Model 12s are upgraded to Hellion-V medium lasers. Jolassa 328 ferro-fibrous armor improved the protection for this tank, while a Beagle Active Probe enables the Galleon to find hidden units, its also equipped with a Maxell 500 comsys. Production of this model first began in 3048. + + + +Despite this, the vehicle served well during the Amaris Civil War, and after the Exodus, these tracked vehicles mostly fell into the possession of the Draconis Combine and the Free Worlds League. The Galleon is often paired with the Harasser Missile Platform. + + + +Irian,Kendall + + + +Brooks Incorporated,Brooks Incorporated + + + +ENGINE:GTEM 200 Fusion +ARMOR:Jolassa 328 Ferro-Fibrous +COMMUNICATIONS:Maxell 500 +TARGETING:Maxell TA50 with Beagle active Probe + + -Succession Wars - +TRO3058U - Succession Wars + \ No newline at end of file diff --git a/megamek/data/mechfiles/vehicles/3058Uu/Galleon Light Tank GAL-103.blk b/megamek/data/mechfiles/vehicles/3058Uu/Galleon Light Tank GAL-103.blk index f003a78a065..75444289044 100644 --- a/megamek/data/mechfiles/vehicles/3058Uu/Galleon Light Tank GAL-103.blk +++ b/megamek/data/mechfiles/vehicles/3058Uu/Galleon Light Tank GAL-103.blk @@ -64,6 +64,38 @@ IS Level 2 Tracked + + +With a top speed faster than most 'Mechs, the Galleon was well-armed but lacked protection, carrying only three and a half tons of armor. + + + +A light combat vehicle that first saw production in 2692 the Galleon proved to be an economical means of supporting infantry and BattleMechs. + + + +The first of two variants that Vicore Industries produced starting in 3066, the 103 uses an XL engine for power. The tonnage saved goes to a C3i Computer and Guardian ECM Suite. The pulse laser of the 102 is upgraded to an ER medium laser, while the remaining tonnage goes towards more armor. + + + +Despite this, the vehicle served well during the Amaris Civil War, and after the Exodus, these tracked vehicles mostly fell into the possession of the Draconis Combine and the Free Worlds League. The Galleon is often paired with the Harasser Missile Platform. + + + +Terra + + + +Vicore Armorworks LTD + + + +ENGINE:GTEM 210 XL +ARMOR:Jolassa 328 Ferro-Fibrous +COMMUNICATIONS:Maxell 500 with ECM +TARGETING:Maxell TA50 + + -Civil War - +TRO3058U - Succession Wars + \ No newline at end of file diff --git a/megamek/data/mechfiles/vehicles/3058Uu/Galleon Light Tank GAL-104.blk b/megamek/data/mechfiles/vehicles/3058Uu/Galleon Light Tank GAL-104.blk index 5833cc80027..9ec4e9dd9af 100644 --- a/megamek/data/mechfiles/vehicles/3058Uu/Galleon Light Tank GAL-104.blk +++ b/megamek/data/mechfiles/vehicles/3058Uu/Galleon Light Tank GAL-104.blk @@ -57,6 +57,38 @@ IS Level 2 Tracked + + +With a top speed faster than most 'Mechs, the Galleon was well-armed but lacked protection, carrying only three and a half tons of armor. + + + +A light combat vehicle that first saw production in 2692 the Galleon proved to be an economical means of supporting infantry and BattleMechs. + + + +The second of two variants that Vicore Industries produced starting in 3066, the 104 uses an XL engine for power. This 3066 variant transforms the Galleon into a fire support tank by removing the weapons and electronics (except for a C3i Computer) to mount an ER Large Laser linked to a Targeting Computer. + + + +Despite this, the vehicle served well during the Amaris Civil War, and after the Exodus, these tracked vehicles mostly fell into the possession of the Draconis Combine and the Free Worlds League. The Galleon is often paired with the Harasser Missile Platform. + + + +Terra + + + +Vicore Armorworks LTD + + + +ENGINE:GTEM 210 XL +ARMOR:Jolassa 328 Ferro-Fibrous +COMMUNICATIONS:Maxell 500 with ECM +TARGETING:Maxell TA50 + + -Civil War +TRO3058U - Succession Wars diff --git a/megamek/data/mechfiles/vehicles/3058Uu/Galleon Light Tank GAL-200.blk b/megamek/data/mechfiles/vehicles/3058Uu/Galleon Light Tank GAL-200.blk index b9f849d6e5b..0211a421ed1 100644 --- a/megamek/data/mechfiles/vehicles/3058Uu/Galleon Light Tank GAL-200.blk +++ b/megamek/data/mechfiles/vehicles/3058Uu/Galleon Light Tank GAL-200.blk @@ -63,5 +63,44 @@ IS Level 1 Tracked -OP Klondyke +OP Klondyke - Late Succession War + + +With a top speed faster than most 'Mechs, the Galleon was well-armed but lacked protection, carrying only three and a half tons of armor. + + + +A light combat vehicle that first saw production in 2692] the Galleon proved to be an economical means of supporting infantry and BattleMechs. + + + +The -200 replaces the Small Lasers with Machine Guns. This 2915 version is utilized by House Kurita, though some have been captured by the Lyran Commonwealth. + + + +Despite this, the vehicle served well during the Amaris Civil War, and after the Exodus, these tracked vehicles mostly fell into the possession of the Draconis Combine and the Free Worlds League. The Galleon is often paired with the Harasser Missile Platform. + + + +Irian + + + +Brooks Incorporated + + + +ENGINE:GTEM 180 +ARMOR:3/StarSlab 6 +COMMUNICATIONS:Maxell 500 +TARGETING:Maxell TA50 + + + +30.0 + + + +PETROCHEMICALS + \ No newline at end of file diff --git a/megamek/data/mechfiles/vehicles/3058Uu/Maxim (I) Heavy Hover Transport (Company Command).blk b/megamek/data/mechfiles/vehicles/3058Uu/Maxim (I) Heavy Hover Transport (Company Command).blk index cb3eafb07a0..b0b56813d49 100644 --- a/megamek/data/mechfiles/vehicles/3058Uu/Maxim (I) Heavy Hover Transport (Company Command).blk +++ b/megamek/data/mechfiles/vehicles/3058Uu/Maxim (I) Heavy Hover Transport (Company Command).blk @@ -63,5 +63,38 @@ IS Level 2 Hover -Jihad +TRO 3058 - Jihad + + +The Maxim transport fulfilled an infantryman's dream. Its single infantry bay is configured to carry an entire foot platoon with enough space for them to check their weapons and move around comfortably. +The seats are all padded and face the centre of the vehicle, allowing infantry to communicate with one another and boost morale. Unlike other craft, the crew of the Maxim can deflate the rear portion of the hover skirt when disembarking or mounting up. In a combat situation, the Maxim also performs admirably. With its short- and long-range missiles, the hovertank can provide cover fire in any direction for a debarking infantry platoon. + + + +While many infantry transports have been popular, none have reached the iconic status of the Maxim. + + + +Based on the Infantry Variant this Maxim variant has twin C3 master computers and a Guardian ECM suite. The armor and weaponry remain identical to the Infantry variant. + + + +Nobody anticipated how quickly the Maxim would become a success after it was designed and manufactured by Maxim Transport Industries, a start-up company on Al Na'ir led by a retired infantry general. The Maxim has spread to every corner of the Inner Sphere and is now considered the standard for troop transports. Many units rejoiced at the prospect of being able to transport their infantry platoons in a single vehicle rather than three or four separate vehicles. The company thrived and later opened plants on Skye and Sian, with plans to open plants on Atreus and Kathil once several more vehicles could be produced. While the Maxim was a huge success, many of MTI's other forays into the military market were abysmal failures, and the company barely survived. During the beginning of 3037, a massive scandal erupted throughout the company, effectively ending it. Accusations of inappropriate behaviour among coworkers, embezzlement, and rumours of bizarre hazing rituals led to the company's demise and dissolution. Sensing an opportunity, prominent corporations purchased nearby Maxim facilities at low rates, and in the case of the Sian facility, with armed force. + + + +Field Refit + + + +Various + + + +CHASSIS:Unknown +ENGINE:Unknown Fusion +ARMOR:ProtecTech 6 +COMMUNICATIONS:Scarborough Talky 2 with ECM +TARGETING:Scarborough Tracky 1 with TAG + diff --git a/megamek/data/mechfiles/vehicles/3058Uu/Maxim (I) Heavy Hover Transport.blk b/megamek/data/mechfiles/vehicles/3058Uu/Maxim (I) Heavy Hover Transport.blk index 7c14698faea..26c0a571a40 100644 --- a/megamek/data/mechfiles/vehicles/3058Uu/Maxim (I) Heavy Hover Transport.blk +++ b/megamek/data/mechfiles/vehicles/3058Uu/Maxim (I) Heavy Hover Transport.blk @@ -63,5 +63,38 @@ IS Level 2 Hover -Clan Invasion +TRO 3058 - Clan Invasion + + +The Maxim transport fulfilled an infantryman's dream. Its single infantry bay is configured to carry an entire foot platoon with enough space for them to check their weapons and move around comfortably. +The seats are all padded and face the centre of the vehicle, allowing infantry to communicate with one another and boost morale. Unlike other craft, the crew of the Maxim can deflate the rear portion of the hover skirt when disembarking or mounting up. In a combat situation, the Maxim also performs admirably. With its short- and long-range missiles, the hovertank can provide cover fire in any direction for a debarking infantry platoon. + + + +While many infantry transports have been popular, none have reached the iconic status of the Maxim. + + + +Sacrificing firepower for carrying capacity, this Maxim can transport up to 12 tons of infantry. In exchange, its weapons are limited to a Streak SRM-6, 2 ER Medium Lasers, and a TAG, all mounted in its turret. + + + +Nobody anticipated how quickly the Maxim would become a success after it was designed and manufactured by Maxim Transport Industries, a start-up company on Al Na'ir led by a retired infantry general. The Maxim has spread to every corner of the Inner Sphere and is now considered the standard for troop transports. Many units rejoiced at the prospect of being able to transport their infantry platoons in a single vehicle rather than three or four separate vehicles. The company thrived and later opened plants on Skye and Sian, with plans to open plants on Atreus and Kathil once several more vehicles could be produced. While the Maxim was a huge success, many of MTI's other forays into the military market were abysmal failures, and the company barely survived. During the beginning of 3037, a massive scandal erupted throughout the company, effectively ending it. Accusations of inappropriate behaviour among coworkers, embezzlement, and rumours of bizarre hazing rituals led to the company's demise and dissolution. Sensing an opportunity, prominent corporations purchased nearby Maxim facilities at low rates, and in the case of the Sian facility, with armed force. + + + +Scarborough Manufacturers + + + +Al Na'ir + + + +CHASSIS:Unknown +ENGINE:Unknown Fusion +ARMOR:ProtecTech 6 +COMMUNICATIONS:Scarborough Talky 2 +TARGETING:Scarborough Tracky 1 with TAG + diff --git a/megamek/data/mechfiles/vehicles/3058Uu/Maxim Heavy Hover Transport (3052 Upgrade).blk b/megamek/data/mechfiles/vehicles/3058Uu/Maxim Heavy Hover Transport (3052 Upgrade).blk index fb118ecc405..2ef21a8ad1c 100644 --- a/megamek/data/mechfiles/vehicles/3058Uu/Maxim Heavy Hover Transport (3052 Upgrade).blk +++ b/megamek/data/mechfiles/vehicles/3058Uu/Maxim Heavy Hover Transport (3052 Upgrade).blk @@ -76,5 +76,38 @@ IS Level 2 Hover -Clan Invasion +TRO 3058 - Clan Invasion + + +The Maxim transport fulfilled an infantryman's dream. Its single infantry bay is configured to carry an entire foot platoon with enough space for them to check their weapons and move around comfortably. +The seats are all padded and face the centre of the vehicle, allowing infantry to communicate with one another and boost morale. Unlike other craft, the crew of the Maxim can deflate the rear portion of the hover skirt when disembarking or mounting up. In a combat situation, the Maxim also performs admirably. With its short- and long-range missiles, the hovertank can provide cover fire in any direction for a debarking infantry platoon. + + + +While many infantry transports have been popular, none have reached the iconic status of the Maxim. + + + +A significant upgrade to the original, this updated version of the Maxim drops the rear facing LRM-5 and a machine gun, in order to replace the Sureshot II SRM-2s with a pair of Guided Technologies Streak SRM-2s and add a TAG unit. Additionally, the armor is replaced with ProTech 6 ferro-fibrous for increased protection. + + + +Nobody anticipated how quickly the Maxim would become a success after it was designed and manufactured by Maxim Transport Industries, a start-up company on Al Na'ir led by a retired infantry general. The Maxim has spread to every corner of the Inner Sphere and is now considered the standard for troop transports. Many units rejoiced at the prospect of being able to transport their infantry platoons in a single vehicle rather than three or four separate vehicles. The company thrived and later opened plants on Skye and Sian, with plans to open plants on Atreus and Kathil once several more vehicles could be produced. While the Maxim was a huge success, many of MTI's other forays into the military market were abysmal failures, and the company barely survived. During the beginning of 3037, a massive scandal erupted throughout the company, effectively ending it. Accusations of inappropriate behaviour among coworkers, embezzlement, and rumours of bizarre hazing rituals led to the company's demise and dissolution. Sensing an opportunity, prominent corporations purchased nearby Maxim facilities at low rates, and in the case of the Sian facility, with armed force. + + + +Scarborough Manufacturers + + + +Al Na'ir + + + +CHASSIS:Unknown +ENGINE:PowerTech 165 Highlift ICE +ARMOR:ProtecTech 6 +COMMUNICATIONS:Scarborough Talky 2 +TARGETING:Scarborough Tracky 1 with TAG + \ No newline at end of file diff --git a/megamek/data/mechfiles/vehicles/3058Uu/Maxim Heavy Hover Transport (Anti-Personnel).blk b/megamek/data/mechfiles/vehicles/3058Uu/Maxim Heavy Hover Transport (Anti-Personnel).blk index b5647d8c2a7..51bb96fc428 100644 --- a/megamek/data/mechfiles/vehicles/3058Uu/Maxim Heavy Hover Transport (Anti-Personnel).blk +++ b/megamek/data/mechfiles/vehicles/3058Uu/Maxim Heavy Hover Transport (Anti-Personnel).blk @@ -79,5 +79,38 @@ IS Level 2 Hover -Clan Invasion +TRO 3058 - Clan Invasion + + +The Maxim transport fulfilled an infantryman's dream. Its single infantry bay is configured to carry an entire foot platoon with enough space for them to check their weapons and move around comfortably. +The seats are all padded and face the centre of the vehicle, allowing infantry to communicate with one another and boost morale. Unlike other craft, the crew of the Maxim can deflate the rear portion of the hover skirt when disembarking or mounting up. In a combat situation, the Maxim also performs admirably. With its short- and long-range missiles, the hovertank can provide cover fire in any direction for a debarking infantry platoon. + + + +While many infantry transports have been popular, none have reached the iconic status of the Maxim. + + + +Designed to deal with heavy concentrations of infantry, this Maxim variant replaces the Streak SRM-2s for additional machine guns. + + + +Nobody anticipated how quickly the Maxim would become a success after it was designed and manufactured by Maxim Transport Industries, a start-up company on Al Na'ir led by a retired infantry general. The Maxim has spread to every corner of the Inner Sphere and is now considered the standard for troop transports. Many units rejoiced at the prospect of being able to transport their infantry platoons in a single vehicle rather than three or four separate vehicles. The company thrived and later opened plants on Skye and Sian, with plans to open plants on Atreus and Kathil once several more vehicles could be produced. While the Maxim was a huge success, many of MTI's other forays into the military market were abysmal failures, and the company barely survived. During the beginning of 3037, a massive scandal erupted throughout the company, effectively ending it. Accusations of inappropriate behaviour among coworkers, embezzlement, and rumours of bizarre hazing rituals led to the company's demise and dissolution. Sensing an opportunity, prominent corporations purchased nearby Maxim facilities at low rates, and in the case of the Sian facility, with armed force. + + + +Scarborough Manufacturers + + + +Al Na'ir + + + +CHASSIS:Unknown +ENGINE:PowerTech 165 Highlift ICE +ARMOR:ProtecTech 6 +COMMUNICATIONS:Scarborough Talky 2 +TARGETING:Scarborough Tracky 1 with TAG + diff --git a/megamek/data/mechfiles/vehicles/3058Uu/Maxim Heavy Hover Transport (BA Factory Upgrade).blk b/megamek/data/mechfiles/vehicles/3058Uu/Maxim Heavy Hover Transport (BA Factory Upgrade).blk index 67b9e5efaa0..145be57dc09 100644 --- a/megamek/data/mechfiles/vehicles/3058Uu/Maxim Heavy Hover Transport (BA Factory Upgrade).blk +++ b/megamek/data/mechfiles/vehicles/3058Uu/Maxim Heavy Hover Transport (BA Factory Upgrade).blk @@ -75,5 +75,38 @@ IS Level 2 Hover -Clan Invasion +TRO 3058 - Clan Invasion + + +The Maxim transport fulfilled an infantryman's dream. Its single infantry bay is configured to carry an entire foot platoon with enough space for them to check their weapons and move around comfortably. +The seats are all padded and face the centre of the vehicle, allowing infantry to communicate with one another and boost morale. Unlike other craft, the crew of the Maxim can deflate the rear portion of the hover skirt when disembarking or mounting up. In a combat situation, the Maxim also performs admirably. With its short- and long-range missiles, the hovertank can provide cover fire in any direction for a debarking infantry platoon. + + + +While many infantry transports have been popular, none have reached the iconic status of the Maxim. + + + +Designed by engineers at the manufacturing plants, this Maxim variant can carry a squad of battle armor-equipped infantry into combat. To compensate for the larger infantry bay the designers had to remove the TAG system. + + + +Nobody anticipated how quickly the Maxim would become a success after it was designed and manufactured by Maxim Transport Industries, a start-up company on Al Na'ir led by a retired infantry general. The Maxim has spread to every corner of the Inner Sphere and is now considered the standard for troop transports. Many units rejoiced at the prospect of being able to transport their infantry platoons in a single vehicle rather than three or four separate vehicles. The company thrived and later opened plants on Skye and Sian, with plans to open plants on Atreus and Kathil once several more vehicles could be produced. While the Maxim was a huge success, many of MTI's other forays into the military market were abysmal failures, and the company barely survived. During the beginning of 3037, a massive scandal erupted throughout the company, effectively ending it. Accusations of inappropriate behaviour among coworkers, embezzlement, and rumours of bizarre hazing rituals led to the company's demise and dissolution. Sensing an opportunity, prominent corporations purchased nearby Maxim facilities at low rates, and in the case of the Sian facility, with armed force. + + + +Scarborough Manufacturers + + + +Al Na'ir + + + +CHASSIS:Unknown +ENGINE:PowerTech 165 Highlift ICE +ARMOR:ProtecTech 6 +COMMUNICATIONS:Scarborough Talky 2 +TARGETING:Scarborough Tracky 1 + diff --git a/megamek/data/mechfiles/vehicles/3058Uu/Maxim Heavy Hover Transport (BA Field Upgrade).blk b/megamek/data/mechfiles/vehicles/3058Uu/Maxim Heavy Hover Transport (BA Field Upgrade).blk index 7e48c72b091..d47a080e4b2 100644 --- a/megamek/data/mechfiles/vehicles/3058Uu/Maxim Heavy Hover Transport (BA Field Upgrade).blk +++ b/megamek/data/mechfiles/vehicles/3058Uu/Maxim Heavy Hover Transport (BA Field Upgrade).blk @@ -73,5 +73,38 @@ IS Level 2 Hover -Clan Invasion +TRO 3058 - Clan Invasion + + +The Maxim transport fulfilled an infantryman's dream. Its single infantry bay is configured to carry an entire foot platoon with enough space for them to check their weapons and move around comfortably. +The seats are all padded and face the centre of the vehicle, allowing infantry to communicate with one another and boost morale. Unlike other craft, the crew of the Maxim can deflate the rear portion of the hover skirt when disembarking or mounting up. In a combat situation, the Maxim also performs admirably. With its short- and long-range missiles, the hovertank can provide cover fire in any direction for a debarking infantry platoon. + + + +While many infantry transports have been popular, none have reached the iconic status of the Maxim. + + + +Designed by troops in the field this Maxim variant also transports a squad of battle armored infantry. Unlike the factory version, this version removes the machine guns and ammunition to make room for the infantry bay. It also carries more armor. + + + +Nobody anticipated how quickly the Maxim would become a success after it was designed and manufactured by Maxim Transport Industries, a start-up company on Al Na'ir led by a retired infantry general. The Maxim has spread to every corner of the Inner Sphere and is now considered the standard for troop transports. Many units rejoiced at the prospect of being able to transport their infantry platoons in a single vehicle rather than three or four separate vehicles. The company thrived and later opened plants on Skye and Sian, with plans to open plants on Atreus and Kathil once several more vehicles could be produced. While the Maxim was a huge success, many of MTI's other forays into the military market were abysmal failures, and the company barely survived. During the beginning of 3037, a massive scandal erupted throughout the company, effectively ending it. Accusations of inappropriate behaviour among coworkers, embezzlement, and rumours of bizarre hazing rituals led to the company's demise and dissolution. Sensing an opportunity, prominent corporations purchased nearby Maxim facilities at low rates, and in the case of the Sian facility, with armed force. + + + +Field Refit + + + +Various + + + +CHASSIS:Unknown +ENGINE:PowerTech 165 Highlift ICE +ARMOR:ProtecTech 6 +COMMUNICATIONS:Scarborough Talky 2 +TARGETING:Scarborough Tracky 1 with TAG + diff --git a/megamek/data/mechfiles/vehicles/3058Uu/Maxim Heavy Hover Transport (C3M).blk b/megamek/data/mechfiles/vehicles/3058Uu/Maxim Heavy Hover Transport (C3M).blk index b1be46c6154..0f6e58eab49 100644 --- a/megamek/data/mechfiles/vehicles/3058Uu/Maxim Heavy Hover Transport (C3M).blk +++ b/megamek/data/mechfiles/vehicles/3058Uu/Maxim Heavy Hover Transport (C3M).blk @@ -70,5 +70,39 @@ IS Level 2 Hover -Jihad +TRO 3058 - Jihad + + +The Maxim transport fulfilled an infantryman's dream. Its single infantry bay is configured to carry an entire foot platoon with enough space for them to check their weapons and move around comfortably. +The seats are all padded and face the centre of the vehicle, allowing infantry to communicate with one another and boost morale. Unlike other craft, the crew of the Maxim can deflate the rear portion of the hover skirt when disembarking or mounting up. In a combat situation, the Maxim also performs admirably. With its short- and long-range missiles, the hovertank can provide cover fire in any direction for a debarking infantry platoon. + + + +While many infantry transports have been popular, none have reached the iconic status of the Maxim. + + + +This version trades the ability to carry infantry for a C3 master computer. As the C3 Master can function as a TAG system, the turret-mounted TAG is also removed. To provide additional protection, the machine guns and ammunition of the standard Maxim are replaced by armor. + + + +Nobody anticipated how quickly the Maxim would become a success after it was designed and manufactured by Maxim Transport Industries, a start-up company on Al Na'ir led by a retired infantry general. The Maxim has spread to every corner of the Inner Sphere and is now considered the standard for troop transports. Many units rejoiced at the prospect of being able to transport their infantry platoons in a single vehicle rather than three or four separate vehicles. The company thrived and later opened plants on Skye and Sian, with plans to open plants on Atreus and Kathil once several more vehicles could be produced. While the Maxim was a huge success, many of MTI's other forays into the military market were abysmal failures, and the company barely survived. During the beginning of 3037, a massive scandal erupted throughout the company, effectively ending it. Accusations of inappropriate behaviour among coworkers, embezzlement, and rumours of bizarre hazing rituals led to the company's demise and dissolution. Sensing an opportunity, prominent corporations purchased nearby Maxim facilities at low rates, and in the case of the Sian facility, with armed force. + + + +Field Refit + + + +Various + + + +CHASSIS:Unknown +ENGINE:PowerTech 165 Highlift ICE +ARMOR:ProtecTech 6 +COMMUNICATIONS:Scarborough Talky 2 +TARGETING:Scarborough Tracky 1 with TAG + + diff --git a/megamek/data/mechfiles/vehicles/3058Uu/Maxim Heavy Hover Transport (C3S).blk b/megamek/data/mechfiles/vehicles/3058Uu/Maxim Heavy Hover Transport (C3S).blk index cbde376708a..0843cb184f4 100644 --- a/megamek/data/mechfiles/vehicles/3058Uu/Maxim Heavy Hover Transport (C3S).blk +++ b/megamek/data/mechfiles/vehicles/3058Uu/Maxim Heavy Hover Transport (C3S).blk @@ -74,5 +74,38 @@ IS Level 2 Hover -Jihad +TRO 3058 - Jihad + + +The Maxim transport fulfilled an infantryman's dream. Its single infantry bay is configured to carry an entire foot platoon with enough space for them to check their weapons and move around comfortably. +The seats are all padded and face the centre of the vehicle, allowing infantry to communicate with one another and boost morale. Unlike other craft, the crew of the Maxim can deflate the rear portion of the hover skirt when disembarking or mounting up. In a combat situation, the Maxim also performs admirably. With its short- and long-range missiles, the hovertank can provide cover fire in any direction for a debarking infantry platoon. + + + +While many infantry transports have been popular, none have reached the iconic status of the Maxim. + + + +This version is used in conjunction with the Maxim C3 Master. Removing the machine guns and ammunition, it expands the infantry bay to four tons, allowing it to carry a squad of battle armor. It also carries a C3 slave and keeps the TAG system. + + + +Nobody anticipated how quickly the Maxim would become a success after it was designed and manufactured by Maxim Transport Industries, a start-up company on Al Na'ir led by a retired infantry general. The Maxim has spread to every corner of the Inner Sphere and is now considered the standard for troop transports. Many units rejoiced at the prospect of being able to transport their infantry platoons in a single vehicle rather than three or four separate vehicles. The company thrived and later opened plants on Skye and Sian, with plans to open plants on Atreus and Kathil once several more vehicles could be produced. While the Maxim was a huge success, many of MTI's other forays into the military market were abysmal failures, and the company barely survived. During the beginning of 3037, a massive scandal erupted throughout the company, effectively ending it. Accusations of inappropriate behaviour among coworkers, embezzlement, and rumours of bizarre hazing rituals led to the company's demise and dissolution. Sensing an opportunity, prominent corporations purchased nearby Maxim facilities at low rates, and in the case of the Sian facility, with armed force. + + + +Field Refit + + + +Various + + + +CHASSIS:Unknown +ENGINE:PowerTech 165 Highlift ICE +ARMOR:ProtecTech 6 +COMMUNICATIONS:Scarborough Talky 2 +TARGETING:Scarborough Tracky 1 with TAG + diff --git a/megamek/data/mechfiles/vehicles/3058Uu/Maxim Heavy Hover Transport (Clan).blk b/megamek/data/mechfiles/vehicles/3058Uu/Maxim Heavy Hover Transport (Clan).blk index 4175c9e9563..034dbaccb2c 100644 --- a/megamek/data/mechfiles/vehicles/3058Uu/Maxim Heavy Hover Transport (Clan).blk +++ b/megamek/data/mechfiles/vehicles/3058Uu/Maxim Heavy Hover Transport (Clan).blk @@ -3,7 +3,7 @@ 1 -# Write the version number just in case... +##Write the version number just in case... MAM0 @@ -28,8 +28,12 @@ Maxim Heavy Hover Transport 3059 + +3059 + + -Clan Level 3 +Clan Level 2 @@ -48,6 +52,10 @@ troopspace:6.0 1 + +false + + 1 @@ -102,3 +110,44 @@ Clan Invasion 50.0 + + +PETROCHEMICALS + + + +TRO 3058 - Clan Invasion + + + +The Maxim transport fulfilled an infantryman's dream. Its single infantry bay is configured to carry an entire foot platoon with enough space for them to check their weapons and move around comfortably. +The seats are all padded and face the centre of the vehicle, allowing infantry to communicate with one another and boost morale. Unlike other craft, the crew of the Maxim can deflate the rear portion of the hover skirt when disembarking or mounting up. In a combat situation, the Maxim also performs admirably. With its short- and long-range missiles, the hovertank can provide cover fire in any direction for a debarking infantry platoon. + + + +While many infantry transports have been popular, none have reached the iconic status of the Maxim. + + + +Retrofitted with Clan technology, the Maxim-C utilities a lighter missile systems to free up weight for a larger array of weapons and a 6 ton infantry bay. A front-mounted LRM-15 provides adequate long range firepower, while side-mounted SRM-2s, and a turret-mounted Streak SRM-6 partnered with twin machine guns provides close range support. While it does not utilize the ferro-fibrous armor seen in updated IS versions of the Maxim, its seven tons of standard armor provides similar levels of protection, augmented by the use of an ECM Suite and CASE. + + + +Nobody anticipated how quickly the Maxim would become a success after it was designed and manufactured by Maxim Transport Industries, a start-up company on Al Na'ir led by a retired infantry general. The Maxim has spread to every corner of the Inner Sphere and is now considered the standard for troop transports. Many units rejoiced at the prospect of being able to transport their infantry platoons in a single vehicle rather than three or four separate vehicles. The company thrived and later opened plants on Skye and Sian, with plans to open plants on Atreus and Kathil once several more vehicles could be produced. While the Maxim was a huge success, many of MTI's other forays into the military market were abysmal failures, and the company barely survived. During the beginning of 3037, a massive scandal erupted throughout the company, effectively ending it. Accusations of inappropriate behaviour among coworkers, embezzlement, and rumours of bizarre hazing rituals led to the company's demise and dissolution. Sensing an opportunity, prominent corporations purchased nearby Maxim facilities at low rates, and in the case of the Sian facility, with armed force. + + + +WC Site 4 + + + +Arc-Royal + + + +CHASSIS:Unknown +ENGINE:PowerTech 165 Highlift ICE +ARMOR:ProtecTech 6 +COMMUNICATIONS:Scarborough Talky 2 +TARGETING:Scarborough Tracky 1 with TAG + \ No newline at end of file diff --git a/megamek/data/mechfiles/vehicles/3058Uu/Maxim Heavy Hover Transport (Fire Support).blk b/megamek/data/mechfiles/vehicles/3058Uu/Maxim Heavy Hover Transport (Fire Support).blk index 3fff6b17aa2..1188884ba78 100644 --- a/megamek/data/mechfiles/vehicles/3058Uu/Maxim Heavy Hover Transport (Fire Support).blk +++ b/megamek/data/mechfiles/vehicles/3058Uu/Maxim Heavy Hover Transport (Fire Support).blk @@ -69,5 +69,38 @@ IS Level 2 Hover -Clan Invasion +TRO 3058 - Clan Invasion + + +The Maxim transport fulfilled an infantryman's dream. Its single infantry bay is configured to carry an entire foot platoon with enough space for them to check their weapons and move around comfortably. +The seats are all padded and face the centre of the vehicle, allowing infantry to communicate with one another and boost morale. Unlike other craft, the crew of the Maxim can deflate the rear portion of the hover skirt when disembarking or mounting up. In a combat situation, the Maxim also performs admirably. With its short- and long-range missiles, the hovertank can provide cover fire in any direction for a debarking infantry platoon. + + + +While many infantry transports have been popular, none have reached the iconic status of the Maxim. + + + +Designed for LRM support, this updated version replaces the SRM-2s and TAG for a turret-mounted FarFire LRM-15. + + + +Nobody anticipated how quickly the Maxim would become a success after it was designed and manufactured by Maxim Transport Industries, a start-up company on Al Na'ir led by a retired infantry general. The Maxim has spread to every corner of the Inner Sphere and is now considered the standard for troop transports. Many units rejoiced at the prospect of being able to transport their infantry platoons in a single vehicle rather than three or four separate vehicles. The company thrived and later opened plants on Skye and Sian, with plans to open plants on Atreus and Kathil once several more vehicles could be produced. While the Maxim was a huge success, many of MTI's other forays into the military market were abysmal failures, and the company barely survived. During the beginning of 3037, a massive scandal erupted throughout the company, effectively ending it. Accusations of inappropriate behaviour among coworkers, embezzlement, and rumours of bizarre hazing rituals led to the company's demise and dissolution. Sensing an opportunity, prominent corporations purchased nearby Maxim facilities at low rates, and in the case of the Sian facility, with armed force. + + + +Scarborough Manufacturers + + + +Al Na'ir + + + +CHASSIS:Unknown +ENGINE:PowerTech 165 Highlift ICE +ARMOR:ProtecTech 6 +COMMUNICATIONS:Scarborough Talky 2 +TARGETING:Scarborough Tracky 1 + \ No newline at end of file diff --git a/megamek/data/mechfiles/vehicles/3058Uu/Patton Tank (Ultra).blk b/megamek/data/mechfiles/vehicles/3058Uu/Patton Tank (Ultra).blk index f6ac4ffc8c4..422d6078772 100644 --- a/megamek/data/mechfiles/vehicles/3058Uu/Patton Tank (Ultra).blk +++ b/megamek/data/mechfiles/vehicles/3058Uu/Patton Tank (Ultra).blk @@ -71,3 +71,42 @@ Tracked Civil War + + +The Patton mounts an AC/10, giving it twice the ammunition capacity and superior firing range while also enabling it to be fitted with more armor. The Patton is capable of fighting in short-ranged and urban environments, but is far more suited than the Rommel to engaging targets at medium to long range. + + + +The Patton tank is a 65-ton armored combat vehicle, specializing in conventional armored warfare. Identical to its twin, the Rommel, in every way but armament and armor configuration, the Patton has primarily served with the Lyran Commonwealth and the Lyran Alliance. + + + +This variant of the Patton replaces the standard weaponry with a turret-mounted Ultra AC/10 and a pair of medium lasers to support it. For anti-infantry work, the Patton Ultra has three Machine Guns: One covers the rear while the other two cover the front of the tank. + + + +Designed concurrently with the Rommel, Defiance Industries decided that a vehicle to replace 'Mechs was needed in the early 3000s. Since 'Mech production was nearly at a standstill, the ability to produce and field armored vehicles became a necessity no Successor State could ignore. + + + +Defiance Industries, General Motors + + + +Hesperus II,Salem + + + +ENGINE:Magna 260 +ARMOR:Durallex Heavy +COMMUNICATIONS:TharHes Muse 54-58K +TARGETING:TharHes Mars5 + + + +TRO 3039 - Succession Wars + + + +65.0 + \ No newline at end of file diff --git a/megamek/data/mechfiles/vehicles/3058Uu/Rommel Tank (Gauss).blk b/megamek/data/mechfiles/vehicles/3058Uu/Rommel Tank (Gauss).blk index aaa950c4199..c6459244949 100644 --- a/megamek/data/mechfiles/vehicles/3058Uu/Rommel Tank (Gauss).blk +++ b/megamek/data/mechfiles/vehicles/3058Uu/Rommel Tank (Gauss).blk @@ -69,6 +69,42 @@ IS Level 2 Tracked + + +With its default main weapon being the massive and immensely powerful but short-ranged AC/20, the Rommel is best suited to close range and urban fighting, where its heavy gun can be put to excellent use. A Rommel may lie in wait around a corner or down an alley, and then use its devastating armament to cripple or destroy a BattleMech when it comes into view. The main advantage the Rommel has over other, older designs is a combination of higher speed and more armor. With even more armor than a Demolisher tank, the Rommel can sustain more punishment, yet slip away faster to fight again from another position. + + + +The Rommel tank is a 65-ton armored combat vehicle, specializing in close range fighting and urban combat. Identical to its twin, the Patton, in every way but armament and armor configuration, the Rommel has primarily served with the Lyran Commonwealth and the Lyran Alliance. + + + +This 3054 version of the Rommel replaces the standard weaponry with a Gauss rifle, a pair of medium lasers, and a pair of Machine Guns in the turret. For additional anti-infantry capabilities, this version also mounts a pair of Machine Guns on the front of the tank and a single Machine Gun covers the rear. The only real weakness is that the design only provides a half ton of ammunition for all five Machine Guns. + + + +The Rommel was designed concurrently with the Patton in the early 3000s, when Defiance Industries decided that an armored combat vehicle capable of replacing 'Mechs was needed. Since 'Mech production was nearly at a standstill, the ability to produce and field armored vehicles became a necessity for every Successor State. + + + +Defiance Industries, General Motors + + + +Hesperus II,Salem + + + +ENGINE:Magna 260 +ARMOR:Durallex Heavy +COMMUNICATIONS:TharHes Muse 54-58K +TARGETING:TharHes Mars5 + + -Clan Invasion +TRO 3039 - Clan Invasion + + +65.0 + \ No newline at end of file diff --git a/megamek/data/mechfiles/vehicles/3075/Condor Heavy Hover Tank (Upgrade Laser).blk b/megamek/data/mechfiles/vehicles/3075/Condor Heavy Hover Tank (Upgrade Laser).blk new file mode 100644 index 00000000000..02f262e5059 --- /dev/null +++ b/megamek/data/mechfiles/vehicles/3075/Condor Heavy Hover Tank (Upgrade Laser).blk @@ -0,0 +1,133 @@ +#building block data file + + +1 + + + +Tank + + + +1 + + + +Condor Heavy Hover Tank + + + +(Upgrade) (Laser) + + + +684 + + + +3068 + + + +Jihad + + + +IS Level 2 + + + +50.0 + + + +Hover + + + +2 + + + +9 + + + +1 + + + +1 + + + +-1 + + + +31 +21 +21 +14 +20 + + + +ISAMS Ammo +IS Ammo LRM-15 +IS Ammo LRM-15 +ISGuardianECMSuite +IS Machine Gun Ammo - Half + + + +Machine Gun +Machine Gun +ISERLargeLaser + + + + + + + + + + + + +LRM 15 +ISAntiMissileSystem + + + +Although expensive to buy and to maintain, this immense hovercraft is capable of a flank speed of 129 km/h and a cruising speed of 86 km/h, making it one of the fastest vehicles in its weight class and as fast as the speediest 'Mechs and vehicles. Six tons of StarSlab/9.5 Mk II armor give the Condor considerable protection for its role, though the bulk is concentrated on the front and turret, notably weakening the sides. Unlike tracked or wheeled vehicles of the same weight, the Condor is intended to attack enemies "on the fly" at medium ranges, + + + +A heavy cavalry unit designed for rapid reaction to a shifting battle, the Condor is one of the few heavy hover tanks available. + + + +An attempt by Quikscell to reduce the Condor's dependence on ammunition based weaponry, this variant of the upgraded tank replaced the autocannon with a Cyclops extended-range large laser, with the remaining weight being used to add a turret-mounted anti-missile system, a Guardian ECM suite, and an additional ton of armor. + + + +Introduced a few short years before the formation of the original Star League, the Condor remained one of Red Devil Industries main sellers for centuries and was widely distributed across the Inner Sphere, with the militaries of the Lyran Commonwealth, Federated Suns and Capellan Confederation fielding the majority during the Succession Wars. With the loss of Red Devil's factories with the capture of Pandora by Clan Jade Falcon in 3064, the design was secured by Quikscell Company, who developed an advanced new-tech refresh of the venerable and still highly popular design, even selling the unassembled components of the tank in kit form in effort to keep up with demand. Red Devil actually builds their own under license. Originally, Defiance Industries declined to allow the company to do so, which led to Red Devil offering a bounty for used or slightly damaged lasers taken in combat to recondition and install on new Condors. When Defiance noticed that some of its flagship BattleMech designs, such as the Zeus, attracted undue fire from foes attempting to cash in on the bounty, they quickly relented. Not nearly as notable, the reliable SureFire MiniGun, mounted on the body, is intended as an anti-personnel weapon. + + + +Quikscell Company + + + +Richvale + + + +CHASSIS:Unknown +ENGINE:Core Tek 215 XL fusion engine +ARMOR:StarSlab/9.5 Ferro-Fibrous Mk II +COMMUNICATIONS:TharHes KR-A P/Comm +TARGETING:TharHes Mars 1 with TAG + \ No newline at end of file diff --git a/megamek/data/mechfiles/vehicles/3075/Condor Heavy Hover Tank (Upgrade).blk b/megamek/data/mechfiles/vehicles/3075/Condor Heavy Hover Tank (Upgrade).blk new file mode 100644 index 00000000000..f17c3d4c5c8 --- /dev/null +++ b/megamek/data/mechfiles/vehicles/3075/Condor Heavy Hover Tank (Upgrade).blk @@ -0,0 +1,136 @@ +#building block data file + + +1 + + + +Tank + + + +1 + + + +Condor Heavy Hover Tank + + + +(Upgrade) + + + +685 + + + +3066 + + + +Jihad + + + +IS Level 2 + + + +50.0 + + + +Hover + + + +2 + + + +9 + + + +1 + + + +1 + + + +-1 + + + +31 +21 +21 +14 +20 + + + +IS Ammo LRM-15 +IS Ammo LRM-15 +IS Machine Gun Ammo - Half +IS LB 5-X AC Ammo +IS LB 5-X AC Ammo + + + +Machine Gun +Machine Gun +ISLBXAC5 + + + + + + + + + + + + +LRM 15 + + + +Although expensive to buy and to maintain, this immense hovercraft is capable of a flank speed of 129 km/h and a cruising speed of 86 km/h, making it one of the fastest vehicles in its weight class and as fast as the speediest 'Mechs and vehicles. Six tons of StarSlab/9.5 Mk II armor give the Condor considerable protection for its role, though the bulk is concentrated on the front and turret, notably weakening the sides. Unlike tracked or wheeled vehicles of the same weight, the Condor is intended to attack enemies "on the fly" at medium ranges, + + + +A heavy cavalry unit designed for rapid reaction to a shifting battle, the Condor is one of the few heavy hover tanks available. + + + +Sharing only a minimal resemblance to the Red Devil model, the Condor rolling off Quikscell's Richvale production lines utilizes a wide range of advanced technology. Replacing the internal combustion engine with a more powerful Core Tek 215 XL fusion engine both greatly increases the Condor's speed while freeing up space to carry upgraded weapons array. Giving the Condor the long-range striking power required on the modern battlefield, the standard GM autocannon was replaced with an advanced Mydron Excel 5SG LB-X AC/5, boosting the ammunition carried to two tons to allow for the use of both standard and cluster munitions, while the lasers were dropped for a turret-mounted Valiant Abalest LRM 15-pack fed with two tons of reloads. Based on the experiences of the FedCom Civil War, an extra machine gun was added to the sole original. An upgrade to ten heat sinks and StarSlab/9.5 ferro-fibrous Mk II boost the Condor's staying power in battle. + + + +Introduced a few short years before the formation of the original Star League, the Condor remained one of Red Devil Industries main sellers for centuries and was widely distributed across the Inner Sphere, with the militaries of the Lyran Commonwealth, Federated Suns and Capellan Confederation fielding the majority during the Succession Wars. With the loss of Red Devil's factories with the capture of Pandora by Clan Jade Falcon in 3064, the design was secured by Quikscell Company, who developed an advanced new-tech refresh of the venerable and still highly popular design, even selling the unassembled components of the tank in kit form in effort to keep up with demand. Red Devil actually builds their own under license. Originally, Defiance Industries declined to allow the company to do so, which led to Red Devil offering a bounty for used or slightly damaged lasers taken in combat to recondition and install on new Condors. When Defiance noticed that some of its flagship BattleMech designs, such as the Zeus, attracted undue fire from foes attempting to cash in on the bounty, they quickly relented. Not nearly as notable, the reliable SureFire MiniGun, mounted on the body, is intended as an anti-personnel weapon. + + + +Quikscell Company + + + +Richvale + + + +CHASSIS:Unknown +ENGINE:Core Tek 215 XL fusion engine +ARMOR:StarSlab/9.5 Ferro-Fibrous Mk II +COMMUNICATIONS:TharHes KR-A P/Comm +TARGETING:TharHes Mars 1 with TAG + + + +Rec Guide:ilClan #26 - Late Succession War - Renaissance + \ No newline at end of file diff --git a/megamek/data/mechfiles/vehicles/3085u/ONN/Ajax Assault Tank (Sealed).blk b/megamek/data/mechfiles/vehicles/3085u/ONN/Ajax Assault Tank (Sealed).blk index 0d692a54615..a1f653efa48 100644 --- a/megamek/data/mechfiles/vehicles/3085u/ONN/Ajax Assault Tank (Sealed).blk +++ b/megamek/data/mechfiles/vehicles/3085u/ONN/Ajax Assault Tank (Sealed).blk @@ -3,7 +3,7 @@ 1 -#Write the version number just in case... +##Write the version number just in case... MAM0 @@ -24,69 +24,71 @@ Ajax Assault Tank 21 - -90 - + +3078 + + + +3078 + + + +IS Level 2 + + + +Tracked + + + + 3 -#Order is Tank/VTOL/LST - + +2 + + + 76 60 60 40 68 - - - -ISMML9 -ISERLargeLaser -ISSRT6 -ISMediumPulseLaser -ISMediumPulseLaser - + -ISMML9 LRM Ammo -ISMML9 SRM Ammo -ISSRT6 Ammo -ISSRT6 Ammo +IS Ammo MML-9 LRM +IS Ammo MML-9 SRM +IS Ammo SRTorpedo-6 +IS Ammo SRTorpedo-6 ISC3SlaveUnit ISGuardianECMSuite ISCASE Environmental Sealing - -IS Level 3 - - - -3078 - + + - -Jihad - - - -0 - + + - -0 - + + - -2 - + + - -Tracked - + +ISMML9 +ISERLargeLaser +SRT 6 +ISMediumPulseLaser +ISMediumPulseLaser + The Ajax follows on the heels of the successful Manteuffel OmniVehicle. The Ajax is slow, only capable of attaining speeds up to 54 km/h. Since speed is not its defense, the designers gave the Ajax nineteen tons of armor. The room for all of this armor comes from the XL engine the Ajax uses for power. @@ -97,7 +99,7 @@ The Ajax Assault Tank is an Omni-capable combat vehicle that is the followup to -This configuration is intended to support amphibious assaults and was introduced in 3078[13]. As such it uses Environmental Sealing to create a watertight tank. An SRT-6 with 30 salvos provides defense against submarine threats, while an MML-9 with 2 tons of ammo, ER Large Laser and two Medium Pulse Lasers provide firepower against other threats. The Guardian ECM Suite and C3 Slave from other versions is also in place. The vehicle is also equipped with an CASE system in case of an ammo explosion. +This configuration is intended to support amphibious assaults and was introduced in 3078[13]. As such it uses Environmental Sealing to create a watertight tank. An SRT-6 with 30 salvos provides defense against submarine threats, while an MML-9 with 2 tons of ammo, ER Large Laser and two Medium Pulse Lasers provide firepower against other threats. The Guardian ECM Suite and C3 Slave from other versions is also in place. The vehicle is also equipped with an CASE system in case of an ammo explosion. @@ -121,5 +123,10 @@ TARGETING:Sync Tracker (39-42071) -TRO 3085 - Jihad - \ No newline at end of file +Jihad + + + +90.0 + + diff --git a/megamek/data/mechfiles/vehicles/3085u/ONN/Rommel Tank (Sealed).blk b/megamek/data/mechfiles/vehicles/3085u/ONN/Rommel Tank (Sealed).blk index d96b1d24dd0..65d694fe725 100644 --- a/megamek/data/mechfiles/vehicles/3085u/ONN/Rommel Tank (Sealed).blk +++ b/megamek/data/mechfiles/vehicles/3085u/ONN/Rommel Tank (Sealed).blk @@ -71,6 +71,43 @@ IS Level 3 Tracked + + + +With its default main weapon being the massive and immensely powerful but short-ranged AC/20, the Rommel is best suited to close range and urban fighting, where its heavy gun can be put to excellent use. A Rommel may lie in wait around a corner or down an alley, and then use its devastating armament to cripple or destroy a BattleMech when it comes into view. The main advantage the Rommel has over other, older designs is a combination of higher speed and more armor. With even more armor than a Demolisher tank, the Rommel can sustain more punishment, yet slip away faster to fight again from another position. + + + +The Rommel tank is a 65-ton armored combat vehicle, specializing in close range fighting and urban combat. Identical to its twin, the Patton, in every way but armament and armor configuration, the Rommel has primarily served with the Lyran Commonwealth and the Lyran Alliance. + + + +This 3076 variant uses Environmental Sealing to participate in amphibious attacks. It carries Heavy Ferro-Fibrous armor and a Guardian ECM Suite to protect itself, and trades in its weaponry for a Heavy PPC and a Streak SRM-6. To defend itself in the water, it also carries a bow-mounted SRT-4 system. Two MG provide additinal protection on both sides against conventional infantry. + + + +The Rommel was designed concurrently with the Patton in the early 3000s, when Defiance Industries decided that an armored combat vehicle capable of replacing 'Mechs was needed. Since 'Mech production was nearly at a standstill, the ability to produce and field armored vehicles became a necessity for every Successor State. + + + +Defiance Industries, General Motors + + + +Hesperus II,Salem + + + +ENGINE:Magna 260 +ARMOR:Durallex Special Heavy Ferro-Fibrous +COMMUNICATIONS:TharHes Muse 54-58K with ECM +TARGETING:TharHes Mars5 + + -Jihad +TRO 3085 - Jihad + + +65.0 + \ No newline at end of file diff --git a/megamek/data/mechfiles/vehicles/3145/NTNU/Condor Heavy Hover Tank (Laser Upgrade).blk b/megamek/data/mechfiles/vehicles/3145/NTNU/Condor Heavy Hover Tank (Laser Upgrade).blk index 916aca1776d..2ac2f9d10fc 100644 --- a/megamek/data/mechfiles/vehicles/3145/NTNU/Condor Heavy Hover Tank (Laser Upgrade).blk +++ b/megamek/data/mechfiles/vehicles/3145/NTNU/Condor Heavy Hover Tank (Laser Upgrade).blk @@ -92,3 +92,39 @@ RS 3145 NT NU 50.0 + + +Although expensive to buy and to maintain, this immense hovercraft is capable of a flank speed of 129 km/h and a cruising speed of 86 km/h, making it one of the fastest vehicles in its weight class and as fast as the speediest 'Mechs and vehicles. Six tons of StarSlab/9.5 Mk II armor give the Condor considerable protection for its role, though the bulk is concentrated on the front and turret, notably weakening the sides. Unlike tracked or wheeled vehicles of the same weight, the Condor is intended to attack enemies "on the fly" at medium ranges, + + + +A heavy cavalry unit designed for rapid reaction to a shifting battle, the Condor is one of the few heavy hover tanks available. + + + +This Dark Age variant uses a Fusion engine to power three Medium Re-Engineered Lasers in its turret. It is also protected by ferro-fibrous armor. + + + +Introduced a few short years before the formation of the original Star League, the Condor remained one of Red Devil Industries main sellers for centuries and was widely distributed across the Inner Sphere, with the militaries of the Lyran Commonwealth, Federated Suns and Capellan Confederation fielding the majority during the Succession Wars. With the loss of Red Devil's factories with the capture of Pandora by Clan Jade Falcon in 3064, the design was secured by Quikscell Company, who developed an advanced new-tech refresh of the venerable and still highly popular design, even selling the unassembled components of the tank in kit form in effort to keep up with demand. Red Devil actually builds their own under license. Originally, Defiance Industries declined to allow the company to do so, which led to Red Devil offering a bounty for used or slightly damaged lasers taken in combat to recondition and install on new Condors. When Defiance noticed that some of its flagship BattleMech designs, such as the Zeus, attracted undue fire from foes attempting to cash in on the bounty, they quickly relented. Not nearly as notable, the reliable SureFire MiniGun, mounted on the body, is intended as an anti-personnel weapon. + + + +Jalastar Aerospace + + + +Panpour + + + +CHASSIS:Unknown +ENGINE:Unknown +ARMOR:Unknown +COMMUNICATIONS:TharHes KR-A P/Comm +TARGETING:TharHes Mars 1 with TAG + + + +Rec Guide:ilClan #26 - Late Succession War - Renaissance + \ No newline at end of file diff --git a/megamek/data/mechfiles/vehicles/Operation Klondike/Galleon Light Tank (RL).blk b/megamek/data/mechfiles/vehicles/Operation Klondike/Galleon Light Tank (RL).blk deleted file mode 100644 index dce76e42b45..00000000000 --- a/megamek/data/mechfiles/vehicles/Operation Klondike/Galleon Light Tank (RL).blk +++ /dev/null @@ -1,67 +0,0 @@ -#building block data file - -1 - -#Write the version number just in case... - -MAM0 - - -Tank - - -Galleon Light Tank - - -GAL-200 (RL) - - - -1180 - - -30 - - -6 - - -14 -13 -13 -14 -18 - - -CLRocketLauncher10Prototype -CLRocketLauncher10Prototype -CLRocketLauncher10Prototype -CLRocketLauncher10Prototype - - -IS Machine Gun -IS Machine Gun -CLRocketLauncher20Prototype -CLRocketLauncher20Prototype - - -ISMG Ammo (100) - - -IS Level 4 - - -2801 - - -0 - - -0 - - -1 - - -Tracked - diff --git a/megamek/data/mechfiles/vehicles/Operation Klondike/Galleon Light Tank GAL-200 (RL).blk b/megamek/data/mechfiles/vehicles/Operation Klondike/Galleon Light Tank GAL-200 (RL).blk new file mode 100644 index 00000000000..c2d6a0ffd56 --- /dev/null +++ b/megamek/data/mechfiles/vehicles/Operation Klondike/Galleon Light Tank GAL-200 (RL).blk @@ -0,0 +1,110 @@ +#building block data file + +1 + +#Write the version number just in case... + +MAM0 + + +Tank + + +Galleon Light Tank + + +GAL-200 (RL) + + + +1180 + + +30 + + +6 + + +14 +13 +13 +14 +18 + + +CLRocketLauncher10Prototype +CLRocketLauncher10Prototype +CLRocketLauncher10Prototype +CLRocketLauncher10Prototype + + +IS Machine Gun +IS Machine Gun +CLRocketLauncher20Prototype +CLRocketLauncher20Prototype + + +ISMG Ammo (100) + + +IS Level 4 + + +2801 + + +0 + + +0 + + +1 + + +Tracked + + + +With a top speed faster than most 'Mechs, the Galleon was well-armed but lacked protection, carrying only three and a half tons of armor. + + + +A light combat vehicle that first saw production in 2692] the Galleon proved to be an economical means of supporting infantry and BattleMechs. + + + +The turret of this 2801 refit carries a pair of Machine Guns and a pair of Rocket Launcher 20s. Four Rocket Launcher 10s mounted on the tank's front provide additional firepower. + + + +Despite this, the vehicle served well during the Amaris Civil War, and after the Exodus, these tracked vehicles mostly fell into the possession of the Draconis Combine and the Free Worlds League. The Galleon is often paired with the Harasser Missile Platform. + + + +Field Refit + + + +Various + + + +ENGINE:GTEM 180 +ARMOR:3/StarSlab 6 +COMMUNICATIONS:Maxell 500 +TARGETING:Maxell TA50 + + + +30.0 + + + +PETROCHEMICALS + + + +OP Klondyke - Late Succession War + \ No newline at end of file diff --git a/megamek/data/mechfiles/vehicles/ProtoTypes/Rommel Tank (Howitzer) Production.blk b/megamek/data/mechfiles/vehicles/ProtoTypes/Rommel Tank (Howitzer) Production.blk index 988bc927094..64d9268b855 100644 --- a/megamek/data/mechfiles/vehicles/ProtoTypes/Rommel Tank (Howitzer) Production.blk +++ b/megamek/data/mechfiles/vehicles/ProtoTypes/Rommel Tank (Howitzer) Production.blk @@ -90,6 +90,43 @@ Thunderbolt 5 65.0 + + + +With its default main weapon being the massive and immensely powerful but short-ranged AC/20, the Rommel is best suited to close range and urban fighting, where its heavy gun can be put to excellent use. A Rommel may lie in wait around a corner or down an alley, and then use its devastating armament to cripple or destroy a BattleMech when it comes into view. The main advantage the Rommel has over other, older designs is a combination of higher speed and more armor. With even more armor than a Demolisher tank, the Rommel can sustain more punishment, yet slip away faster to fight again from another position. + + + +The Rommel tank is a 65-ton armored combat vehicle, specializing in close range fighting and urban combat. Identical to its twin, the Patton, in every way but armament and armor configuration, the Rommel has primarily served with the Lyran Commonwealth and the Lyran Alliance. + + + +The 3087 production model of the Rommel Howitzer replaces the XL engine with a standard fusion engine to reduce costs. This reduces the tank's top speed to 54 km/h. This version also carries a half-ton less of the Heavy Ferro-Fibrous armor, but the weapons systems remain the same as the prototype's. + + + +The Rommel was designed concurrently with the Patton in the early 3000s, when Defiance Industries decided that an armored combat vehicle capable of replacing 'Mechs was needed. Since 'Mech production was nearly at a standstill, the ability to produce and field armored vehicles became a necessity for every Successor State. + + + +Defiance Industries + + + +Hesperus II + + + +ENGINE:Magna 260 XL +ARMOR:Durallex Special Heavy Ferro-Fibrous +COMMUNICATIONS:TharHes Muse 54-58K +TARGETING:TharHes Mars5 + + -TRO:Prototypes +TRO:Prototypes - Early Republic + + +65.0 + \ No newline at end of file diff --git a/megamek/data/mechfiles/vehicles/XTRs/Corporations/Maxim Flanker.blk b/megamek/data/mechfiles/vehicles/XTRs/Corporations/Maxim Flanker.blk index 61b52baf7d2..74e1d26ff3d 100644 --- a/megamek/data/mechfiles/vehicles/XTRs/Corporations/Maxim Flanker.blk +++ b/megamek/data/mechfiles/vehicles/XTRs/Corporations/Maxim Flanker.blk @@ -1,17 +1,17 @@ #building block data file - 1 +##Write the version number just in case... + +MAM0 + + Tank - -1 - - Maxim Flanker @@ -28,30 +28,30 @@ Maxim Flanker 3074 - -Jihad - + +3074 + -IS Level 4 +IS Level 2 - -50.0 - - Hover - -0 - + +cargobay:4.0:1:1 + 8 + +0 + + 20 46 @@ -60,7 +60,7 @@ Hover -ISSponsonTurret +SponsonTurret IS Ammo LRM-15 IS Ammo LRM-15 IS Ammo SRM-4 @@ -87,6 +87,43 @@ Machine Gun(ST) Machine Gun - -cargobay:4:1 - + +50.0 + + + +XTRO Corporations - Jihad + + + +The Maxim transport fulfilled an infantryman's dream. Its single infantry bay is configured to carry an entire foot platoon with enough space for them to check their weapons and move around comfortably. +The seats are all padded and face the centre of the vehicle, allowing infantry to communicate with one another and boost morale. Unlike other craft, the crew of the Maxim can deflate the rear portion of the hover skirt when disembarking or mounting up. In a combat situation, the Maxim also performs admirably. With its short- and long-range missiles, the hovertank can provide cover fire in any direction for a debarking infantry platoon. + + + +While many infantry transports have been popular, none have reached the iconic status of the Maxim. + + + +Designed to increase the hovercraft's performance while dropping troops, the Flanker model has Sponson Turrets and has much more armor on its left side than its right. The idea was to present a heavily-armed and armored broadside to the enemy while performing its primary duty. + + + +Nobody anticipated how quickly the Maxim would become a success after it was designed and manufactured by Maxim Transport Industries, a start-up company on Al Na'ir led by a retired infantry general. The Maxim has spread to every corner of the Inner Sphere and is now considered the standard for troop transports. Many units rejoiced at the prospect of being able to transport their infantry platoons in a single vehicle rather than three or four separate vehicles. The company thrived and later opened plants on Skye and Sian, with plans to open plants on Atreus and Kathil once several more vehicles could be produced. While the Maxim was a huge success, many of MTI's other forays into the military market were abysmal failures, and the company barely survived. During the beginning of 3037, a massive scandal erupted throughout the company, effectively ending it. Accusations of inappropriate behaviour among coworkers, embezzlement, and rumours of bizarre hazing rituals led to the company's demise and dissolution. Sensing an opportunity, prominent corporations purchased nearby Maxim facilities at low rates, and in the case of the Sian facility, with armed force. + + + +Field Refit + + + +Various + + + +CHASSIS:Unknown +ENGINE:Unknown Fusion +ARMOR:ProtecTech 6 +COMMUNICATIONS:Scarborough Talky 2 with ECM +TARGETING:Scarborough Tracky 1 with TAG + \ No newline at end of file diff --git a/megamek/data/mechfiles/vehicles/XTRs/Marik/Galleon Light Tank Maxwell.blk b/megamek/data/mechfiles/vehicles/XTRs/Marik/Galleon Light Tank Maxwell.blk index ead61c18993..ef6eaf30fee 100644 --- a/megamek/data/mechfiles/vehicles/XTRs/Marik/Galleon Light Tank Maxwell.blk +++ b/megamek/data/mechfiles/vehicles/XTRs/Marik/Galleon Light Tank Maxwell.blk @@ -95,3 +95,37 @@ XTRO Marik - Jihad 30.0 + +With a top speed faster than most 'Mechs, the Galleon was well-armed but lacked protection, carrying only three and a half tons of armor. + + + +A light combat vehicle that first saw production in 2692 the Galleon proved to be an economical means of supporting infantry and BattleMechs. + + + +Developed by the Maxwell Planetary Defense Consortium, this Galleon variant uses some Experimental Technology to improve battlefield performance. The Armored Motive System protects the tracks, while Sponson Turrets allow some of the secondary weapons a larger field of fire. Each sponson turret has a Small Pulse Laser and Machine Gun, while a standard medium laser is in the main turret. A four-ton infantry bay allows the Galleon to carry a squad of battle armor equipped troopers. To make room for all this equipment, the Gallon Maxwell uses an XL engine. + + + +Despite this, the vehicle served well during the Amaris Civil War, and after the Exodus, these tracked vehicles mostly fell into the possession of the Draconis Combine and the Free Worlds League. The Galleon is often paired with the Harasser Missile Platform. + + + +Maxwell Planetary Defense Consortium + + + +Maxwell + + + +ENGINE:GTEM 210 XL +ARMOR:Jolassa 328 Ferro-Fibrous +COMMUNICATIONS:Maxell 500 +TARGETING:Maxell TA50 + + + +TRO3058U - Succession Wars + \ No newline at end of file diff --git a/megamek/data/mechfiles/vehicles/XTRs/Periphery/Patton Tank SB.blk b/megamek/data/mechfiles/vehicles/XTRs/Periphery/Patton Tank SB.blk index 8aea2187838..ba9228570da 100644 --- a/megamek/data/mechfiles/vehicles/XTRs/Periphery/Patton Tank SB.blk +++ b/megamek/data/mechfiles/vehicles/XTRs/Periphery/Patton Tank SB.blk @@ -3,7 +3,7 @@ 1 -# Write the version number just in case... +##Write the version number just in case... MAM0 @@ -13,10 +13,11 @@ Tank -Patton Tank-SB +Patton Tank +-SB @@ -27,14 +28,21 @@ Patton Tank-SB 3079 + +3079 + + -IS Level 4 +IS Level 2 Tracked + + + 4 @@ -94,3 +102,42 @@ XTRO Periphery - Jihad 65.0 + + +The Patton mounts an AC/10, giving it twice the ammunition capacity and superior firing range while also enabling it to be fitted with more armor. The Patton is capable of fighting in short-ranged and urban environments, but is far more suited than the Rommel to engaging targets at medium to long range. + + + +The Patton tank is a 65-ton armored combat vehicle, specializing in conventional armored warfare. Identical to its twin, the Rommel, in every way but armament and armor configuration, the Patton has primarily served with the Lyran Commonwealth and the Lyran Alliance. + + + +This version of the Patton was built with the intent of functioning in hostile environments like the vacuum of space. Environmental Sealing protects the crew from hostile environments. An XL fusion engine with Supercharger allows the Patton-SB to perform sprints of up to 86 km/h to reposition quickly. It retains the LRM-5, but replaces the other weaponry with a pair of ER medium lasers and a Silver Bullet Gauss Rifle with three tons of ammunition. The tank is protected by eleven and a half tons of Heavy Ferro-Fibrous armor. + + + +Designed concurrently with the Rommel, Defiance Industries decided that a vehicle to replace 'Mechs was needed in the early 3000s. Since 'Mech production was nearly at a standstill, the ability to produce and field armored vehicles became a necessity no Successor State could ignore. + + + +Defiance Industries, General Motors + + + +Hesperus II,Salem + + + +ENGINE:Magna 260 XL +ARMOR:Durallex Special Heavy Ferro-Fibrous +COMMUNICATIONS:TharHes Muse 54-58K +TARGETING:TharHes Mars5 + + + +TRO 3039 - Succession Wars + + + +65.0 + diff --git a/megamek/data/mechfiles/vehicles/XTRs/Republic I/Condor Multi-Purpose Tank (Reactive).blk b/megamek/data/mechfiles/vehicles/XTRs/Republic I/Condor Multi-Purpose Tank (Reactive).blk index 97e02548605..7ede24d889e 100644 --- a/megamek/data/mechfiles/vehicles/XTRs/Republic I/Condor Multi-Purpose Tank (Reactive).blk +++ b/megamek/data/mechfiles/vehicles/XTRs/Republic I/Condor Multi-Purpose Tank (Reactive).blk @@ -94,3 +94,35 @@ XTRO Republic I - Jiahd 50.0 + + +Although expensive to buy and to maintain, this immense hovercraft is capable of a flank speed of 129 km/h and a cruising speed of 86 km/h, making it one of the fastest vehicles in its weight class and as fast as the speediest 'Mechs and vehicles. Six tons of StarSlab/9.5 Mk II armor give the Condor considerable protection for its role, though the bulk is concentrated on the front and turret, notably weakening the sides. Unlike tracked or wheeled vehicles of the same weight, the Condor is intended to attack enemies "on the fly" at medium ranges, + + + +A heavy cavalry unit designed for rapid reaction to a shifting battle, the Condor is one of the few heavy hover tanks available. + + + +This version of the Condor Multi-Purpose tank offers weapons and performance identical to the standard armor protection version. The only difference is that this variant serves in front-line Republic commands and is protected by six and a half tons of Reactive Armor. + + + +Introduced a few short years before the formation of the original Star League, the Condor remained one of Red Devil Industries main sellers for centuries and was widely distributed across the Inner Sphere, with the militaries of the Lyran Commonwealth, Federated Suns and Capellan Confederation fielding the majority during the Succession Wars. With the loss of Red Devil's factories with the capture of Pandora by Clan Jade Falcon in 3064, the design was secured by Quikscell Company, who developed an advanced new-tech refresh of the venerable and still highly popular design, even selling the unassembled components of the tank in kit form in effort to keep up with demand. Red Devil actually builds their own under license. Originally, Defiance Industries declined to allow the company to do so, which led to Red Devil offering a bounty for used or slightly damaged lasers taken in combat to recondition and install on new Condors. When Defiance noticed that some of its flagship BattleMech designs, such as the Zeus, attracted undue fire from foes attempting to cash in on the bounty, they quickly relented. Not nearly as notable, the reliable SureFire MiniGun, mounted on the body, is intended as an anti-personnel weapon. + + + +Field Refit + + + +Various + + + +CHASSIS:Unknown +ENGINE:Core Tek 215 XL fusion engine +ARMOR:StarSlab/9.5 Ferro-Fibrous Mk II +COMMUNICATIONS:TharHes KR-A P/Comm +TARGETING:TharHes Mars 1 with TAG + \ No newline at end of file diff --git a/megamek/data/mechfiles/vehicles/XTRs/Republic I/Condor Multi-Purpose Tank (Standard).blk b/megamek/data/mechfiles/vehicles/XTRs/Republic I/Condor Multi-Purpose Tank (Standard).blk index a7c8aa93ab6..1f120f17550 100644 --- a/megamek/data/mechfiles/vehicles/XTRs/Republic I/Condor Multi-Purpose Tank (Standard).blk +++ b/megamek/data/mechfiles/vehicles/XTRs/Republic I/Condor Multi-Purpose Tank (Standard).blk @@ -86,3 +86,35 @@ XTRO Republic I - Jihad 50.0 + + +Although expensive to buy and to maintain, this immense hovercraft is capable of a flank speed of 129 km/h and a cruising speed of 86 km/h, making it one of the fastest vehicles in its weight class and as fast as the speediest 'Mechs and vehicles. Six tons of StarSlab/9.5 Mk II armor give the Condor considerable protection for its role, though the bulk is concentrated on the front and turret, notably weakening the sides. Unlike tracked or wheeled vehicles of the same weight, the Condor is intended to attack enemies "on the fly" at medium ranges, + + + +A heavy cavalry unit designed for rapid reaction to a shifting battle, the Condor is one of the few heavy hover tanks available. + + + +This Republic variant uses the failed Condor Trans-Track as a base chassis. It removes the lift skirts and other hover-related components in favor of a fifty ton tracked chassis. Equipped with an LB 5-X autocannon, LRM-15, and two machine guns, it serves in the Republic Standing Guard. It can reach a top speed of 96 km/h thanks to an XL Fusion engine. This version is protected by six and a half tons of standard armor. + + + +Introduced a few short years before the formation of the original Star League, the Condor remained one of Red Devil Industries main sellers for centuries and was widely distributed across the Inner Sphere, with the militaries of the Lyran Commonwealth, Federated Suns and Capellan Confederation fielding the majority during the Succession Wars. With the loss of Red Devil's factories with the capture of Pandora by Clan Jade Falcon in 3064, the design was secured by Quikscell Company, who developed an advanced new-tech refresh of the venerable and still highly popular design, even selling the unassembled components of the tank in kit form in effort to keep up with demand. Red Devil actually builds their own under license. Originally, Defiance Industries declined to allow the company to do so, which led to Red Devil offering a bounty for used or slightly damaged lasers taken in combat to recondition and install on new Condors. When Defiance noticed that some of its flagship BattleMech designs, such as the Zeus, attracted undue fire from foes attempting to cash in on the bounty, they quickly relented. Not nearly as notable, the reliable SureFire MiniGun, mounted on the body, is intended as an anti-personnel weapon. + + + +Quikscell Company + + + +Oliver + + + +CHASSIS:Unknown +ENGINE:Core Tek 215 XL fusion engine +ARMOR:StarSlab/9.5 Ferro-Fibrous Mk II +COMMUNICATIONS:TharHes KR-A P/Comm +TARGETING:TharHes Mars 1 with TAG + \ No newline at end of file diff --git a/megamek/data/mechfiles/vehicles/XTRs/Steiner/Rommel Tank (Howitzer) Prototype.blk b/megamek/data/mechfiles/vehicles/XTRs/Steiner/Rommel Tank (Howitzer) Prototype.blk index e46749cea25..d56899262e6 100644 --- a/megamek/data/mechfiles/vehicles/XTRs/Steiner/Rommel Tank (Howitzer) Prototype.blk +++ b/megamek/data/mechfiles/vehicles/XTRs/Steiner/Rommel Tank (Howitzer) Prototype.blk @@ -91,7 +91,41 @@ ISLongTomCannon Thunderbolt 5 + +With its default main weapon being the massive and immensely powerful but short-ranged AC/20, the Rommel is best suited to close range and urban fighting, where its heavy gun can be put to excellent use. A Rommel may lie in wait around a corner or down an alley, and then use its devastating armament to cripple or destroy a BattleMech when it comes into view. The main advantage the Rommel has over other, older designs is a combination of higher speed and more armor. With even more armor than a Demolisher tank, the Rommel can sustain more punishment, yet slip away faster to fight again from another position. + + + +The Rommel tank is a 65-ton armored combat vehicle, specializing in close range fighting and urban combat. Identical to its twin, the Patton, in every way but armament and armor configuration, the Rommel has primarily served with the Lyran Commonwealth and the Lyran Alliance. + + + +This version of the Rommel removes the standard weaponry and replaces it with weapons that are allegedly easier for newer troops to use and less likely to fall victim to electronic warfare or Anti-Missile systems. The main gun is a Long Tom Artillery Cannon. This weapon can inflict massive amounts of damage on the target and its immediate surroundings and it doesn't require a great gunner. The LRM-5 was replaced by a Thunderbolt 5 launcher to provide more punch at the cost of range. Two front-mounted ER medium lasers provide ammunition-independent fire. Twelve tons of Heavy Ferro-Fibrous armor protects the tank. + + + +The Rommel was designed concurrently with the Patton in the early 3000s, when Defiance Industries decided that an armored combat vehicle capable of replacing 'Mechs was needed. Since 'Mech production was nearly at a standstill, the ability to produce and field armored vehicles became a necessity for every Successor State. + + + +Defiance Manufacturing Annex + + + +Kwangjong-ni + + + +ENGINE:Magna 260 +ARMOR:Durallex Special Heavy Ferro-Fibrous +COMMUNICATIONS:TharHes Muse 54-58K +TARGETING:TharHes Mars5 + + XTRO Steiner - Jihad + +65.0 + \ No newline at end of file diff --git a/megamek/data/mechfiles/vehicles/XTRs/Succession Wars/Condor Heavy Hover Tank (Fission).blk b/megamek/data/mechfiles/vehicles/XTRs/Succession Wars/Condor Heavy Hover Tank (Fission).blk index 9e15a7e30bf..2939508b3b5 100644 --- a/megamek/data/mechfiles/vehicles/XTRs/Succession Wars/Condor Heavy Hover Tank (Fission).blk +++ b/megamek/data/mechfiles/vehicles/XTRs/Succession Wars/Condor Heavy Hover Tank (Fission).blk @@ -3,7 +3,7 @@ 1 -# Write the version number just in case... +##Write the version number just in case... MAM0 @@ -28,14 +28,21 @@ Condor Heavy Hover Tank 3014 + +3014 + + -IS Level 4 +IS Level 3 Hover + + + 8 @@ -62,15 +69,15 @@ IS Machine Gun Ammo - Half -Vehicle Flamer(ST) +Flamer (Vehicle)(ST) Machine Gun(ST) -ISSponsonTurret +SponsonTurret -Vehicle Flamer(ST) +Flamer (Vehicle)(ST) Machine Gun(ST) -ISSponsonTurret +SponsonTurret @@ -82,6 +89,38 @@ Medium Laser Medium Laser + +Although expensive to buy and to maintain, this immense hovercraft is capable of a flank speed of 129 km/h and a cruising speed of 86 km/h, making it one of the fastest vehicles in its weight class and as fast as the speediest 'Mechs and vehicles. Six tons of StarSlab/9.5 Mk II armor give the Condor considerable protection for its role, though the bulk is concentrated on the front and turret, notably weakening the sides. Unlike tracked or wheeled vehicles of the same weight, the Condor is intended to attack enemies "on the fly" at medium ranges, + + + +A heavy cavalry unit designed for rapid reaction to a shifting battle, the Condor is one of the few heavy hover tanks available. + + + +This Capellan Confederation experiment replaced the fusion engine with a fission engine. To make room for the engine, engineers removed the autocannon and replaced it with a third medium laser. They also increased protection by adding sponson turrets to the tank, each carries a vehicle flamer and a machine gun. The ammunition for these weapons is stored in the body. The fission-powered engine also carries an extra two and a half tons of armor + + + +Introduced a few short years before the formation of the original Star League, the Condor remained one of Red Devil Industries main sellers for centuries and was widely distributed across the Inner Sphere, with the militaries of the Lyran Commonwealth, Federated Suns and Capellan Confederation fielding the majority during the Succession Wars. With the loss of Red Devil's factories with the capture of Pandora by Clan Jade Falcon in 3064, the design was secured by Quikscell Company, who developed an advanced new-tech refresh of the venerable and still highly popular design, even selling the unassembled components of the tank in kit form in effort to keep up with demand. Red Devil actually builds their own under license. Originally, Defiance Industries declined to allow the company to do so, which led to Red Devil offering a bounty for used or slightly damaged lasers taken in combat to recondition and install on new Condors. When Defiance noticed that some of its flagship BattleMech designs, such as the Zeus, attracted undue fire from foes attempting to cash in on the bounty, they quickly relented. Not nearly as notable, the reliable SureFire MiniGun, mounted on the body, is intended as an anti-personnel weapon. + + + +Field Refit + + + +Various + + + +CHASSIS:Unknown +ENGINE:Unknown Fission +ARMOR:StarSlab/9.5 Mk II +COMMUNICATIONS:TharHes KR-A P/Comm +TARGETING:TharHes Mars 1 + + XTRO Succession Wars - Succession Wars @@ -89,3 +128,4 @@ XTRO Succession Wars - Succession Wars 50.0 + diff --git a/megamek/data/mechfiles/vehicles/ilClan Rec Guides/Vol 26/Condor Heavy Hover Tank (Fusion).blk b/megamek/data/mechfiles/vehicles/ilClan Rec Guides/Vol 26/Condor Heavy Hover Tank (Fusion).blk new file mode 100644 index 00000000000..981d3187da5 --- /dev/null +++ b/megamek/data/mechfiles/vehicles/ilClan Rec Guides/Vol 26/Condor Heavy Hover Tank (Fusion).blk @@ -0,0 +1,127 @@ +#building block data file + +1 + + +##Write the version number just in case... + +MAM0 + + + +Tank + + + +Condor Heavy Hover Tank + + + +(Fusion) + + + +9309 + + + +3040 + + + +3040 + + + +IS Level 1 + + + +Hover + + + + + + +8 + + + +0 + + + +36 +24 +24 +16 +20 + + + +IS Ammo AC/10 +IS Ammo AC/10 +IS Ammo MG - Full + + + +Machine Gun + + + + + + + + + + + + +Autocannon/10 +Medium Laser +Medium Laser +Medium Laser + + + +Although expensive to buy and to maintain, this immense hovercraft is capable of a flank speed of 129 km/h and a cruising speed of 86 km/h, making it one of the fastest vehicles in its weight class and as fast as the speediest 'Mechs and vehicles. Six tons of StarSlab/9.5 Mk II armor give the Condor considerable protection for its role, though the bulk is concentrated on the front and turret, notably weakening the sides. Unlike tracked or wheeled vehicles of the same weight, the Condor is intended to attack enemies "on the fly" at medium ranges, + + + +A heavy cavalry unit designed for rapid reaction to a shifting battle, the Condor is one of the few heavy hover tanks available. + + + +No Details on this model. + + + +Introduced a few short years before the formation of the original Star League, the Condor remained one of Red Devil Industries main sellers for centuries and was widely distributed across the Inner Sphere, with the militaries of the Lyran Commonwealth, Federated Suns and Capellan Confederation fielding the majority during the Succession Wars. With the loss of Red Devil's factories with the capture of Pandora by Clan Jade Falcon in 3064, the design was secured by Quikscell Company, who developed an advanced new-tech refresh of the venerable and still highly popular design, even selling the unassembled components of the tank in kit form in effort to keep up with demand. Red Devil actually builds their own under license. Originally, Defiance Industries declined to allow the company to do so, which led to Red Devil offering a bounty for used or slightly damaged lasers taken in combat to recondition and install on new Condors. When Defiance noticed that some of its flagship BattleMech designs, such as the Zeus, attracted undue fire from foes attempting to cash in on the bounty, they quickly relented. Not nearly as notable, the reliable SureFire MiniGun, mounted on the body, is intended as an anti-personnel weapon. + + + +Red Devil Industries + + + +Pandora + + + +CHASSIS:Unknown +ENGINE:Unknown +ARMOR:Unknown +COMMUNICATIONS:TharHes KR-A P/Comm +TARGETING:TharHes Mars 1 with TAG + + + +Rec Guide:ilClan #26 - Late Succession War - Renaissance + + + +50.0 + + diff --git a/megamek/data/mechfiles/vehicles/ilClan Rec Guides/Vol 26/Condor Heavy Hover Tank (LAC).blk b/megamek/data/mechfiles/vehicles/ilClan Rec Guides/Vol 26/Condor Heavy Hover Tank (LAC).blk new file mode 100644 index 00000000000..dbfb0ef590f --- /dev/null +++ b/megamek/data/mechfiles/vehicles/ilClan Rec Guides/Vol 26/Condor Heavy Hover Tank (LAC).blk @@ -0,0 +1,139 @@ +#building block data file + +1 + + +##Write the version number just in case... + +MAM0 + + + +Tank + + + +Condor Heavy Hover Tank + + + +(LAC) + + + +9310 + + + +3140 + + + +3140 + + + +IS Level 2 + + + +Hover + + + + + + +9 + + + +2 + + + +1 + + + +1 + + + +-1 + + + +36 +28 +28 +23 +28 + + + +ISTargeting Computer +ISAMS Ammo +IS Ammo LAC/5 +IS Ammo LAC/5 + + + +ISAntiMissileSystem + + + + + + + + + + + + +Light Auto Cannon/5 +Medium Re-engineered Laser +Medium Re-engineered Laser + + + +Although expensive to buy and to maintain, this immense hovercraft is capable of a flank speed of 129 km/h and a cruising speed of 86 km/h, making it one of the fastest vehicles in its weight class and as fast as the speediest 'Mechs and vehicles. Six tons of StarSlab/9.5 Mk II armor give the Condor considerable protection for its role, though the bulk is concentrated on the front and turret, notably weakening the sides. Unlike tracked or wheeled vehicles of the same weight, the Condor is intended to attack enemies "on the fly" at medium ranges, + + + +A heavy cavalry unit designed for rapid reaction to a shifting battle, the Condor is one of the few heavy hover tanks available. + + + +No Details on this Variant + + + +Introduced a few short years before the formation of the original Star League, the Condor remained one of Red Devil Industries main sellers for centuries and was widely distributed across the Inner Sphere, with the militaries of the Lyran Commonwealth, Federated Suns and Capellan Confederation fielding the majority during the Succession Wars. With the loss of Red Devil's factories with the capture of Pandora by Clan Jade Falcon in 3064, the design was secured by Quikscell Company, who developed an advanced new-tech refresh of the venerable and still highly popular design, even selling the unassembled components of the tank in kit form in effort to keep up with demand. Red Devil actually builds their own under license. Originally, Defiance Industries declined to allow the company to do so, which led to Red Devil offering a bounty for used or slightly damaged lasers taken in combat to recondition and install on new Condors. When Defiance noticed that some of its flagship BattleMech designs, such as the Zeus, attracted undue fire from foes attempting to cash in on the bounty, they quickly relented. Not nearly as notable, the reliable SureFire MiniGun, mounted on the body, is intended as an anti-personnel weapon. + + + +Jalastar Aerospace + + + +Panpour + + + +CHASSIS:Unknown +ENGINE:Core Tek 215 XL fusion engine +ARMOR:StarSlab/9.5 Ferro-Fibrous Mk II +COMMUNICATIONS:TharHes KR-A P/Comm +TARGETING:TharHes Mars 1 with TAG + + + +Rec Guide:ilClan #26 - Dark Ages + + + +50.0 + + diff --git a/megamek/data/mechfiles/vehicles/ilClan Rec Guides/Vol 26/Condor Heavy Hover Tank (Laser).blk b/megamek/data/mechfiles/vehicles/ilClan Rec Guides/Vol 26/Condor Heavy Hover Tank (Laser).blk new file mode 100644 index 00000000000..dadcbc0ea23 --- /dev/null +++ b/megamek/data/mechfiles/vehicles/ilClan Rec Guides/Vol 26/Condor Heavy Hover Tank (Laser).blk @@ -0,0 +1,100 @@ +#building block data file + +1 + +#Write the version number just in case... + +MAM0 + + +Tank + + +Condor Heavy Hover Tank + + +(Laser) + + + +681 + + +50 + + +8 + + +36 +24 +24 +16 +20 + + +ISERMediumLaser +ISERMediumLaser +ISERMediumLaser +ISERMediumLaser +ISSRM2 +ISSRM2 +ISSRM2 + + +ISSRM2 Ammo +ISSRM2 Ammo + + +IS Level 2 + + +3061 + + +0 + + +0 + + +0 + + +Hover + + +Clan Invasion + + + +Although expensive to buy and to maintain, this immense hovercraft is capable of a flank speed of 129 km/h and a cruising speed of 86 km/h, making it one of the fastest vehicles in its weight class and as fast as the speediest 'Mechs and vehicles. Six tons of StarSlab/9.5 Mk II armor give the Condor considerable protection for its role, though the bulk is concentrated on the front and turret, notably weakening the sides. Unlike tracked or wheeled vehicles of the same weight, the Condor is intended to attack enemies "on the fly" at medium ranges, + + + +A heavy cavalry unit designed for rapid reaction to a shifting battle, the Condor is one of the few heavy hover tanks available. + + + +Apparently a hybrid between the original Condor and the Condor Upgrade, this version uses a standard Fusion engine to provide power. The turret carries four ER medium lasers and three SRM-2 launchers with two tons of ammunition. + + + +Introduced a few short years before the formation of the original Star League, the Condor remained one of Red Devil Industries main sellers for centuries and was widely distributed across the Inner Sphere, with the militaries of the Lyran Commonwealth, Federated Suns and Capellan Confederation fielding the majority during the Succession Wars. With the loss of Red Devil's factories with the capture of Pandora by Clan Jade Falcon in 3064, the design was secured by Quikscell Company, who developed an advanced new-tech refresh of the venerable and still highly popular design, even selling the unassembled components of the tank in kit form in effort to keep up with demand. Red Devil actually builds their own under license. Originally, Defiance Industries declined to allow the company to do so, which led to Red Devil offering a bounty for used or slightly damaged lasers taken in combat to recondition and install on new Condors. When Defiance noticed that some of its flagship BattleMech designs, such as the Zeus, attracted undue fire from foes attempting to cash in on the bounty, they quickly relented. Not nearly as notable, the reliable SureFire MiniGun, mounted on the body, is intended as an anti-personnel weapon. + + + +Red Devil Industries,Jalastar Aerospace,Quikscell Company + + + +Pandora,Panpour,Richvale + + + +CHASSIS:Unknown +ENGINE:Unknown +ARMOR:StarSlab/9.5 Mk II +COMMUNICATIONS:TharHes KR-A P/Comm +TARGETING:TharHes Mars 1 + \ No newline at end of file diff --git a/megamek/data/mechfiles/vehicles/ilClan Rec Guides/Vol 26/Condor Heavy Hover Tank (Ultra).blk b/megamek/data/mechfiles/vehicles/ilClan Rec Guides/Vol 26/Condor Heavy Hover Tank (Ultra).blk new file mode 100644 index 00000000000..3e04a0a3d13 --- /dev/null +++ b/megamek/data/mechfiles/vehicles/ilClan Rec Guides/Vol 26/Condor Heavy Hover Tank (Ultra).blk @@ -0,0 +1,137 @@ +#building block data file + +1 + + +##Write the version number just in case... + +MAM0 + + + +Tank + + + +Condor Heavy Hover Tank + + + +(Ultra) + + + +9308 + + + +3113 + + + +3113 + + + +Mixed (IS Chassis) Advanced + + + +Hover + + + + + + +9 + + + +6 + + + +3 + + + +5 + + + +30 +18 +18 +16 +22 + + + +ISAMS Ammo +Clan Ultra AC/10 Ammo +Clan Ultra AC/10 Ammo +CLMediumChemLaserAmmo +ISCASE + + + +ISAntiMissileSystem + + + + + + + + + + + + +CLUltraAC10 +CLMediumChemicalLaser +CLMediumChemicalLaser +ISTAG + + + +Although expensive to buy and to maintain, this immense hovercraft is capable of a flank speed of 129 km/h and a cruising speed of 86 km/h, making it one of the fastest vehicles in its weight class and as fast as the speediest 'Mechs and vehicles. Six tons of StarSlab/9.5 Mk II armor give the Condor considerable protection for its role, though the bulk is concentrated on the front and turret, notably weakening the sides. Unlike tracked or wheeled vehicles of the same weight, the Condor is intended to attack enemies "on the fly" at medium ranges, + + + +A heavy cavalry unit designed for rapid reaction to a shifting battle, the Condor is one of the few heavy hover tanks available. + + + +No Information on this variant + + + +Introduced a few short years before the formation of the original Star League, the Condor remained one of Red Devil Industries main sellers for centuries and was widely distributed across the Inner Sphere, with the militaries of the Lyran Commonwealth, Federated Suns and Capellan Confederation fielding the majority during the Succession Wars. With the loss of Red Devil's factories with the capture of Pandora by Clan Jade Falcon in 3064, the design was secured by Quikscell Company, who developed an advanced new-tech refresh of the venerable and still highly popular design, even selling the unassembled components of the tank in kit form in effort to keep up with demand. Red Devil actually builds their own under license. Originally, Defiance Industries declined to allow the company to do so, which led to Red Devil offering a bounty for used or slightly damaged lasers taken in combat to recondition and install on new Condors. When Defiance noticed that some of its flagship BattleMech designs, such as the Zeus, attracted undue fire from foes attempting to cash in on the bounty, they quickly relented. Not nearly as notable, the reliable SureFire MiniGun, mounted on the body, is intended as an anti-personnel weapon. + + + +Red Devil Industries + + + +Pandora + + + +CHASSIS:Unknown +ENGINE:Jones ElectroCell 165 Fuel Cell +ARMOR:Bowie Glinting Blade Reflective with CASE +COMMUNICATIONS:TharHes KR-A P/Comm +TARGETING:TharHes Mars 1 with TAG + + + +Rec Guide:ilClan #26 - Late Republic + + + +50.0 + + diff --git a/megamek/data/mechfiles/vehicles/ilClan Rec Guides/Vol 26/Condor Heavy Hover Tank C.blk b/megamek/data/mechfiles/vehicles/ilClan Rec Guides/Vol 26/Condor Heavy Hover Tank C.blk new file mode 100644 index 00000000000..9cb84a8a4d4 --- /dev/null +++ b/megamek/data/mechfiles/vehicles/ilClan Rec Guides/Vol 26/Condor Heavy Hover Tank C.blk @@ -0,0 +1,138 @@ +#building block data file + +1 + + +##Write the version number just in case... + +MAM0 + + + +Tank + + + +Condor Heavy Hover Tank + + + +C + + + +9311 + + + +3082 + + + +3082 + + + +Clan Level 2 + + + +Hover + + + + + + +8 + + + +1 + + + +false + + + +30 +18 +18 +16 +22 + + + +CLMediumChemLaserAmmo +CLMediumChemLaserAmmo +CLMediumChemLaserAmmo +Clan ProtoMech AC/2 Ammo +Clan ProtoMech AC/8 Ammo +Clan ProtoMech AC/8 Ammo + + + +CLProtoMechAC2 + + + + + + + + + + + + +CLProtoMechAC8 +CLMediumChemicalLaser +CLMediumChemicalLaser +CLMediumChemicalLaser + + + +Although expensive to buy and to maintain, this immense hovercraft is capable of a flank speed of 129 km/h and a cruising speed of 86 km/h, making it one of the fastest vehicles in its weight class and as fast as the speediest 'Mechs and vehicles. Six tons of StarSlab/9.5 Mk II armor give the Condor considerable protection for its role, though the bulk is concentrated on the front and turret, notably weakening the sides. Unlike tracked or wheeled vehicles of the same weight, the Condor is intended to attack enemies "on the fly" at medium ranges, + + + +A heavy cavalry unit designed for rapid reaction to a shifting battle, the Condor is one of the few heavy hover tanks available. + + + +No information on this variant + + + +Introduced a few short years before the formation of the original Star League, the Condor remained one of Red Devil Industries main sellers for centuries and was widely distributed across the Inner Sphere, with the militaries of the Lyran Commonwealth, Federated Suns and Capellan Confederation fielding the majority during the Succession Wars. With the loss of Red Devil's factories with the capture of Pandora by Clan Jade Falcon in 3064, the design was secured by Quikscell Company, who developed an advanced new-tech refresh of the venerable and still highly popular design, even selling the unassembled components of the tank in kit form in effort to keep up with demand. Red Devil actually builds their own under license. Originally, Defiance Industries declined to allow the company to do so, which led to Red Devil offering a bounty for used or slightly damaged lasers taken in combat to recondition and install on new Condors. When Defiance noticed that some of its flagship BattleMech designs, such as the Zeus, attracted undue fire from foes attempting to cash in on the bounty, they quickly relented. Not nearly as notable, the reliable SureFire MiniGun, mounted on the body, is intended as an anti-personnel weapon. + + + +Red Devil Industries + + + +Pandora + + + +CHASSIS:Unknown +ENGINE:Jones 165 ICE +ARMOR:StarSlab/9.5 Mk II +COMMUNICATIONS:TharHes KR-A P/Comm +TARGETING:TharHes Mars 1 + + + +Rec Guide:ilClan #26 - Dark Ages + + + +50.0 + + + +PETROCHEMICALS + + diff --git a/megamek/data/mechfiles/vehicles/ilClan Rec Guides/Vol 26/Maxim Heavy Hover Transport (Escort).blk b/megamek/data/mechfiles/vehicles/ilClan Rec Guides/Vol 26/Maxim Heavy Hover Transport (Escort).blk new file mode 100644 index 00000000000..5188d338b51 --- /dev/null +++ b/megamek/data/mechfiles/vehicles/ilClan Rec Guides/Vol 26/Maxim Heavy Hover Transport (Escort).blk @@ -0,0 +1,142 @@ +#building block data file + +1 + + +##Write the version number just in case... + +MAM0 + + + +Tank + + + +Maxim Heavy Hover Transport + + + +(Escort) + + + +9312 + + + +3101 + + + +3101 + + + +IS Level 2 + + + +Hover + + + + + + +8 + + + +6 + + + +1 + + + +1 + + + +25 +23 +23 +16 +20 + + + +IS Ammo MML-5 LRM +IS Ammo MML-5 SRM +IS Ammo MG - Full +IS Streak SRM 6 Ammo + + + +ISMML5 +ISMML5 + + + +ISSRM2IOS + + + +ISSRM2IOS + + + +ISMML5 + + + +Machine Gun +Machine Gun +Machine Gun +ISMGA +ISStreakSRM6 + + + +The Maxim transport fulfilled an infantryman's dream. Its single infantry bay is configured to carry an entire foot platoon with enough space for them to check their weapons and move around comfortably. +The seats are all padded and face the centre of the vehicle, allowing infantry to communicate with one another and boost morale. Unlike other craft, the crew of the Maxim can deflate the rear portion of the hover skirt when disembarking or mounting up. In a combat situation, the Maxim also performs admirably. With its short- and long-range missiles, the hovertank can provide cover fire in any direction for a debarking infantry platoon. + + + +While many infantry transports have been popular, none have reached the iconic status of the Maxim. + + + +No Information on this variant + + + +Nobody anticipated how quickly the Maxim would become a success after it was designed and manufactured by Maxim Transport Industries, a start-up company on Al Na'ir led by a retired infantry general. The Maxim has spread to every corner of the Inner Sphere and is now considered the standard for troop transports. Many units rejoiced at the prospect of being able to transport their infantry platoons in a single vehicle rather than three or four separate vehicles. The company thrived and later opened plants on Skye and Sian, with plans to open plants on Atreus and Kathil once several more vehicles could be produced. While the Maxim was a huge success, many of MTI's other forays into the military market were abysmal failures, and the company barely survived. During the beginning of 3037, a massive scandal erupted throughout the company, effectively ending it. Accusations of inappropriate behaviour among coworkers, embezzlement, and rumours of bizarre hazing rituals led to the company's demise and dissolution. Sensing an opportunity, prominent corporations purchased nearby Maxim facilities at low rates, and in the case of the Sian facility, with armed force. + + + +Field Refit + + + +Various + + + +CHASSIS:Unknown +ENGINE:Unknown Fuel Cell +ARMOR:Unknown Ferro-Fibrous +COMMUNICATIONS:Scarborough Talky-2 +TARGETING:Scarborough Tracky 1 + + + +Rec Guide:ilClan #26 - Late Republic + + + +50.0 + + diff --git a/megamek/data/mechfiles/vehicles/3075/Condor (Upgrade).blk b/megamek/data/mechfiles/vehicles/ilClan Rec Guides/Vol 27 - Jan 25/Buzzard Hover Tank.blk similarity index 51% rename from megamek/data/mechfiles/vehicles/3075/Condor (Upgrade).blk rename to megamek/data/mechfiles/vehicles/ilClan Rec Guides/Vol 27 - Jan 25/Buzzard Hover Tank.blk index faae2b0e1ad..d7cf38d6e0b 100644 --- a/megamek/data/mechfiles/vehicles/3075/Condor (Upgrade).blk +++ b/megamek/data/mechfiles/vehicles/ilClan Rec Guides/Vol 27 - Jan 25/Buzzard Hover Tank.blk @@ -1,89 +1,72 @@ #building block data file - 1 +##Write the version number just in case... + +MAM0 + + Tank - -1 - - -Condor Heavy Hover Tank +Buzzard Hover Tank -(Upgrade) (Standard) + -685 +9342 -3066 +3076 - -Jihad - + +3076 + IS Level 2 - -50.0 - - Hover - -2 - + + -9 +8 - -1 - - - -1 - - - --1 - + +6 + -31 -21 -21 -14 -20 +24 +16 +16 +16 +16 -IS Ammo LRM-15 -IS Ammo LRM-15 -IS Machine Gun Ammo - Half -IS LB 5-X AC Ammo -IS LB 5-X AC Ammo +IS Ammo MML-7 LRM +IS Ammo MML-7 LRM +IS Ammo MML-7 SRM +IS Ammo MML-7 SRM -Machine Gun -Machine Gun -ISLBXAC5 @@ -96,6 +79,30 @@ ISLBXAC5 -LRM 15 +Light PPC +ISMML7 +ISMML7 + +Quikscell Company + + + +Richvale + + + +ARMOR:ProtecTech Light +COMMUNICATIONS:Basix 200 +TARGETING:OptiSight-12 + + + +Rec Guide:ilClan #27 - Jihad + + + +50.0 + + diff --git a/megamek/data/mechfiles/vehicles/3075/Condor (Upgrade Laser).blk b/megamek/data/mechfiles/vehicles/ilClan Rec Guides/Vol 27 - Jan 25/Falcon Hover Tank.blk similarity index 51% rename from megamek/data/mechfiles/vehicles/3075/Condor (Upgrade Laser).blk rename to megamek/data/mechfiles/vehicles/ilClan Rec Guides/Vol 27 - Jan 25/Falcon Hover Tank.blk index a963a13e66e..f7a501f0e1b 100644 --- a/megamek/data/mechfiles/vehicles/3075/Condor (Upgrade Laser).blk +++ b/megamek/data/mechfiles/vehicles/ilClan Rec Guides/Vol 27 - Jan 25/Falcon Hover Tank.blk @@ -1,89 +1,70 @@ #building block data file - 1 +##Write the version number just in case... + +MAM0 + + Tank - -1 - - -Condor Heavy Hover Tank +Falcon Hover Tank -(Upgrade) (Laser) + -684 +4154 -3068 +3023 - -Jihad - + +3023 + -IS Level 2 +IS Level 1 - -50.0 - - Hover - -2 - + +cargobay:0.5:1:1 + 9 - -1 - - - + 1 - - - --1 - + -31 -21 -21 -14 -20 +24 +16 +16 +16 +16 -ISAMS Ammo -IS Ammo LRM-15 -IS Ammo LRM-15 -ISGuardianECMSuite -IS Machine Gun Ammo - Half +IS Ammo SRM-6 -Machine Gun -Machine Gun -ISERLargeLaser @@ -96,7 +77,34 @@ ISERLargeLaser -LRM 15 -ISAntiMissileSystem +SRM 6 +SRM 6 +Medium Laser + +Quikscell Company + + + +Richvale + + + +ARMOR:ProtecTech Light +COMMUNICATIONS:Basix 200 +TARGETING:OptiSight-12 + + + +Rec Guide:ilClan #27 - Jihad + + + +50.0 + + + +PETROCHEMICALS + + diff --git a/megamek/data/mechfiles/vehicles/ilClan Rec Guides/Vol 27 - Jan 25/Galleon Light Tank C.blk b/megamek/data/mechfiles/vehicles/ilClan Rec Guides/Vol 27 - Jan 25/Galleon Light Tank C.blk new file mode 100644 index 00000000000..784cabc3e0d --- /dev/null +++ b/megamek/data/mechfiles/vehicles/ilClan Rec Guides/Vol 27 - Jan 25/Galleon Light Tank C.blk @@ -0,0 +1,129 @@ +#building block data file + +1 + + +##Write the version number just in case... + +MAM0 + + + +Tank + + + +Galleon Light Tank + + + +C + + + +9341 + + + +3145 + + + +3145 + + + +Clan Level 2 + + + +Tracked + + + + + + +6 + + + +6 + + + +false + + + +20 +18 +18 +18 +22 + + + +SponsonTurret +CLLargeChemLaserAmmo +CLLargeChemLaserAmmo +CLMediumChemLaserAmmo + + + + + + +CLMediumChemicalLaser(ST) + + + +CLMediumChemicalLaser(ST) + + + + + + +CLLargeChemicalLaser + + + +With a top speed faster than most 'Mechs, the Galleon was well-armed but lacked protection, carrying only three and a half tons of armor. + + + +A light combat vehicle that first saw production in 2692] the Galleon proved to be an economical means of supporting infantry and BattleMechs. + + + +No information available on this variant + + + +Despite this, the vehicle served well during the Amaris Civil War, and after the Exodus, these tracked vehicles mostly fell into the possession of the Draconis Combine and the Free Worlds League. The Galleon is often paired with the Harasser Missile Platform. + + + +Brooks Incorporated + + + +Amity + + + +ENGINE:GTEM 180 Fuel Cell +ARMOR:Unknown +COMMUNICATIONS:Maxell 500 +TARGETING:Maxell TA50 + + + +Rec Guide:ilClan #27 - Dark Age + + + +30.0 + + diff --git a/megamek/data/mechfiles/vehicles/ilClan Rec Guides/Vol 27 - Jan 25/Galleon Light Tank GAL-106.blk b/megamek/data/mechfiles/vehicles/ilClan Rec Guides/Vol 27 - Jan 25/Galleon Light Tank GAL-106.blk new file mode 100644 index 00000000000..0cdbb408817 --- /dev/null +++ b/megamek/data/mechfiles/vehicles/ilClan Rec Guides/Vol 27 - Jan 25/Galleon Light Tank GAL-106.blk @@ -0,0 +1,132 @@ +#building block data file + +1 + + +##Write the version number just in case... + +MAM0 + + + +Tank + + + +Galleon Light Tank + + + +GAL-106 + + + +9336 + + + +3106 + + + +3106 + + + +IS Level 3 + + + +Tracked + + + + + + +8 + + + +2 + + + +4 + + + +5 + + + +11 +10 +10 +11 +14 + + + +BeagleActiveProbe +SponsonTurret + + + +ISTAG + + + +Medium Laser(ST) + + + +Medium Laser(ST) + + + + + + +Light PPC + + + +With a top speed faster than most 'Mechs, the Galleon was well-armed but lacked protection, carrying only three and a half tons of armor. + + + +A light combat vehicle that first saw production in 2692 the Galleon proved to be an economical means of supporting infantry and BattleMechs. + + + +No information on this variant + + + +Despite this, the vehicle served well during the Amaris Civil War, and after the Exodus, these tracked vehicles mostly fell into the possession of the Draconis Combine and the Free Worlds League. The Galleon is often paired with the Harasser Missile Platform. + + + +Brooks Incorporated, Maxwell Planetary Defense Consortium + + + +Andurien, Irian, Kendall (Brooks), Maxwell + + + +ENGINE:Hermes 240 XL Fusion +ARMOR:Riese-675 Hardened with CASE +COMMUNICATIONS:Maxell 500 with ECM +TARGETING:Maxell TA50 with Beagle Active Probe and TAG + + + +Rec Guide:ilClan #27 - Late Republic + + + +30.0 + + diff --git a/megamek/data/mechfiles/vehicles/ilClan Rec Guides/Vol 27 - Jan 25/Galleon Light Tank GAL-106M.blk b/megamek/data/mechfiles/vehicles/ilClan Rec Guides/Vol 27 - Jan 25/Galleon Light Tank GAL-106M.blk new file mode 100644 index 00000000000..c968f18d725 --- /dev/null +++ b/megamek/data/mechfiles/vehicles/ilClan Rec Guides/Vol 27 - Jan 25/Galleon Light Tank GAL-106M.blk @@ -0,0 +1,135 @@ +#building block data file + +1 + + +##Write the version number just in case... + +MAM0 + + + +Tank + + + +Galleon Light Tank + + + +GAL-106M + + + +9337 + + + +3140 + + + +3140 + + + +IS Level 3 + + + +Tracked + + + +troopspace:4.0 + + + +8 + + + +2 + + + +4 + + + +5 + + + +11 +10 +10 +11 +14 + + + +SponsonTurret +IS Machine Gun Ammo - Half +ISAMS Ammo +ISCASE + + + +ISAntiMissileSystem + + + +Machine Gun(ST) + + + +Machine Gun(ST) + + + + + + +ISERMediumLaser + + + +With a top speed faster than most 'Mechs, the Galleon was well-armed but lacked protection, carrying only three and a half tons of armor. + + + +A light combat vehicle that first saw production in 2692 the Galleon proved to be an economical means of supporting infantry and BattleMechs. + + + +No information on this variant + + + +Despite this, the vehicle served well during the Amaris Civil War, and after the Exodus, these tracked vehicles mostly fell into the possession of the Draconis Combine and the Free Worlds League. The Galleon is often paired with the Harasser Missile Platform. + + + +Brooks Incorporated, Maxwell Planetary Defense Consortium + + + +Andurien, Irian, Kendall (Brooks), Maxwell + + + +ENGINE:Hermes 240 XL Fusion +ARMOR:Riese-675 Hardened with CASE +COMMUNICATIONS:Maxell 500 with ECM +TARGETING:Maxell TA50 with Beagle Active Probe and TAG + + + +Rec Guide:ilClan #27 - Dark Age + + + +30.0 + + diff --git a/megamek/data/mechfiles/vehicles/ilClan Rec Guides/Vol 27 - Jan 25/Galleon Light Tank GAL-200R.blk b/megamek/data/mechfiles/vehicles/ilClan Rec Guides/Vol 27 - Jan 25/Galleon Light Tank GAL-200R.blk new file mode 100644 index 00000000000..7df9d8ba4e9 --- /dev/null +++ b/megamek/data/mechfiles/vehicles/ilClan Rec Guides/Vol 27 - Jan 25/Galleon Light Tank GAL-200R.blk @@ -0,0 +1,131 @@ +#building block data file + +1 + + +##Write the version number just in case... + +MAM0 + + + +Tank + + + +Galleon Light Tank + + + +GAL-200R + + + +9338 + + + +3081 + + + +3081 + + + +IS Level 2 + + + +Tracked + + + + + + +6 + + + +1 + + + +14 +13 +13 +14 +18 + + + +IS Machine Gun Ammo - Half + + + +RL10 +RL10 +RL10 +RL10 + + + + + + + + + + + + +Machine Gun +Machine Gun +RL20 +RL20 + + + +With a top speed faster than most 'Mechs, the Galleon was well-armed but lacked protection, carrying only three and a half tons of armor. + + + +A light combat vehicle that first saw production in 2692] the Galleon proved to be an economical means of supporting infantry and BattleMechs. + + + +No information available on this variant + + + +Despite this, the vehicle served well during the Amaris Civil War, and after the Exodus, these tracked vehicles mostly fell into the possession of the Draconis Combine and the Free Worlds League. The Galleon is often paired with the Harasser Missile Platform. + + + +Field Refit + + + +Various + + + +ENGINE:GTEM 180 +ARMOR:3/StarSlab 6 +COMMUNICATIONS:Maxell 500 +TARGETING:Maxell TA50 + + + +Rec Guide:ilClan #27 - Early Republic + + + +30.0 + + + +PETROCHEMICALS + + diff --git a/megamek/data/mechfiles/vehicles/ilClan Rec Guides/Vol 27 - Jan 25/Galleon Light Tank GAL-201.blk b/megamek/data/mechfiles/vehicles/ilClan Rec Guides/Vol 27 - Jan 25/Galleon Light Tank GAL-201.blk new file mode 100644 index 00000000000..f16769be5d6 --- /dev/null +++ b/megamek/data/mechfiles/vehicles/ilClan Rec Guides/Vol 27 - Jan 25/Galleon Light Tank GAL-201.blk @@ -0,0 +1,135 @@ +#building block data file + +1 + + +##Write the version number just in case... + +MAM0 + + + +Tank + + + +Galleon Light Tank + + + +GAL-201 + + + +9338 + + + +3135 + + + +3135 + + + +IS Level 2 + + + +Tracked + + + + + + +6 + + + +0 + + + +22 + + + +1 + + + +13 +12 +12 +12 +15 + + + +ISGuardianECMSuite +ISCASE +IS Ammo LAC/5 +ISMagshotGR Ammo +IS Vehicular Stealth +SponsonTurret + + + + + + +ISMagshotGR(ST) + + + +ISMagshotGR(ST) + + + + + + +Light Auto Cannon/5 + + + +With a top speed faster than most 'Mechs, the Galleon was well-armed but lacked protection, carrying only three and a half tons of armor. + + + +A light combat vehicle that first saw production in 2692] the Galleon proved to be an economical means of supporting infantry and BattleMechs. + + + +No information available on this variant + + + +Despite this, the vehicle served well during the Amaris Civil War, and after the Exodus, these tracked vehicles mostly fell into the possession of the Draconis Combine and the Free Worlds League. The Galleon is often paired with the Harasser Missile Platform. + + + +Field Refit + + + +Various + + + +ENGINE:GTEM 180 +ARMOR:Unknown +COMMUNICATIONS:Maxell 500 +TARGETING:Maxell TA50 with ECM + + + +Rec Guide:ilClan #27 - Dark Age + + + +30.0 + + diff --git a/megamek/data/mechfiles/vehicles/ilClan Rec Guides/Vol 27 - Jan 25/Galleon Light Tank GAL-300.blk b/megamek/data/mechfiles/vehicles/ilClan Rec Guides/Vol 27 - Jan 25/Galleon Light Tank GAL-300.blk new file mode 100644 index 00000000000..7bb6f09b70e --- /dev/null +++ b/megamek/data/mechfiles/vehicles/ilClan Rec Guides/Vol 27 - Jan 25/Galleon Light Tank GAL-300.blk @@ -0,0 +1,135 @@ +#building block data file + +1 + + +##Write the version number just in case... + +MAM0 + + + +Tank + + + +Galleon Light Tank + + + +GAL-300 + + + +9338 + + + +3101 + + + +3101 + + + +IS Level 2 + + + +Tracked + + + + + + +6 + + + +4 + + + +6 + + + +1 + + + +25 +19 +19 +19 +27 + + + +SponsonTurret +IS Ammo MML-7 LRM +IS Ammo MML-7 SRM + + + +ISMML7 + + + +ISERSmallLaser(ST) +ISMPod + + + +ISERSmallLaser(ST) +ISMPod + + + + + + +ISERMediumLaser + + + +With a top speed faster than most 'Mechs, the Galleon was well-armed but lacked protection, carrying only three and a half tons of armor. + + + +A light combat vehicle that first saw production in 2692] the Galleon proved to be an economical means of supporting infantry and BattleMechs. + + + +No information available on this variant + + + +Despite this, the vehicle served well during the Amaris Civil War, and after the Exodus, these tracked vehicles mostly fell into the possession of the Draconis Combine and the Free Worlds League. The Galleon is often paired with the Harasser Missile Platform. + + + +Maxwell-Pulaski Motors, + + + +Terra + + + +ENGINE:GTEM 180 +ARMOR:Unknown +COMMUNICATIONS:Maxell 500 +TARGETING:Maxell TA50 with ECM + + + +Rec Guide:ilClan #27 - Late Republic + + + +30.0 + + diff --git a/megamek/data/mechfiles/vehicles/3025 IS Land/Falcon Hover Tank.blk b/megamek/data/mechfiles/vehicles/ilClan Rec Guides/Vol 27 - Jan 25/Hawk Hover Tank (LTV-4).blk similarity index 60% rename from megamek/data/mechfiles/vehicles/3025 IS Land/Falcon Hover Tank.blk rename to megamek/data/mechfiles/vehicles/ilClan Rec Guides/Vol 27 - Jan 25/Hawk Hover Tank (LTV-4).blk index dccee8aa058..47ade995f6e 100644 --- a/megamek/data/mechfiles/vehicles/3025 IS Land/Falcon Hover Tank.blk +++ b/megamek/data/mechfiles/vehicles/ilClan Rec Guides/Vol 27 - Jan 25/Hawk Hover Tank (LTV-4).blk @@ -3,7 +3,7 @@ 1 -# Write the version number just in case... +##Write the version number just in case... MAM0 @@ -13,21 +13,25 @@ Tank -Falcon Hover Tank +Hawk Hover Tank -(Standard) +(LTV-4) -4154 +5587 -3023 +2470 + +2470 + + IS Level 1 @@ -36,8 +40,11 @@ IS Level 1 Hover + + + -9 +7 @@ -52,12 +59,8 @@ Hover 16 - -1 - - -IS Ammo SRM-6 +IS Ammo SRM-4 @@ -73,11 +76,23 @@ IS Ammo SRM-6 -Medium Laser -SRM 6 -SRM 6 +PPC +SRM 4 + +Experimental until 2470. Originally known as the LTV-4 Hover Tank in XTRO: Primitives Vol 2. + + + +Rec Guide:ilClan #27 - Age of War + + 50.0 + + +PETROCHEMICALS + + diff --git a/megamek/data/mechfiles/vehicles/ilClan Rec Guides/Vol 27 - Jan 25/Kamisori Light Tank A.blk b/megamek/data/mechfiles/vehicles/ilClan Rec Guides/Vol 27 - Jan 25/Kamisori Light Tank A.blk new file mode 100644 index 00000000000..63497532b44 --- /dev/null +++ b/megamek/data/mechfiles/vehicles/ilClan Rec Guides/Vol 27 - Jan 25/Kamisori Light Tank A.blk @@ -0,0 +1,130 @@ +#building block data file + +1 + + +##Write the version number just in case... + +MAM0 + + + +Tank + + + +Kamisori Light Tank + + + +A + + + +9332 + + + +3103 + + + +3103 + + + +IS Level 2 + + + +Tracked + + + +BattleArmorHandles - troopers:-1 + + + +6 + + + +0 + + + +6 + + + +1 + + + +1 + + + +30 +20 +20 +10 +29 + + + +ISTargeting Computer:OMNI + + + + + + + + + + + + + + + +Light PPC:OMNI +PPC Capacitor:OMNI + + + +The Kamisori has a modular turret that can accommodate one larger weapon and has the same payload and armor as a Galleon. Militias can manage with fewer tanks and IFVs thanks to the tank's versatile Omni structure. + + + +Pesht Motors + + + +Unity + + + +ENGINE:GM 120 Fusion +ARMOR:New Samarkand Royal Heavy Ferro-Fibrous +COMMUNICATIONS:Neil 500 +TARGETING:Matabushi Stalker + + + +Rec Guide:ilClan #27 - Late Republic + + + +20.0 + + + +0.5 + + + +0.0 + + diff --git a/megamek/data/mechfiles/vehicles/ilClan Rec Guides/Vol 27 - Jan 25/Kamisori Light Tank B.blk b/megamek/data/mechfiles/vehicles/ilClan Rec Guides/Vol 27 - Jan 25/Kamisori Light Tank B.blk new file mode 100644 index 00000000000..97ec47c4fd8 --- /dev/null +++ b/megamek/data/mechfiles/vehicles/ilClan Rec Guides/Vol 27 - Jan 25/Kamisori Light Tank B.blk @@ -0,0 +1,129 @@ +#building block data file + +1 + + +##Write the version number just in case... + +MAM0 + + + +Tank + + + +Kamisori Light Tank + + + +B + + + +9333 + + + +3103 + + + +3103 + + + +IS Level 2 + + + +Tracked + + + +BattleArmorHandles - troopers:-1 + + + +6 + + + +0 + + + +6 + + + +1 + + + +1 + + + +30 +20 +20 +10 +29 + + + +Supercharger:OMNI + + + + + + + + + + + + + + + +ISMediumVSPLaser:OMNI + + + +The Kamisori has a modular turret that can accommodate one larger weapon and has the same payload and armor as a Galleon. Militias can manage with fewer tanks and IFVs thanks to the tank's versatile Omni structure. + + + +Pesht Motors + + + +Unity + + + +ENGINE:GM 120 Fusion +ARMOR:New Samarkand Royal Heavy Ferro-Fibrous +COMMUNICATIONS:Neil 500 +TARGETING:Matabushi Stalker + + + +Rec Guide:ilClan #27 - Late Republic + + + +20.0 + + + +0.5 + + + +0.0 + + diff --git a/megamek/data/mechfiles/vehicles/ilClan Rec Guides/Vol 27 - Jan 25/Kamisori Light Tank C.blk b/megamek/data/mechfiles/vehicles/ilClan Rec Guides/Vol 27 - Jan 25/Kamisori Light Tank C.blk new file mode 100644 index 00000000000..32e980e4578 --- /dev/null +++ b/megamek/data/mechfiles/vehicles/ilClan Rec Guides/Vol 27 - Jan 25/Kamisori Light Tank C.blk @@ -0,0 +1,131 @@ +#building block data file + +1 + + +##Write the version number just in case... + +MAM0 + + + +Tank + + + +Kamisori Light Tank + + + +C + + + +9334 + + + +3103 + + + +3103 + + + +IS Level 2 + + + +Tracked + + + +BattleArmorHandles - troopers:-1 + + + +6 + + + +0 + + + +6 + + + +1 + + + +1 + + + +30 +20 +20 +10 +29 + + + +ISC3SlaveUnit:OMNI +BeagleActiveProbe:OMNI +ISGuardianECMSuite:OMNI + + + + + + + + + + + + + + + +ISERMediumLaser:OMNI + + + +The Kamisori has a modular turret that can accommodate one larger weapon and has the same payload and armor as a Galleon. Militias can manage with fewer tanks and IFVs thanks to the tank's versatile Omni structure. + + + +Pesht Motors + + + +Unity + + + +ENGINE:GM 120 Fusion +ARMOR:New Samarkand Royal Heavy Ferro-Fibrous +COMMUNICATIONS:Neil 500 +TARGETING:Matabushi Stalker + + + +Rec Guide:ilClan #27 - Late Republic + + + +20.0 + + + +0.5 + + + +0.0 + + diff --git a/megamek/data/mechfiles/vehicles/ilClan Rec Guides/Vol 27 - Jan 25/Kamisori Light Tank Prime.blk b/megamek/data/mechfiles/vehicles/ilClan Rec Guides/Vol 27 - Jan 25/Kamisori Light Tank Prime.blk new file mode 100644 index 00000000000..e4b1b4c7cbf --- /dev/null +++ b/megamek/data/mechfiles/vehicles/ilClan Rec Guides/Vol 27 - Jan 25/Kamisori Light Tank Prime.blk @@ -0,0 +1,128 @@ +#building block data file + +1 + + +##Write the version number just in case... + +MAM0 + + + +Tank + + + +Kamisori Light Tank + + + +Prime + + + +9331 + + + +3103 + + + +3103 + + + +IS Level 2 + + + +Tracked + + + +BattleArmorHandles - troopers:-1 + + + +6 + + + +0 + + + +6 + + + +1 + + + +1 + + + +30 +20 +20 +10 +29 + + + + + + + + + + + + + + + + + + +Large Laser:OMNI + + + +The Kamisori has a modular turret that can accommodate one larger weapon and has the same payload and armor as a Galleon. Militias can manage with fewer tanks and IFVs thanks to the tank's versatile Omni structure. + + + +Pesht Motors + + + +Unity + + + +ENGINE:GM 120 Fusion +ARMOR:New Samarkand Royal Heavy Ferro-Fibrous +COMMUNICATIONS:Neil 500 +TARGETING:Matabushi Stalker + + + +Rec Guide:ilClan #27 - Late Republic + + + +20.0 + + + +0.5 + + + +0.0 + + diff --git a/megamek/data/mechfiles/vehicles/ilClan Rec Guides/Vol 27 - Jan 25/Kamisori Light Tank R.blk b/megamek/data/mechfiles/vehicles/ilClan Rec Guides/Vol 27 - Jan 25/Kamisori Light Tank R.blk new file mode 100644 index 00000000000..cb3e391ad4a --- /dev/null +++ b/megamek/data/mechfiles/vehicles/ilClan Rec Guides/Vol 27 - Jan 25/Kamisori Light Tank R.blk @@ -0,0 +1,130 @@ +#building block data file + +1 + + +##Write the version number just in case... + +MAM0 + + + +Tank + + + +Kamisori Light Tank + + + +R + + + +9335 + + + +3103 + + + +3103 + + + +Mixed (IS Chassis) + + + +Tracked + + + +BattleArmorHandles - troopers:-1 + + + +6 + + + +0 + + + +6 + + + +1 + + + +1 + + + +30 +20 +20 +10 +29 + + + +CLPlasmaCannonAmmo:OMNI +CLPlasmaCannonAmmo:OMNI + + + + + + + + + + + + + + + +CLPlasmaCannon:OMNI + + + +The Kamisori has a modular turret that can accommodate one larger weapon and has the same payload and armor as a Galleon. Militias can manage with fewer tanks and IFVs thanks to the tank's versatile Omni structure. + + + +Pesht Motors + + + +Unity + + + +ENGINE:GM 120 Fusion +ARMOR:New Samarkand Royal Heavy Ferro-Fibrous +COMMUNICATIONS:Neil 500 +TARGETING:Matabushi Stalker + + + +Rec Guide:ilClan #27 - Late Republic + + + +20.0 + + + +0.5 + + + +0.0 + + diff --git a/megamek/data/mechfiles/vehicles/ilClan Rec Guides/Vol 27 - Jan 25/Patton Tank (Taurian).blk b/megamek/data/mechfiles/vehicles/ilClan Rec Guides/Vol 27 - Jan 25/Patton Tank (Taurian).blk new file mode 100644 index 00000000000..1278d7c65c1 --- /dev/null +++ b/megamek/data/mechfiles/vehicles/ilClan Rec Guides/Vol 27 - Jan 25/Patton Tank (Taurian).blk @@ -0,0 +1,135 @@ +#building block data file + +1 + + +##Write the version number just in case... + +MAM0 + + + +Tank + + + +Patton Tank + + + +(Taurian) + + + +9343 + + + +3115 + + + +3115 + + + +IS Level 2 + + + +Tracked + + + + + + +4 + + + +0 + + + +6 + + + +1 + + + +50 +44 +44 +40 +50 + + + +Supercharger +IS LB 10-X AC Ammo +IS LB 10-X AC Ammo +IS LB 10-X Cluster Ammo +IS Ammo LRM-5 + + + +ISERMediumLaser + + + + + + + + + +Flamer + + + +ISLBXAC10 +LRM 5 + + + +The Patton mounts an AC/10, giving it twice the ammunition capacity and superior firing range while also enabling it to be fitted with more armor. The Patton is capable of fighting in short-ranged and urban environments, but is far more suited than the Rommel to engaging targets at medium to long range. + + + +The Patton tank is a 65-ton armored combat vehicle, specializing in conventional armored warfare. Identical to its twin, the Rommel, in every way but armament and armor configuration, the Patton has primarily served with the Lyran Commonwealth and the Lyran Alliance. + + + +No information on this variant + + + +Designed concurrently with the Rommel, Defiance Industries decided that a vehicle to replace 'Mechs was needed in the early 3000s. Since 'Mech production was nearly at a standstill, the ability to produce and field armored vehicles became a necessity no Successor State could ignore. + + + +Unknown + + + +Unknown + + + +ENGINE:Magna 260 +ARMOR:Durallex Heavy +COMMUNICATIONS:TharHes Muse 54-58K +TARGETING:TharHes Mars5 + + + +Rec Guide:ilClan #27 - Late Republic + + + +65.0 + + diff --git a/megamek/data/mechfiles/vehicles/ilClan Rec Guides/Vol 27 - Jan 25/Patton Tank (XL).blk b/megamek/data/mechfiles/vehicles/ilClan Rec Guides/Vol 27 - Jan 25/Patton Tank (XL).blk new file mode 100644 index 00000000000..6b3d8df96c0 --- /dev/null +++ b/megamek/data/mechfiles/vehicles/ilClan Rec Guides/Vol 27 - Jan 25/Patton Tank (XL).blk @@ -0,0 +1,138 @@ +#building block data file + +1 + + +##Write the version number just in case... + +MAM0 + + + +Tank + + + +Patton Tank + + + +(XL) + + + +9344 + + + +3120 + + + +3120 + + + +IS Level 2 + + + +Tracked + + + + + + +4 + + + +2 + + + +1 + + + +1 + + + +51 +46 +46 +38 +51 + + + +ISTargeting Computer +ISCASE +IS Ultra AC/10 Ammo +IS Ultra AC/10 Ammo +IS Ultra AC/10 Ammo +IS Ammo MML-5 LRM Artemis-capable +IS Ammo MML-5 SRM Artemis-capable + + + +ISMediumXPulseLaser + + + + + + + + + +Flamer + + + +ISUltraAC10 +ISMML5 +ISArtemisIV + + + +The Patton mounts an AC/10, giving it twice the ammunition capacity and superior firing range while also enabling it to be fitted with more armor. The Patton is capable of fighting in short-ranged and urban environments, but is far more suited than the Rommel to engaging targets at medium to long range. + + + +The Patton tank is a 65-ton armored combat vehicle, specializing in conventional armored warfare. Identical to its twin, the Rommel, in every way but armament and armor configuration, the Patton has primarily served with the Lyran Commonwealth and the Lyran Alliance. + + + +No information on this variant + + + +Designed concurrently with the Rommel, Defiance Industries decided that a vehicle to replace 'Mechs was needed in the early 3000s. Since 'Mech production was nearly at a standstill, the ability to produce and field armored vehicles became a necessity no Successor State could ignore. + + + +Unknown + + + +Unknown + + + +ENGINE:Magna 260 +ARMOR:Durallex Heavy +COMMUNICATIONS:TharHes Muse 54-58K +TARGETING:TharHes Mars5 + + + +Rec Guide:ilClan #27 - Late Republic + + + +65.0 + + diff --git a/megamek/data/unit_roles.txt b/megamek/data/unit_roles.txt index f3ba0469585..b19b89a19d3 100644 --- a/megamek/data/unit_roles.txt +++ b/megamek/data/unit_roles.txt @@ -1282,7 +1282,7 @@ Condor Heavy Hover Tank (Laser):STRIKER Condor Heavy Hover Tank (Liao):STRIKER Condor Heavy Hover Tank (Standard):STRIKER Condor Heavy Hover Tank (Upgrade) (Laser):MISSILE_BOAT -Condor Heavy Hover Tank (Upgrade) (Standard):MISSILE_BOAT +Condor Heavy Hover Tank (Upgrade):MISSILE_BOAT Condor Multi-Purpose Tank (Reactive):STRIKER Condor Multi-Purpose Tank (Standard):STRIKER Condottiere Assault Craft (Standard):NONE @@ -4328,7 +4328,7 @@ Mobile Long Tom Artillery Ammunition Trailer LT-MOB-25:NONE Mobile Long Tom Artillery Support Carriage LT-MOB-25:NONE Model 96 'Elephant' (Standard):NONE Model 96 'Elephant' Mk I:NONE -Model 96C “Howdah†SDS Command Ship:NONE +Model 96C 'Howdah' SDS Command Ship:NONE Model 97 'Octopus' (3051):NONE Molniya Corvette (2951):NONE Moltke MBT M1:SNIPER @@ -7511,3 +7511,84 @@ Motorized Platoon, Taurian (MG):AMBUSHER Motorized Platoon, Taurian (Rifle):AMBUSHER Motorized Platoon, Taurian (SRM):AMBUSHER Motorized Platoon, Taurian (LRM):AMBUSHER +Kamisori Light Tank Prime:SCOUT +Kamisori Light Tank A:SNIPER +Kamisori Light Tank B:SCOUT +Kamisori Light Tank C:SCOUT +Kamisori Light Tank R:SCOUT +Galleon Light Tank GAL-106:SCOUT +Galleon Light Tank GAL-106M:SCOUT +Galleon Light Tank GAL-200R:AMBUSHER +Galleon Light Tank GAL-201:SCOUT +Galleon Light Tank GAL-300:STRIKER +Galleon Light Tank C:STRIKER +Buzzard Hover Tank :STRIKER +Falcon Hover Tank :STRIKER +Hawk Hover Tank (LTV-4):STRIKER +Axel Heavy Tank IIC :BRAWLER +Axel Heavy Tank IIC (XL):BRAWLER +Patton Tank (Taurian):BRAWLER +Patton Tank (Ultra):BRAWLER +Patton Tank (XL):BRAWLER +Phantom T:SCOUT +Phantom F:STRIKER +Phantom G:SCOUT +Phantom I:SCOUT +Phantom J:STRIKER +Phantom K:SNIPER +Phantom L:SCOUT +Phantom R:STRIKER +Nightsky NGS-7S:STRIKER +Penetrator PTR-8D:BRAWLER +Gunslinger GUN-3ERD:JUGGERNAUT +Condor Heavy Hover Tank (Ultra):STRIKER +Condor Heavy Hover Tank (Fusion):STRIKER +Condor Heavy Hover Tank (Laser):STRIKER +Condor Heavy Hover Tank (LAC):STRIKER +Condor Heavy Hover Tank C:STRIKER +Maxim Heavy Hover Transport (Escort):STRIKER +Flea FLE-21:STRIKER +Hermes II HER-7A:SNIPER +Starslayer STY-4C:SKIRMISHER +Merlin MLN-1D:SNIPER +Merlin MLN-1E:SNIPER +Merlin MLN-1P:JUGGERNAUT +Merlin C:BRAWLER +Quickdraw QKD-9G:SKIRMISHER +Caesar CES-5R:BRAWLER +Naga II Prime:BRAWLER +Naga II A:BRAWLER +Naga II B:MISSILE_BOAT +Naga II C:BRAWLER +Naga II H:BRAWLER +Naga II W:SNIPER +Kamisori Light Tank Prime:SCOUT +Kamisori Light Tank A:SNIPER +Kamisori Light Tank B:SCOUT +Kamisori Light Tank C:SCOUT +Kamisori Light Tank R:SCOUT +Galleon Light Tank GAL-106:SCOUT +Galleon Light Tank GAL-106M:SCOUT +Galleon Light Tank GAL-200R:AMBUSHER +Galleon Light Tank GAL-201:SCOUT +Galleon Light Tank GAL-300:STRIKER +Galleon Light Tank C:STRIKER +Buzzard Hover Tank :STRIKER +Falcon Hover Tank :STRIKER +Hawk Hover Tank (LTV-4):STRIKER +Axel Heavy Tank IIC :BRAWLER +Axel Heavy Tank IIC (XL):BRAWLER +Patton Tank (Taurian):BRAWLER +Patton Tank (Ultra):BRAWLER +Patton Tank (XL):BRAWLER +Phantom T:SCOUT +Phantom F:STRIKER +Phantom G:SCOUT +Phantom I:SCOUT +Phantom J:STRIKER +Phantom K:SNIPER +Phantom L:SCOUT +Phantom R:STRIKER +Nightsky NGS-7S:STRIKER +Penetrator PTR-8D:BRAWLER +Gunslinger GUN-3ERD:JUGGERNAUT diff --git a/megamek/docs/OfficialUnitList.txt b/megamek/docs/OfficialUnitList.txt index 5dcfe55b5fa..92218e767b1 100644 --- a/megamek/docs/OfficialUnitList.txt +++ b/megamek/docs/OfficialUnitList.txt @@ -1221,7 +1221,7 @@ Lee (Aerospace Carrier)| Lee (Armor Carrier)| Lee (BattleMech Carrier)| Drone M-3| -Model 96C “Howdah†SDS Command Ship| +Model 96C “Howdah” SDS Command Ship| Pueblo (2673)| Jumbo (Standard)| Polaris (Standard)| @@ -2919,7 +2919,7 @@ Assault Commando Ebon Magistrate Shock Troops| Field Medic Magistracy Medical Corp| Foot Infantry Raventhir's Infantry Guard| Heavy Mountain Infantry Cavalier 'Mountain Men' Infantry Guard; Magistracy Cavaliers| -Skaret Assassins JàrnFòlk| +Skaret Assassins JàrnFòlk| Ceremonial Guard Caesar's Royal Guard; Marion Hegemony| Pirate Lady Death's 'Pacification' Squads| Foot Ballistic Rifle Hastati V| @@ -2984,6 +2984,24 @@ Mechanized Wheeled Platoon (Rifle AA)| Motorized Platoon (Rifle AA)| Foot Platoon (Flechette)| Motorized Platoon (Flechette)| +Foot Platoon, Taurian (Flamer)| +Foot Platoon, Taurian (Laser)| +Foot Platoon, Taurian (LRM)| +Foot Platoon, Taurian (MG)| +Foot Platoon, Taurian (Rifle)| +Foot Platoon, Taurian (SRM)| +Jump Platoon, Taurian (Flamer)| +Jump Platoon, Taurian (Laser)| +Jump Platoon, Taurian (LRM)| +Jump Platoon, Taurian (MG)| +Jump Platoon, Taurian (Rifle)| +Jump Platoon, Taurian (SRM)| +Motorized Platoon, Taurian (Flamer)| +Motorized Platoon, Taurian (Laser)| +Motorized Platoon, Taurian (LRM)| +Motorized Platoon, Taurian (MG)| +Motorized Platoon, Taurian (Rifle)| +Motorized Platoon, Taurian (SRM)| Field Gun Infantry Platoon (AC/10) (Standard)| Clan Foot Point (Anti-'Mech) (Flamer)| Clan Foot Point (Anti-'Mech) (Laser)| @@ -4161,7 +4179,6 @@ Pouncer B| Pouncer C| Pouncer D| Pouncer E| -Pouncer F| Pouncer H| Pouncer Prime| Prometheus (Standard)| @@ -4295,7 +4312,6 @@ Cestus CTS-7A| Chameleon CLN-7V| Chameleon CLN-7W| Chameleon CLN-7Z| -Chameleon TRC-4B| Crossbow A| Crossbow B| Crossbow C| @@ -6533,6 +6549,17 @@ Atlas II AS7-DK-H| Flashman FLS-10E| Grand Dragon DRG-12K| Stalker STK-9F| +Chameleon CLN-8V| +Chameleon CLN-9V| +Chameleon TRC-4B| +Pouncer F| +Pouncer G| +Pouncer I| +Pouncer T| +Pouncer W| +Pouncer X| +Vindicator VND-7L| +Wraith TR5| BattleMaster BLR-3M-DC| BattleMaster BLR-6C| BattleMaster BLR-6G| @@ -6723,6 +6750,11 @@ Stealth STH-1D (Anna)| Thanatos TNS-4S (Felix)| Wolf Trap (Tora) WFT-1 (Daitama)| Templar III TLR2-J 'Arthur'| +Hel HL-1| +Hel HL-2| +Tiburon 2| +Toro TR-B-12| +Toro TR-B-9| Centurion CN10-J| Centurion CN10-W| Gyrfalcon 5| @@ -7624,10 +7656,6 @@ Challenger MBT X| Challenger MBT XI| Challenger MBT XII| Condor Heavy Hover Tank (Laser)| -Demolisher Heavy Tank (Arrow IV)| -Demolisher Heavy Tank (Clan)| -Demolisher Heavy Tank (Gauss)| -Demolisher Heavy Tank (MRM)| Drillson Heavy Hover Tank (ERLL)| Drillson Heavy Hover Tank (Streak)| Fulcrum Heavy Hovertank II| @@ -8159,7 +8187,7 @@ Zibler Fast Strike Tank (D)| Zibler Fast Strike Tank (Prime)| Cizin Hover Tank (Standard)| Cizin Hover Tank (Support)| -Kamakiri Attack VTOL (Gauss)| +Kamakiri Attack VTOL (Gauss) 'Shi Kamakiri'| Kamakiri Attack VTOL (Standard)| Mamono IFV (Standard)| Narukami Heavy Tank NK-1C| @@ -8359,6 +8387,17 @@ Sleipnir APC Tank (SRM)| Sleipnir APC Tank (Standard)| Vargr APC Tank (LRM)| Vargr APC Tank (Standard)| +Bulldog Medium Tank (Chemical)| +Bulldog Medium Tank (ERLL)| +Bulldog Medium Tank (LB-X)| +Bulldog Medium Tank (Plasma)| +Demolisher Heavy Tank (Arrow IV)| +Demolisher Heavy Tank (Cell)| +Demolisher Heavy Tank (Clan)| +Demolisher Heavy Tank (Gauss)| +Demolisher Heavy Tank (MRM)| +Demolisher Heavy Tank (Reinforced)| +Pegasus Scout Hover Tank (Upgrade)| Hoverbike (Laser)| Hoverbike (MG)| Hoverbike| @@ -8622,7 +8661,7 @@ Hwacha Urban Combat Vehicle HW1| Nike Air Defense Platform (Standard)| White Tip Submarine (Standard)| Centipede Scout Car Commando| -Demolisher Heavy Tank II-X| +Demolisher II Heavy Tank II-X| Rommel Tank (Howitzer) Prototype| Buffalo Drone Bomb (Standard)| Condor Heavy Hover Tank (Fission)| diff --git a/megamek/docs/history.txt b/megamek/docs/history.txt index 0cc6b9dd1d9..bed6f4a5b1a 100644 --- a/megamek/docs/history.txt +++ b/megamek/docs/history.txt @@ -1,7 +1,22 @@ VERSION HISTORY: ---------------- -0.49.11-SNAPSHOT -+ Issue #3776 - Add 0 as a selectable weapon/equipment quantity in advanced search +0.49.12-SNAPSHOT ++ PR #4062: Add OS Thunderbolts ++ Issue #2652: TacOps BA crits ++ Issue #2945: RHS failure chance errata ++ PRs/Issues #4070, #4069, #4065, #4067, #4073: Alpha Strike conversion corrections (see Issue #3961) ++ Issue #4028: Update altitude bomb scatter handling to current errata (by MoF); + BA micro bomb attacks now use gunnery and only scatter one space per TW p228 ++ PR #4077: Fix SmallCraft and DropShip landing lengths ++ Data: Rec Guide 27 and other unit fixes. ++ Issue #4066: Incorrect item size on BA AP Gauss Rifle ++ PR #4087: Alpha Strike damage conversion will now ignore ammo weapons that lack ammo ++ PR #4084: Java 17: Manifest File Add-Opens ++ Issue #4088: Improved Autocannon/2 on ASF is listed as doing 20/0/0 damage ++ Updating XStream to 1.4.19 from 1.4.14 + +0.49.11 (2022-12-22 1500 UTC) ++ Issue #3776: Add 0 as a selectable weapon/equipment quantity in advanced search + PR #3908: Connections Rework: Logging Modernization + PR #3910: Remove unused modes from TAG weapons + PR #3929: Fix slots used by engines in Conventional Fighters @@ -19,16 +34,45 @@ VERSION HISTORY: + Issue #3959: Long last target names display properly on extra unit display panel + Issue #2757: Bulletproofing for when DFA target is eliminated prior to DFA resolution + Issue #3902: Advantages display on the bottom of unit info card -+ RFE #2715: Tooltip displays original vs modified movement due to planetary conditions -+ Data: Updated sprites and camos. Data fixes for #3962,#3913,#3907, #3905, #3933, #3867 ++ Issue #2715: Tooltip displays original vs modified movement due to planetary conditions ++ Data: Updated sprites and camos. Data fixes for #3962, #3913, #3907, #3905, #3933, #3867 + Data: TP Foster RATS #3930 - Thanks Stonewall072 -+ PR #3970 - AS conversion fixes -+ PR #3971 - Implements #3747 add option to adjust the seen by in the unit tool tip -+ PR #3972 - AS conversion fixes round 2 -+ Issue #3980 - Prototype ER Large Laser Wrong Stats for Aerospace Units -+ PR #3989 - AS Conversion fixes round 3 ++ PR #3970: AS conversion fixes ++ Issue #3414: Add option to adjust the seen by in the unit tool tip ++ PR #3972: AS conversion fixes round 2 ++ Issue #3980: Prototype ER Large Laser Wrong Stats for Aerospace Units ++ PR #3989L AS Conversion fixes round 3 + Issue #3978: Line wrap for long sensor texts in the Unit Display's sensor tab + Issue #3975: Allow the report display dialog to be always active during a game ++ PR #3997: Fixing Missing DockingCollar Handling in Unit Load ++ PR #3992: Update Alpha Strike conversion to newest errata ++ Issue #2842: Fix an issue where Thin Snow would increase MP costs for BA ++ PR #4007: Allow loading .mtf Mek files with split weapons on CT+H locations ++ Issue #3939: Prevent Null Entities in a Bay's Loaded Units ++ Issue #3984: Stuka-K5b2 data issues ++ Issue #3985: ER Small Pulse Laser Incorrect Aerospace Range ++ Issue #3906: Turn timer in seconds ++ Issue #3054: TO Infantry Movement on Pavement optional rule ++ Issue #4003, #4039, #4047: Add search functionality to the mini report dialog; configure keywords in the Client Settings ++ Issue #3818: Airborne Aerospace Units Unaffected By Extreme Temperatures ++ Issue #3727: Magma crust breakthrough and liquid magma damage not working as expected ++ Issues #543, #2959, #3982: Scale the Client GUI using the GUI scale ++ Issue #2684: Fix target being cleared when selecting a new weapon ++ PR #4015, #4036, #4037: Further Alpha Strike conversion errata and corrections ++ Issue #3375: Fix Player's Turn text not being updated in some circumstances ++ Issue #4013: Turn timer continues to run when you close the main window ++ PR #4017: Fix border move indication for vehicles ++ Issue #4022: Fixing Uncaught NPE when Address Bind is Already in Use ++ PR #3996: MMXMLUtility: Removing Deprecated Methods ++ Issue #3709: Removed searchlight customization checkboxes for units that receive external searchlights automatically ++ Issue #3811: Fix formatting issue with the Infantry victory report ++ Issue #4021: Preventing Save Game Loading Player Name NPE ++ PR #3969: Add an overlay for Planetary Conditions ++ Issue #2695: Improve game options tooltips ++ PR #4049: Player Java 17 Support ++ PR #4055: Expand FOV Highlight Disk Size Option Dimension for Display Scaling ++ PR #4057: Allow Report Display Split Pane to Resize ++ Issue #4058: Fixing Default Fluff Image Paths + Updating to Apache Commons Text 1.10.0 from 1.9 + Updating to FlatLAF 2.6 from 2.4 + Updating to Jackson XML 2.14.1 from 2.13.3 @@ -36,7 +80,7 @@ VERSION HISTORY: + Updating to JUnit 5.9.1 from 5.9.0 + Updating to Launch4j 2.5.4 from 2.5.3 + Updating to Log4j 2.19.0 from 2.18.0 -+ Updating to Mockito 4.9.0 from 4.6.1 ++ Updating to Mockito 4.10.0 from 4.6.1 0.49.10 (2022-09-12 1500 UTC) + Data: Shorten RAT names for FM3145 diff --git a/megamek/i18n/megamek/client/messages.properties b/megamek/i18n/megamek/client/messages.properties index 16477f9d36f..bf3f740e451 100644 --- a/megamek/i18n/megamek/client/messages.properties +++ b/megamek/i18n/megamek/client/messages.properties @@ -95,6 +95,9 @@ Close=Close Next=Next Previous=Previous to=to +Error=Error +FROM=from +NONE=None BT.Heat=Heat BT.Gunnery=Gunnery @@ -173,6 +176,16 @@ AdvancedOptions.MapTextColor.name=Map Text Color AdvancedOptions.WarningColor.name=Warning Color AdvancedOptions.TmmPipMode.name=TMM Pip Mode AdvancedOptions.TmmPipMode.tooltip=Show TMM value on unit: 0=No Pips 1=White Pips 2=Move Colored Pips +AdvancedOptions.PlanetaryConditionsColorTitle.name=Planetary Conditions Color Title +AdvancedOptions.PlanetaryConditionsColorText.name=Planetary Conditions Color Text +AdvancedOptions.PlanetaryConditionsColorCold.name=Planetary Conditions Color Cold +AdvancedOptions.PlanetaryConditionsColorHot.name=Planetary Conditions Color Hot +AdvancedOptions.PlanetaryConditionsColorBackground.name=Planetary Conditions Color Background +AdvancedOptions.PlanetaryConditionsShowDefaults.name=Planetary Conditions Show Default Conditions +AdvancedOptions.PlanetaryConditionsShowHeader.name=Planetary Conditions Show Header +AdvancedOptions.PlanetaryConditionsShowLabels.name=Planetary Conditions Show Labels +AdvancedOptions.PlanetaryConditionsShowValues.name=Planetary Conditions Show Values +AdvancedOptions.PlanetaryConditionsShowIndicators.name=Planetary Conditions Show Indicators AdvancedOptions.UnitToolTipSeenByResolution.name=UnitToolTip - Seen By Resolution [1=Someone,2=Team,3=Player] #Board Editor @@ -526,20 +539,31 @@ ChatLounge.AlertBot.title=Error ChatLounge.AlertExistsBot.message=That name is already used by another player or bot. Please enter a different name. ChatLounge.AlertExistsBot.title=Error ChatLounge.aboard=aboard +ChatLounge.board.generatedMessage=This board is generated using the current Generated
Map Settings when the game is started. +ChatLounge.board.randomlySelectedMessage=This board is selected randomly from the following list
of boards when the game is started:
+ChatLounge.board.serverSide=Server-side board ChatLounge.BoardSize=Board Size: {0} x {1} hexes +ChatLounge.butAdd=+ ChatLounge.butAddBot=Add Bot ChatLounge.butArmy=Create Random Army... ChatLounge.butChangeBoard=Edit / View Map... ChatLounge.butChangeStart=Change Start... ChatLounge.butConfigPlayer=Configure Player... ChatLounge.butBotSettings=Bot Settings... +ChatLounge.butCancelSearch=X +ChatLounge.butCollapse=<< ChatLounge.butCompact=Compact Display ChatLounge.butConditions=Planetary Conditions ChatLounge.butCustom=Configure Unit... ChatLounge.butDelete=Delete Unit ChatLounge.butDeleteAll=Delete All +ChatLounge.butDetach=Detach to Window ChatLounge.butDone=I'm Done +ChatLounge.butExpand=>> +ChatLounge.butForceView=Force View ChatLounge.butInit=Initiative Bonuses +ChatLounge.butGrow=> +ChatLounge.butHelp=? ChatLounge.butLoad=Add A Combat Unit... ChatLounge.butLoadCustomBA=Load Custom BA ChatLounge.butLoadCustomFS=Create Squadron @@ -553,8 +577,10 @@ ChatLounge.butNames=Random Names... ChatLounge.butRemoveBot=Remove Bot ChatLounge.butConfigurePlayer=Configure Player... ChatLounge.butSaveList=Save Unit List... +ChatLounge.butShrink=< ChatLounge.butSkills=Random Skills... ChatLounge.butShowUnitID=Show IDs +ChatLounge.butSortableView=Sortable View ChatLounge.BV=\ BV= ChatLounge.C3=C3: ChatLounge.c3i=c3i: @@ -599,6 +625,7 @@ ChatLounge.ExclusiveDeploy.msg=In Double Blind play, you cannot choose 'Any' as ChatLounge.EntityListEntry1={0} ({1}/{2} pilot {3}{4}) Class: {5}{6}{7}{8}{9}{10} ChatLounge.EntityListEntry2={0} ({1}/{2} pilot {3}{4}) {5}{6} BV={7}{8}{9}{10}{11} {12} ChatLounge.Equipment=Equipment +ChatLounge.fileNotFound=File not found. ChatLounge.GameYear=Game year: ChatLounge.GameYearLabelToolTip=The current game year, used to determine technology levels.
This value can be changed in Game Options > Allowed Units and Equipment ChatLounge.HotLoadToggleOff=Disable hotloading on all LRMs @@ -614,7 +641,9 @@ ChatLounge.InitiativeAlert.title=Team Initiative ChatLounge.Initiative=Initiative: ChatLounge.invalidDesign=Invalid design ChatLounge.labActive=Active: -ChatLounge.labBoardSize=Board Size: \# x \# hexes +ChatLounge.labBoardHeight=Board Height: +ChatLounge.labBoardSize=Board Size: +ChatLounge.labBoardWidth=Board Width: ChatLounge.labBVs.BV=Total Battle Values ChatLounge.labBVs.Tons=Total Tons ChatLounge.labBVs.Cost=Total Cost @@ -622,11 +651,14 @@ ChatLounge.labCamo=Camo: ChatLounge.labCommandDetonated=Command-detonated: ChatLounge.labConventional=Conventional: ChatLounge.labInferno=Inferno: +ChatLounge.labMapHeight=Map Height: ChatLounge.labMapSize=Map Size: \# x \# boards ChatLounge.labMapType=Map Type: +ChatLounge.labMapWidth=Map Width: ChatLounge.labMinefield=Minefields ChatLounge.labPlayerInfo=Player Setup ChatLounge.labStarts=Starting Positions +ChatLounge.labSearch=Search: ChatLounge.labTeam=Team: ChatLounge.labVibrabomb=Vibrabomb: ChatLounge.Hits=Hits: @@ -636,17 +668,31 @@ ChatLounge.MapSize=Map Size ChatLounge.MapType=Map Type: ChatLounge.MapGenerated=Generated ChatLounge.MapSurprise=Surprise +ChatLounge.map.confirmReplace=Confirm replace ChatLounge.map.loadMapSetup=Load Map Setup +ChatLounge.map.problemLoadMapSetup=There was a problem while loading the map setup! ChatLounge.map.saveMapSetup=Save Map Setup ChatLounge.map.saveMapSetupReplace=The file "{0}" already exists. Overwrite? ChatLounge.map.saveMapSetupTip=Note that for generated boards, the shown board is not saved, only the fact that it is a generated board. ChatLounge.map.invalidTip=
This board (or one of the boards in a surprise board) contains invalid hexes.
Using it may lead to errors or crashes during the game! +ChatLounge.map.problemSaving=There was a problem while saving the map setup! ChatLounge.map.serverSideTip=
This board file is present on the server but not on your computer; therefore a preview cannot be generated.
It can be used for the game map. ChatLounge.map.searchTip=Enter a search string or multiple search strings separated by semicolon (;).
The available boards will be filtered by matching the search string(s) to the file name,
directory name and board tags.
Try the following tags: +ChatLounge.map.title.mapAssemblyHelp=Map Assembly Help ChatLounge.MinefieldAlert.message=Only positive integers allowed ChatLounge.MinefieldAlert.title=Minefield ChatLounge.multipleCrew=Multiple Crewmembers ChatLounge.Name=Name: +ChatLounge.name.atmosphericMap=Atmospheric Map +ChatLounge.name.groundMap=Ground Map +ChatLounge.name.HighAltitudeMap=High Altitude Map +ChatLounge.name.lowAltitudeMap=Low Altitude Map +ChatLounge.name.playerSetup=Player Setup +ChatLounge.name.SelectMap=Select Map +ChatLounge.name.selectUnits=Select Units +ChatLounge.name.spaceMap=Space Map +ChatLounge.name.teamOverview=Team Overview +ChatLounge.name.unitSetup=Unit Setup ChatLounge.noCamo=No Camo ChatLounge.noCmdr.title=No Commander! ChatLounge.noCmdr.msg=Commander killed victory is selected but the following players don't have a commander:\n @@ -669,6 +715,7 @@ ChatLounge.TechLevelLabelToolTip=The game year game's technology level, used to ChatLounge.tooltip.techYear=The game's year and technology level together determine the available units and ammunitions.
They can be changed in Game Options > Allowed Units and Equipment. ChatLounge.Tons=\ Tons ChatLounge.Tough=Toughness: +ChatLounge.TreePath.methodRequiresEntityForce=Method requires Entity or Force object. ChatLounge.Cost=\ Cost= ChatLounge.Unknown=Unknown ChatLounge.tipPlayer=Initiative bonus: {1}
Mines: {2}
@@ -703,8 +750,10 @@ ChatLounge.teamOverview.unitSum2=Aero: ChatLounge.teamOverview.unitSum3=Infantry: ChatLounge.teamOverview.unitSum4=ProtoMeks: - +ChatterBox.entitiesAdded=Entities added.q ChatterBox.ImDone=I'm Done +ChatterBox.Megamek=MegaMek: + ChoiceDialog.ClearAll=Clear All ChoiceDialog.SelectAll=Select All @@ -726,18 +775,30 @@ CFRAPDSAssign.Message=Pick which attack the APDS on {0} will target.\n ClientGUI.BoardPopup=Board Popup... ClientGUI.ChatWindow=Accessibility Window ClientGUI.clientTitleSuffix=\ - MegaMek +ClientGUI.dialogMovementReport=Movement Report +ClientGUI.dialogTacticalGeniusReport=Tactical Genius Report +ClientGUI.descriptionMULFiles=Mul Files ClientGUI.Disconnected.message=You have become disconnected from the server. ClientGUI.Disconnected.title=Disconnected\! +ClientGUI.distance=distance: ClientGUI.errorLoadingFile=Error Loading File +ClientGUI.errorOpeningFileToSave=Error opening file to save! ClientGUI.errorSavingFile=Error Saving File +ClientGUI.errorSelectingPlayer=Error selecting player ClientGUI.FatalError.message=Could not initialise:\n ClientGUI.FatalError.message1=Could not initialise minimap:\n ClientGUI.FatalError.title=Fatal Error ClientGUI.FileSaveDialog.title=Select file to save to... ClientGUI.FileSaveServerDialog.title=Select file to save to... ClientGUI.FileSaveServerDialog.message=Please enter the filename under which the game will be saved to in the server's savegames directory. +ClientGUI.gameSaveDialogMessage=Do you want to save the game before quitting MegaMek? +ClientGUI.gameSaveFirst=Save First? ClientGUI.MechDisplay=Mech Display +ClientGUI.mechSelectorDialog=Mech Selector Dialog ClientGUI.Minimap=Minimap +ClientGUI.missilesFromAnUnknownAttacker=Missiles from unknown attacker +ClientGUI.noGhostPlayersToReplace=No ghost players to replace. +ClientGUI.noGhosts=No Ghosts ClientGUI.openUnitListFileDialog.noReinforceTitle=Must have a team assigned! ClientGUI.openUnitListFileDialog.noReinforceMessage=Players must have an assigned team in order to reinforce units!\nObservers may join a team using the /joinTeam command.\nFor more information, use /help joinTeam. ClientGUI.openUnitListFileDialog.title=Open Unit List File @@ -926,6 +987,7 @@ CommonMenuBar.viewAccessibilityWindow=Accessibility Window CommonMenuBar.viewIncGUIScale=Increase GUI Scale CommonMenuBar.viewDecGUIScale=Decrease GUI Scale CommonMenuBar.viewKeyboardShortcuts=Keyboard Shortcuts +CommonMenuBar.viewPlanetaryConditions=Planetary Conditions CommonMenuBar.ViewMenu=View CommonMenuBar.viewMinimap=Minimap CommonMenuBar.viewPlayerList=Player List @@ -988,6 +1050,7 @@ CommonSettingsDialog.nagForPSR=Confirm all movement that requires a PSR. CommonSettingsDialog.nagForWiGELanding=Confirm when WiGE does not move far enough to remain airborne. CommonSettingsDialog.pathFiderTimeLimit=Pathfinder time limit (milliseconds): CommonSettingsDialog.protoMechUnitCodes=ProtoMech unit codes: +CommonSettingsDialog.ReportKeywords=Report Keywords CommonSettingsDialog.rightDragScroll=By right-clicking on the map and dragging. CommonSettingsDialog.scrollSensitivity=Scroll sensitivity: CommonSettingsDialog.showDamageLevel=Show damage to units on the unit label @@ -1533,6 +1596,8 @@ KeyBinds.cmdNames.toggleDrawLabels=Unit Labels KeyBinds.cmdDesc.toggleDrawLabels=Toggles between displaying and not displaying unit labels KeyBinds.cmdNames.toggleKeybinds=Keybindings Display KeyBinds.cmdDesc.toggleKeybinds=Toggles the map overlay showing various key shortcuts +KeyBinds.cmdNames.togglePlanetaryConditions=Planetary Conditions Display +KeyBinds.cmdDesc.togglePlanetaryConditions=Toggles the map overlay showing Planetary Conditions KeyBinds.cmdNames.toggleHexCoords=Toggle Hex Coords KeyBinds.cmdDesc.toggleHexCoords=Toggles the map showing the coords on each hex KeyBinds.cmdNames.toggleMinimap=Toggle Minimap @@ -1578,7 +1643,6 @@ KeyBindingsDisplay.fixedBinds=Toggle Unit Display and Minimap: Mouse Button 4\nZ KeyBindingsDisplay.fixedBindsBoardEd=Zoom: Mouse Wheel\nLeft-Click: Draw Hex (replace previous terrain)\nShift + Left-Click: Draw Hex (add to previous terrain)\nCtrl + Left-Click: Draw Hex with hex elevation\nAlt + Left-Click: Eyedropper tool\nDrag-Right Mouse Button: Pan Map KeyBindingsDisplay.heading=#FFFFFFKeyboard Shortcuts - press {0} to toggle this overlay - #LOS / Ruler tool LOSDialog.inFirstHex=Unit type in the first hex: LOSDialog.InSecondHex=Unit type in the second hex: @@ -1893,9 +1957,13 @@ Minimap.NoHeightLabel=N Minimap.TotalHeightLabel=T #Mini round report display +MiniReportDisplay.Damage=Damage +MiniReportDisplay.Details=Details MiniReportDisplay.title=Round Report MiniReportDisplay.Round=Round MiniReportDisplay.Phase=Phase +MiniReportDisplay.ArrowUp=\u25B2 +MiniReportDisplay.ArrowDown=\u25BC #Assorted Movement Phase Display Text for buttons, nags, dialogs... MovementDisplay.AbandonDialog.message=Do you want to abandon this unit? @@ -2343,6 +2411,18 @@ PlanetaryConditionsDialog.header.general=General Settings PlanetaryConditionsDialog.header.weather=Weather PlanetaryConditionsDialog.header.dynamic=Dynamic Wind Settings +PlanetaryConditionsOverlay.heading=Planetary Conditions - press {0} to toggle this overlay +PlanetaryConditionsOverlay.Temperature=Temperature: +PlanetaryConditionsOverlay.Gravity=Gravity: +PlanetaryConditionsOverlay.Light=Light: +PlanetaryConditionsOverlay.AtmosphericPressure=Atmospheric Pressure: +PlanetaryConditionsOverlay.EMI=EMI: +PlanetaryConditionsOverlay.Weather=Weather: +PlanetaryConditionsOverlay.Wind=Wind: +PlanetaryConditionsOverlay.WindDirection=Wind Direction: +PlanetaryConditionsOverlay.Fog=Fog: +PlanetaryConditionsOverlay.BlowingSand=Blowing Sand: + #Lobby Player List Information PlayerListDialog.player_done=\ (Done) PlayerListDialog.player_ghost=\ [Ghost] @@ -2947,6 +3027,8 @@ RandomNameDialog.lblHistoricalEthnicity.toolTipText=This will generate a random ReportDisplay.Done=Done ReportDisplay.Reroll=Reroll ReportDisplay.Details=Details +ReportDisplay.Round=Round +ReportDisplay.Phase=Phase #Ruler Ruler.Close=Close @@ -3655,6 +3737,7 @@ MegaMek.MapEditor.label=Map Editor MegaMek.SaveGameDialog.title=Select saved game MegaMek.LoadGameAlert.title=Load a Game MegaMek.LoadGameAlert.message=Error: unable to load game file "%s" +MegaMek.LoadGameMissingVersion.message=Error: MegaMek does not support version migration, and thus cannot load a save file missing a version into %s. MegaMek.LoadGameIncorrectVersion.message=Error: MegaMek does not support version migration, and thus cannot load a save file from %s into %s. MegaMek.HostGameAlert.title=Host a Game MegaMek.HostDialog.title=Start Game @@ -3666,7 +3749,6 @@ MegaMek.ScenarioDialog.title=Set Scenario Players MegaMek.ScenarioDialog.me=Me MegaMek.ScenarioDialog.otherh=Other Human MegaMek.ScenarioDialog.bot=Princess -MegaMek.ScenarioDialog.otherbot=Test Bot (Do not use) MegaMek.ScenarioDialog.Camo=Camo MegaMek.SkinEditor.label=Skin Editor MegaMek.NoCamoBtn=No Camo diff --git a/megamek/i18n/megamek/common/messages.properties b/megamek/i18n/megamek/common/messages.properties index 76689d4629d..a0772661a5b 100644 --- a/megamek/i18n/megamek/common/messages.properties +++ b/megamek/i18n/megamek/common/messages.properties @@ -201,51 +201,105 @@ HexTarget.Extinguish=\ (Extinguish) HexTarget.Ignite=\ (Ignite) HexTarget.Screen=\ (Screen) HexTarget.Tag=\ (Tag) -PlanetaryConditions.None=None -PlanetaryConditions.Daylight=Daylight -PlanetaryConditions.Dusk=Dusk/Dawn -PlanetaryConditions.Full\ Moon\ Night=Full Moon Night -PlanetaryConditions.Moonless\ Night=Moonless Night -PlanetaryConditions.Pitch\ Black=Pitch Black -PlanetaryConditions.Light\ Rain=Light Rain -PlanetaryConditions.Moderate\ Rain=Moderate Rain -PlanetaryConditions.Heavy\ Rain=Heavy Rain -PlanetaryConditions.Gusting\ Rain=Gusting Rain -PlanetaryConditions.Torrential\ Downpour=Torrential Downpour -PlanetaryConditions.Light\ Snowfall=Light Snowfall -PlanetaryConditions.Moderate\ Snowfall=Moderate Snowfall -PlanetaryConditions.Heavy\ Snowfall=Heavy Snowfall -PlanetaryConditions.Sleet=Sleet -PlanetaryConditions.Snow\ Flurries=Snow Flurries -PlanetaryConditions.Blizzard=Blizzard -PlanetaryConditions.Ice\ Storm=Ice Storm -PlanetaryConditions.Light\ Hail=Light Hail -PlanetaryConditions.Heavy\ Hail=Heavy Hail -PlanetaryConditions.Calm=Calm -PlanetaryConditions.Clear=Clear -PlanetaryConditions.Light\ Gale=Light Gale -PlanetaryConditions.Moderate\ Gale=Moderate Gale -PlanetaryConditions.Strong\ Gale=Strong Gale -PlanetaryConditions.Storm=Storm -PlanetaryConditions.Tornado\ F1-F3=Tornado F1-F3 -PlanetaryConditions.Tornado\ F4=Tornado F4 -PlanetaryConditions.Vacuum=Vacuum -PlanetaryConditions.Trace=Trace -PlanetaryConditions.Thin=Thin -PlanetaryConditions.Standard=Standard -PlanetaryConditions.High=High -PlanetaryConditions.Very\ High=Very High -PlanetaryConditions.Light\ Fog=Light Fog -PlanetaryConditions.Heavy\ Fog=Heavy Fog -PlanetaryConditions.RandomWindDirection=Random -PlanetaryConditions.North=North -PlanetaryConditions.Northeast=Northeast -PlanetaryConditions.Southeast=Southeast -PlanetaryConditions.South=South -PlanetaryConditions.Southwest=Southwest -PlanetaryConditions.Northwest=Northwest -PlanetaryConditions.ExtremeHeat=Extreme Heat -PlanetaryConditions.ExtremeCold=Extreme Cold +PlanetaryConditions.DisplayableName.Light.Daylight=Daylight +PlanetaryConditions.DisplayableName.Light.Dusk=Dusk/Dawn +PlanetaryConditions.DisplayableName.Light.Full\ Moon\ Night=Full Moon Night +PlanetaryConditions.DisplayableName.Light.Moonless\ Night=Moonless Night +PlanetaryConditions.DisplayableName.Light.Pitch\ Black=Pitch Black +PlanetaryConditions.DisplayableName.Weather.Clear=Clear +PlanetaryConditions.DisplayableName.Weather.Light\ Rain=Light Rain +PlanetaryConditions.DisplayableName.Weather.Moderate\ Rain=Moderate Rain +PlanetaryConditions.DisplayableName.Weather.Heavy\ Rain=Heavy Rain +PlanetaryConditions.DisplayableName.Weather.Gusting\ Rain=Gusting Rain +PlanetaryConditions.DisplayableName.Weather.Torrential\ Downpour=Torrential Downpour +PlanetaryConditions.DisplayableName.Weather.Light\ Snowfall=Light Snowfall +PlanetaryConditions.DisplayableName.Weather.Moderate\ Snowfall=Moderate Snowfall +PlanetaryConditions.DisplayableName.Weather.Heavy\ Snowfall=Heavy Snowfall +PlanetaryConditions.DisplayableName.Weather.Sleet=Sleet +PlanetaryConditions.DisplayableName.Weather.Snow\ Flurries=Snow Flurries +PlanetaryConditions.DisplayableName.Weather.Blizzard=Blizzard +PlanetaryConditions.DisplayableName.Weather.Ice\ Storm=Ice Storm +PlanetaryConditions.DisplayableName.Weather.Light\ Hail=Light Hail +PlanetaryConditions.DisplayableName.Weather.Heavy\ Hail=Heavy Hail +PlanetaryConditions.DisplayableName.WindStrength.Calm=Calm +PlanetaryConditions.DisplayableName.WindStrength.Light\ Gale=Light Gale +PlanetaryConditions.DisplayableName.WindStrength.Moderate\ Gale=Moderate Gale +PlanetaryConditions.DisplayableName.WindStrength.Strong\ Gale=Strong Gale +PlanetaryConditions.DisplayableName.WindStrength.Storm=Storm +PlanetaryConditions.DisplayableName.WindStrength.Tornado\ F1-F3=Tornado F1-F3 +PlanetaryConditions.DisplayableName.WindStrength.Tornado\ F4=Tornado F4 +PlanetaryConditions.DisplayableName.WindDirection.RandomWindDirection=Random +PlanetaryConditions.DisplayableName.WindDirection.North=North +PlanetaryConditions.DisplayableName.WindDirection.Northeast=Northeast +PlanetaryConditions.DisplayableName.WindDirection.Southeast=Southeast +PlanetaryConditions.DisplayableName.WindDirection.South=South +PlanetaryConditions.DisplayableName.WindDirection.Southwest=Southwest +PlanetaryConditions.DisplayableName.WindDirection.Northwest=NorthWest +PlanetaryConditions.DisplayableName.Atmosphere.Vacuum=Vacuum +PlanetaryConditions.DisplayableName.Atmosphere.Trace=Trace +PlanetaryConditions.DisplayableName.Atmosphere.Thin=Thin +PlanetaryConditions.DisplayableName.Atmosphere.Standard=Standard +PlanetaryConditions.DisplayableName.Atmosphere.High=High +PlanetaryConditions.DisplayableName.Atmosphere.Very\ High=Very High +PlanetaryConditions.DisplayableName.Fog.None=None +PlanetaryConditions.DisplayableName.Fog.Light\ Fog=Light Fog +PlanetaryConditions.DisplayableName.SandBlowing.true=Yes +PlanetaryConditions.DisplayableName.SandBlowing.false=No +PlanetaryConditions.DisplayableName.Fog.Heavy\ Fog=Heavy Fog +PlanetaryConditions.DisplayableName.Temperature.ExtremeCold=Extreme Cold +PlanetaryConditions.DisplayableName.Temperature.ExtremeHeat=Extreme Heat +PlanetaryConditions.DisplayableName.EMI.true=Yes +PlanetaryConditions.DisplayableName.EMI.false=No +PlanetaryConditions.Indicator.Light.Day=\u2600 +PlanetaryConditions.Indicator.Light.Dusk=\u263D \u263C +PlanetaryConditions.Indicator.Light.FullMoon=\u26AB +PlanetaryConditions.Indicator.Light.Moonless=\u26AA +PlanetaryConditions.Indicator.Light.PitchBlack=\u2588 +PlanetaryConditions.Indicator.Fog.None=\uD83D\uDC41 +PlanetaryConditions.Indicator.Fog.Light=\u2588 \u2022 +PlanetaryConditions.Indicator.Fog.Heavy=\u2588 \u2588 +PlanetaryConditions.Indicator.WindStrength.Calm=\u2690 +PlanetaryConditions.Indicator.WindStrength.LightGale=\u21F6 \u2022 \u2022 \u2022 +PlanetaryConditions.Indicator.WindStrength.ModGale=\u21F6 \u21F6 \u2022 \u2022 +PlanetaryConditions.Indicator.WindStrength.StrongGale=\u21F6 \u21F6 \u21F6 \u2022 +PlanetaryConditions.Indicator.WindStrength.Storm=\u21F6 \u21F6 \u21F6 \u21F6 +PlanetaryConditions.Indicator.WindStrength.TornadoF13=\uD83C\uDF2A \uD83C\uDF2A \uD83C\uDF2A \u2022 +PlanetaryConditions.Indicator.WindStrength.TornadoF4=\uD83C\uDF2A \uD83C\uDF2A \uD83C\uDF2A \uD83C\uDF2A +PlanetaryConditions.Indicator.WindDirection.North=\u2193 +PlanetaryConditions.Indicator.WindDirection.Northeast=\u2B0B +PlanetaryConditions.Indicator.WindDirection.Southeast=\u2B09 +PlanetaryConditions.Indicator.WindDirection.South=\u2191 +PlanetaryConditions.Indicator.WindDirection.Southwest=\u2B08 +PlanetaryConditions.Indicator.WindDirection.Northwest=\u2B0A +PlanetaryConditions.Indicator.WindDirection.RandomWindDirection= +PlanetaryConditions.Indicator.Weather.None=\u239A +PlanetaryConditions.Indicator.Weather.LightRain=\u2601 \u2022 \u2022 \u2022 \u2022 +PlanetaryConditions.Indicator.Weather.ModRain=\u2601 \u2601 \u2022 \u2022 \u2022 +PlanetaryConditions.Indicator.Weather.HeavyRain=\u2601 \u2601 \u2601 \u2022 \u2022 +PlanetaryConditions.Indicator.Weather.GustingRain=\u2601 \u2601 \u2601 \u2601 \u2022 +PlanetaryConditions.Indicator.Weather.Downpour=\u2601 \u2601 \u2601 \u2601 \u2601 +PlanetaryConditions.Indicator.Weather.LightSnow=\u2744 \u2022 \u2022 \u2022 +PlanetaryConditions.Indicator.Weather.ModSnow=\u2744 \u2744 \u2022 \u2022 +PlanetaryConditions.Indicator.Weather.SnowFlurries=\u2744 \u2744 \u2744 \u2022 +PlanetaryConditions.Indicator.Weather.HeavySnow=\u2744 \u2744 \u2744 \u2744 +PlanetaryConditions.Indicator.Weather.Sleet=\u26C6 \u2022 +PlanetaryConditions.Indicator.Weather.IceStorm=\u26C6 \u26C6 +PlanetaryConditions.Indicator.Atmosphere.Vacuum=\u2726 \u2727 \u2727 \u25AF \u2727 \u2727 +PlanetaryConditions.Indicator.Atmosphere.Trace=\u2726 \u2726 \u2727 \u25AF \u2727 \u2727 +PlanetaryConditions.Indicator.Atmosphere.Thin=\u2726 \u2726 \u2726 \u25AF \u2727 \u2727 +PlanetaryConditions.Indicator.Atmosphere.Standard=\u2726 \u2726 \u2726 \u25AE \u2727 \u2727 +PlanetaryConditions.Indicator.Atmosphere.High=\u2726 \u2726 \u2726 \u25AE \u2726 \u2727 +PlanetaryConditions.Indicator.Atmosphere.VHigh=\u2726 \u2726 \u2726 \u25AE \u2726 \u2726 +PlanetaryConditions.Indicator.SandBlowing.true=\uD83C\uDF2C +PlanetaryConditions.Indicator.SandBlowing.false=\uD83D\uDC41 +PlanetaryConditions.Indicator.Temperature.ExtremeCold=\u2744 +PlanetaryConditions.Indicator.Temperature.Normal=\uD83C\uDF21 +PlanetaryConditions.Indicator.Temperature.ExtremeHeat=\uD83D\uDD25 +PlanetaryConditions.Indicator.Gravity.Low=\u2B71 +PlanetaryConditions.Indicator.Gravity.Normal=\u23AF +PlanetaryConditions.Indicator.Gravity.High=\u2B73 +PlanetaryConditions.Indicator.EMI.true=\u2301 +PlanetaryConditions.Indicator.EMI.false=\u2312 UnitType.Aero=Aerospace Fighter UnitType.BattleArmor=Battle Armor UnitType.Conventional\ Fighter=Conventional Fighter diff --git a/megamek/i18n/megamek/common/messages_es.properties b/megamek/i18n/megamek/common/messages_es.properties index 4d47476293b..de1adb162e9 100644 --- a/megamek/i18n/megamek/common/messages_es.properties +++ b/megamek/i18n/megamek/common/messages_es.properties @@ -74,49 +74,49 @@ HexTarget.Extinguish=\ (Extinguir) HexTarget.Ignite=\ (Incendiar) HexTarget.Screen=\ (Pantalla) HexTarget.Tag=\ (Etiqueta) -PlanetaryConditions.None=Ninguno -PlanetaryConditions.Daylight=Luz Natural -PlanetaryConditions.Dusk=Anochecer/Amanecer -PlanetaryConditions.Full\ Moon\ Night=Noche de Luna Llena -PlanetaryConditions.Moonless\ Night=Noche sin Luna -PlanetaryConditions.Pitch\ Black=Oscuro -PlanetaryConditions.Light\ Rain= Lluvia Ligera -PlanetaryConditions.Moderate\ Rain=Lluvia Moderada -PlanetaryConditions.Heavy\ Rain=Lluvia Intensa -PlanetaryConditions.Gusting\ Rain=Rachas de Lluvia -PlanetaryConditions.Torrential\ Downpour=Aguacero Torrencial -PlanetaryConditions.Light\ Snowfall=Nevada Ligera -PlanetaryConditions.Moderate\ Snowfall=Nevada Moderada -PlanetaryConditions.Heavy\ Snowfall=Nevada Intensa -PlanetaryConditions.Sleet=Aguanieve -PlanetaryConditions.Snow\ Flurries=Rafagas de Nieve -PlanetaryConditions.Blizzard=Ventisca -PlanetaryConditions.Ice\ Storm=Tormenta de Hielo -PlanetaryConditions.Light\ Hail=Granizo Ligero -PlanetaryConditions.Heavy\ Hail=Granizo Intenso -PlanetaryConditions.Calm=Calma -PlanetaryConditions.Clear=Claro -PlanetaryConditions.Light\ Gale=Vendaval Ligero -PlanetaryConditions.Moderate\ Gale=Vendaval Moderado -PlanetaryConditions.Strong\ Gale=Vendaval Fuerte -PlanetaryConditions.Storm=Tormenta -PlanetaryConditions.Tornado\ F1-F3=Tornado F1-F3 -PlanetaryConditions.Tornado\ F4=Tornado F4 -PlanetaryConditions.Vacuum=Vacío -PlanetaryConditions.Trace=Traza -PlanetaryConditions.Thin=Ligera -PlanetaryConditions.Standard=Estándar -PlanetaryConditions.High=Alta -PlanetaryConditions.Very\ High=Muy Alta -PlanetaryConditions.Light\ Fog=Niebla Ligera -PlanetaryConditions.Heavy\ Fog=Niebla Intensa -PlanetaryConditions.RandomWindDirection=Aleatorio -PlanetaryConditions.North=Norte -PlanetaryConditions.Northeast=Noreste -PlanetaryConditions.Southeast=Sureste -PlanetaryConditions.South=Sur -PlanetaryConditions.Southwest=Suroeste -PlanetaryConditions.Northwest=Noroeste +PlanetaryConditions.DisplayableName.Light.Daylight=Luz Natural +PlanetaryConditions.DisplayableName.Light.Dusk=Anochecer/Amanecer +PlanetaryConditions.DisplayableName.Light.Full\ Moon\ Night=Noche de Luna Llena +PlanetaryConditions.DisplayableName.Light.Moonless\ Night=Noche sin Luna +PlanetaryConditions.DisplayableName.Light.Pitch\ Black=Oscuro +PlanetaryConditions.DisplayableName.Weather.Clear=Claro +PlanetaryConditions.DisplayableName.Weather.Light\ Rain= Lluvia Ligera +PlanetaryConditions.DisplayableName.Weather.Moderate\ Rain=Lluvia Moderada +PlanetaryConditions.DisplayableName.Weather.Heavy\ Rain=Lluvia Intensa +PlanetaryConditions.DisplayableName.Weather.Gusting\ Rain=Rachas de Lluvia +PlanetaryConditions.DisplayableName.Weather.Torrential\ Downpour=Aguacero Torrencial +PlanetaryConditions.DisplayableName.Weather.Light\ Snowfall=Nevada Ligera +PlanetaryConditions.DisplayableName.Weather.Moderate\ Snowfall=Nevada Moderada +PlanetaryConditions.DisplayableName.Weather.Heavy\ Snowfall=Nevada Intensa +PlanetaryConditions.DisplayableName.Weather.Sleet=Aguanieve +PlanetaryConditions.DisplayableName.Weather.Snow\ Flurries=Rafagas de Nieve +PlanetaryConditions.DisplayableName.Weather.Blizzard=Ventisca +PlanetaryConditions.DisplayableName.Weather.Ice\ Storm=Tormenta de Hielo +PlanetaryConditions.DisplayableName.Weather.Light\ Hail=Granizo Ligero +PlanetaryConditions.DisplayableName.Weather.Heavy\ Hail=Granizo Intenso +PlanetaryConditions.DisplayableName.WindStrength.Calm=Calma +PlanetaryConditions.DisplayableName.WindStrength.Light\ Gale=Vendaval Ligero +PlanetaryConditions.DisplayableName.WindStrength.Moderate\ Gale=Vendaval Moderado +PlanetaryConditions.DisplayableName.WindStrength.Strong\ Gale=Vendaval Fuerte +PlanetaryConditions.DisplayableName.WindStrength.Storm=Tormenta +PlanetaryConditions.DisplayableName.WindStrength.Tornado\ F1-F3=Tornado F1-F3 +PlanetaryConditions.DisplayableName.WindStrength.Tornado\ F4=Tornado F4 +PlanetaryConditions.DisplayableName.WindDirection.North=Norte +PlanetaryConditions.DisplayableName.WindDirection.Northeast=Noreste +PlanetaryConditions.DisplayableName.WindDirection.Southeast=Sureste +PlanetaryConditions.DisplayableName.WindDirection.South=Sur +PlanetaryConditions.DisplayableName.WindDirection.Southwest=Suroeste +PlanetaryConditions.DisplayableName.WindDirection.Northwest=Noroeste +PlanetaryConditions.DisplayableName.WindDirection.RandomWindDirection=Aleatorio +PlanetaryConditions.DisplayableName.Atmosphere.Vacuum=Vacío +PlanetaryConditions.DisplayableName.Atmosphere.Trace=Traza +PlanetaryConditions.DisplayableName.Atmosphere.Thin=Ligera +PlanetaryConditions.DisplayableName.Atmosphere.Standard=Estándar +PlanetaryConditions.DisplayableName.Atmosphere.High=Alta +PlanetaryConditions.DisplayableName.Atmosphere.Very\ High=Muy Alta +PlanetaryConditions.DisplayableName.Fog.None=Ninguno +PlanetaryConditions.DisplayableName.Fog.Light\ Fog=Niebla Ligera +PlanetaryConditions.DisplayableName.Fog.Heavy\ Fog=Niebla Intensa UnitType.Aero=Caza Aeroespacial UnitType.BattleArmor=Armadura de Combate UnitType.Conventional\ Fighter=Caza Convencional diff --git a/megamek/i18n/megamek/common/messages_ru.properties b/megamek/i18n/megamek/common/messages_ru.properties index 0964a6aa035..8c909ad29f5 100644 --- a/megamek/i18n/megamek/common/messages_ru.properties +++ b/megamek/i18n/megamek/common/messages_ru.properties @@ -43,45 +43,45 @@ HexTarget.Extinguish=\ (ПогаÑить) HexTarget.Ignite=\ (Зажечь) HexTarget.Screen=\ (ЗавеÑа) HexTarget.Tag=\ (Пометить) -PlanetaryConditions.None=Ðикакой -PlanetaryConditions.Daylight=Дневной Ñвет -PlanetaryConditions.Dusk=Закат/РаÑÑвет -PlanetaryConditions.Full\ Moon\ Night=Ðочь в полнолуние -PlanetaryConditions.Moonless\ Night=Ð‘ÐµÐ·Ð»ÑƒÐ½Ð½Ð°Ñ Ð½Ð¾Ñ‡ÑŒ -PlanetaryConditions.Pitch\ Black=ÐŸÐ¾Ð»Ð½Ð°Ñ Ñ‚ÐµÐ¼Ð½Ð¾Ñ‚Ð° -PlanetaryConditions.Light\ Rain=Легкий дождь -PlanetaryConditions.Moderate\ Rain=Дождь -PlanetaryConditions.Heavy\ Rain=Сильный дождь -PlanetaryConditions.Torrential\ Downpour=Ливень потоками -PlanetaryConditions.Light\ Snowfall=Легкий Ñнегопад -PlanetaryConditions.Moderate\ Snowfall=Снегопад -PlanetaryConditions.Heavy\ Snowfall=Сильный Ñнегопад -PlanetaryConditions.Sleet=Мокрый Ñнег -PlanetaryConditions.Ice\ Storm=Ð¡Ð½ÐµÐ¶Ð½Ð°Ñ Ð±ÑƒÑ€Ñ -PlanetaryConditions.Light\ Hail=Легкий град -PlanetaryConditions.Heavy\ Hail=Сильный град -PlanetaryConditions.Calm=Штиль -PlanetaryConditions.Clear=ЯÑно -PlanetaryConditions.Light\ Gale=Легкий ветер -PlanetaryConditions.Moderate\ Gale=Умеренный ветер -PlanetaryConditions.Strong\ Gale=Сильный ветер -PlanetaryConditions.Storm=Шторм -PlanetaryConditions.Tornado\ F1-F3=Торнадо F1-F3 -PlanetaryConditions.Tornado\ F4=Торнадо F4 -PlanetaryConditions.Vacuum=Вакуум -PlanetaryConditions.Trace=ОÑÑ‚Ð°Ñ‚Ð¾Ñ‡Ð½Ð°Ñ -PlanetaryConditions.Thin=Ð¢Ð¾Ð½ÐºÐ°Ñ -PlanetaryConditions.Standard=Ð¡Ñ‚Ð°Ð½Ð´Ð°Ñ€Ñ‚Ð½Ð°Ñ -PlanetaryConditions.High=Ð’Ñ‹ÑÐ¾ÐºÐ°Ñ -PlanetaryConditions.Very\ High=Очень выÑÐ¾ÐºÐ°Ñ -PlanetaryConditions.Light\ Fog=Легкий туман -PlanetaryConditions.Heavy\ Fog=Сильный туман -PlanetaryConditions.North=К Ñеверу -PlanetaryConditions.Northeast=К Ñеверо-воÑтоку -PlanetaryConditions.Southeast=К юго-воÑтоку -PlanetaryConditions.South=К югу -PlanetaryConditions.Southwest=К юго-западу -PlanetaryConditions.Northwest=К Ñеверо-западу +PlanetaryConditions.DisplayableName.Light.Daylight=Дневной Ñвет +PlanetaryConditions.DisplayableName.Light.Dusk=Закат/РаÑÑвет +PlanetaryConditions.DisplayableName.Light.Full\ Moon\ Night=Ðочь в полнолуние +PlanetaryConditions.DisplayableName.Light.Moonless\ Night=Ð‘ÐµÐ·Ð»ÑƒÐ½Ð½Ð°Ñ Ð½Ð¾Ñ‡ÑŒ +PlanetaryConditions.DisplayableName.Light.Pitch\ Black=ÐŸÐ¾Ð»Ð½Ð°Ñ Ñ‚ÐµÐ¼Ð½Ð¾Ñ‚Ð° +PlanetaryConditions.DisplayableName.Weather.Clear=ЯÑно +PlanetaryConditions.DisplayableName.Weather.Light\ Rain=Легкий дождь +PlanetaryConditions.DisplayableName.Weather.Moderate\ Rain=Дождь +PlanetaryConditions.DisplayableName.Weather.Heavy\ Rain=Сильный дождь +PlanetaryConditions.DisplayableName.Weather.Torrential\ Downpour=Ливень потоками +PlanetaryConditions.DisplayableName.Weather.Light\ Snowfall=Легкий Ñнегопад +PlanetaryConditions.DisplayableName.Weather.Moderate\ Snowfall=Снегопад +PlanetaryConditions.DisplayableName.Weather.Heavy\ Snowfall=Сильный Ñнегопад +PlanetaryConditions.DisplayableName.Weather.Sleet=Мокрый Ñнег +PlanetaryConditions.DisplayableName.Weather.Ice\ Storm=Ð¡Ð½ÐµÐ¶Ð½Ð°Ñ Ð±ÑƒÑ€Ñ +PlanetaryConditions.DisplayableName.Weather.Light\ Hail=Легкий град +PlanetaryConditions.DisplayableName.Weather.Heavy\ Hail=Сильный град +PlanetaryConditions.DisplayableName.WindStrength.Calm=Штиль +PlanetaryConditions.DisplayableName.WindStrength.Light\ Gale=Легкий ветер +PlanetaryConditions.DisplayableName.WindStrength.Moderate\ Gale=Умеренный ветер +PlanetaryConditions.DisplayableName.WindStrength.Strong\ Gale=Сильный ветер +PlanetaryConditions.DisplayableName.WindStrength.Storm=Шторм +PlanetaryConditions.DisplayableName.WindStrength.Tornado\ F1-F3=Торнадо F1-F3 +PlanetaryConditions.DisplayableName.WindStrength.Tornado\ F4=Торнадо F4 +PlanetaryConditions.DisplayableName.WindDirection.North=К Ñеверу +PlanetaryConditions.DisplayableName.WindDirection.Northeast=К Ñеверо-воÑтоку +PlanetaryConditions.DisplayableName.WindDirection.Southeast=К юго-воÑтоку +PlanetaryConditions.DisplayableName.WindDirection.South=К югу +PlanetaryConditions.DisplayableName.WindDirection.Southwest=К юго-западу +PlanetaryConditions.DisplayableName.WindDirection.Northwest=К Ñеверо-западу +PlanetaryConditions.DisplayableName.Atmosphere.Vacuum=Вакуум +PlanetaryConditions.DisplayableName.Atmosphere.Trace=ОÑÑ‚Ð°Ñ‚Ð¾Ñ‡Ð½Ð°Ñ +PlanetaryConditions.DisplayableName.Atmosphere.Thin=Ð¢Ð¾Ð½ÐºÐ°Ñ +PlanetaryConditions.DisplayableName.Atmosphere.Standard=Ð¡Ñ‚Ð°Ð½Ð´Ð°Ñ€Ñ‚Ð½Ð°Ñ +PlanetaryConditions.DisplayableName.Atmosphere.High=Ð’Ñ‹ÑÐ¾ÐºÐ°Ñ +PlanetaryConditions.DisplayableName.Atmosphere.Very\ High=Очень выÑÐ¾ÐºÐ°Ñ +PlanetaryConditions.DisplayableName.Fog.None=Ðикакой +PlanetaryConditions.DisplayableName.Fog.Light\ Fog=Легкий туман +PlanetaryConditions.DisplayableName.Fog.Heavy\ Fog=Сильный туман UnitType.Aero=ÐÑрокоÑмичеÑкий иÑтребитель UnitType.BattleArmor=Бронепехота UnitType.Conventional\ Fighter=Обычный иÑтребитель diff --git a/megamek/i18n/megamek/common/options/messages.properties b/megamek/i18n/megamek/common/options/messages.properties index 78bb3bd120e..9f614ddb2fb 100644 --- a/megamek/i18n/megamek/common/options/messages.properties +++ b/megamek/i18n/megamek/common/options/messages.properties @@ -1,56 +1,56 @@ GameOptionsInfo.group.basic.displayableName=Basic Options GameOptionsInfo.option.friendly_fire.displayableName=Friendly fire -GameOptionsInfo.option.friendly_fire.description=If checked,\nthe game will allow attacks against friendly units,\ncontrary to the rules.\nUnchecked by default. -GameOptionsInfo.option.turn_timer.displayableName=Turn timer in minutes -GameOptionsInfo.option.turn_timer.description=If value is greater 0,\n the game will end a players current action turn after the time is up.\n deactivated by 0 value by default. +GameOptionsInfo.option.friendly_fire.description=If checked, the game will allow attacks against friendly units, contrary to the rules. \nUnchecked by default. +GameOptionsInfo.option.turn_timer.displayableName=Turn timer in seconds +GameOptionsInfo.option.turn_timer.description=If value is greater 0, the game will end a players current action turn after the time is up. deactivated by 0 value by default. GameOptionsInfo.option.skip_ineligable_movement.displayableName=Skip ineligible during movement -GameOptionsInfo.option.skip_ineligable_movement.description=If checked,\nthe game will skip a unit during the movement phase if it is immobile or otherwise inactive.\nUnchecked by default. +GameOptionsInfo.option.skip_ineligable_movement.description=If checked, the game will skip a unit during the movement phase if it is immobile or otherwise inactive. \nUnchecked by default. GameOptionsInfo.option.skip_ineligable_firing.displayableName=Skip ineligible during firing -GameOptionsInfo.option.skip_ineligable_firing.description=If checked,\nthe game will skip a unit during the firing phase if it is inactive.\nUnchecked by default. +GameOptionsInfo.option.skip_ineligable_firing.description=If checked, the game will skip a unit during the firing phase if it is inactive. \nUnchecked by default. GameOptionsInfo.option.skip_ineligable_physical.displayableName=Skip ineligible during physical -GameOptionsInfo.option.skip_ineligable_physical.description=If checked,\nthe game will skip a unit during the physical phase if no attacks are possible or there are no valid targets.\nChecked by default. +GameOptionsInfo.option.skip_ineligable_physical.description=If checked, the game will skip a unit during the physical phase if no attacks are possible or there are no valid targets.\nChecked by default. GameOptionsInfo.option.push_off_board.displayableName=Allow pushing off the map -GameOptionsInfo.option.push_off_board.description=This options allows a mech to be pushed off the map and out of the game by push,\ncharge or DFA attacks.\nChecked by default. +GameOptionsInfo.option.push_off_board.description=This options allows a Mek to be pushed off the map and out of the game by push, charge or DFA attacks.\nChecked by default. GameOptionsInfo.option.team_initiative.displayableName=Teams roll initiative -GameOptionsInfo.option.team_initiative.description=When checked,\nteams roll initiative as one group.\n This team initiative is used to order the units according to the normal method.\n Player order on a team is determined by their own initiative.\nChecked by default +GameOptionsInfo.option.team_initiative.description=When checked, teams roll initiative as one group. This team initiative is used to order the units according to the normal method. Player order on a team is determined by their own initiative.\nChecked by default GameOptionsInfo.option.autosave_msg.displayableName=Remind on Autosave -GameOptionsInfo.option.autosave_msg.description=If checked,\nthe server will send a message each time an auto-save is performed.\nChecked by default +GameOptionsInfo.option.autosave_msg.description=If checked, the server will send a message each time an auto-save is performed.\nChecked by default GameOptionsInfo.option.paranoid_autosave.displayableName=Paranoid Autosave -GameOptionsInfo.option.paranoid_autosave.description=If checked,\nthe game will auto-save every phase.\nUnchecked by default +GameOptionsInfo.option.paranoid_autosave.description=If checked, the game will auto-save every phase. \nUnchecked by default GameOptionsInfo.option.very_paranoid_autosave.displayableName=Very Paranoid Autosave -GameOptionsInfo.option.very_paranoid_autosave.description=If checked,\nthe game will name each auto-save differently so that you can load at almost any point in the game.\n Note: This option can create a lot of files in long games.\nUnchecked by default +GameOptionsInfo.option.very_paranoid_autosave.description=If checked, the game will name each auto-save differently so that you can load at almost any point in the game. Note: This option can create a lot of files in long games. \nUnchecked by default GameOptionsInfo.option.exclusive_db_deployment.displayableName=Exclusive Double Blind deployment zones -GameOptionsInfo.option.exclusive_db_deployment.description=If checked,\nplayer-exclusive deployment zones are enforced,\nto prevent units from deploying on top of each other.\nChecked by default. +GameOptionsInfo.option.exclusive_db_deployment.description=If checked, player-exclusive deployment zones are enforced, to prevent units from deploying on top of each other.\nChecked by default. GameOptionsInfo.option.deep_deployment.displayableName=Deep deployment zones -GameOptionsInfo.option.deep_deployment.description=If checked,\ndeployment zones are located away from the board edge,\ngiving further to retreat. +GameOptionsInfo.option.deep_deployment.description=If checked, deployment zones are located away from the board edge, giving further to retreat. GameOptionsInfo.option.blind_drop.displayableName=Blind Drop -GameOptionsInfo.option.blind_drop.description=If checked,\nthe configuration of a Mech won't be shown in the Chat room to your opponents. +GameOptionsInfo.option.blind_drop.description=If checked, the configuration of a Mek won't be shown in the Chat room to your opponents. GameOptionsInfo.option.real_blind_drop.displayableName=Real Blind Drop -GameOptionsInfo.option.real_blind_drop.description=If checked,\nonly own units are displayed.\nDefaults to false. +GameOptionsInfo.option.real_blind_drop.description=If checked, only own units are displayed. Defaults to false. GameOptionsInfo.option.lobby_ammo_dump.displayableName=Allow Ammo Dumping in the Lobby -GameOptionsInfo.option.lobby_ammo_dump.description=If checked,\nPlayers may dump their Mech's ammo before the game starts.\nUnchecked by default. +GameOptionsInfo.option.lobby_ammo_dump.description=If checked, Players may dump their Mek's ammo before the game starts. \nUnchecked by default. GameOptionsInfo.option.dumping_from_round.displayableName=first round for ammo dumping GameOptionsInfo.option.dumping_from_round.description=Number of the round that has to be at least reached before allowing ammo dumps. GameOptionsInfo.option.set_arty_player_homeedge.displayableName=Automatically set artillery home edge -GameOptionsInfo.option.set_arty_player_homeedge.description=If checked,\nall of the players' artillery units will have their home edge set to the deployment edge of the player,\nNW and NE are North,\nSW and SE are South.\nUnchecked by default. +GameOptionsInfo.option.set_arty_player_homeedge.description=If checked, all of the players' artillery units will have their home edge set to the deployment edge of the player, NW and NE are North, SW and SE are South. \nUnchecked by default. GameOptionsInfo.option.restrict_game_commands.displayableName=Restrict sensitive commands to non-Observers -GameOptionsInfo.option.restrict_game_commands.description=If checked,\ncommands such as /reset and /kick cannot be used by Observers while others are playing.\nUnchecked by default. +GameOptionsInfo.option.restrict_game_commands.description=If checked, commands such as /reset and /kick cannot be used by Observers while others are playing. \nUnchecked by default. GameOptionsInfo.option.disable_local_save.displayableName=Disable local saves when using double blind -GameOptionsInfo.option.disable_local_save.description=Disable local saves to the client machine when on a different server and using double blind,\nbecause they can be used to cheat. -GameOptionsInfo.option.bridgeCF.description=If zero,\nthe CF for bridges is taken from the board files; otherwise,\nthe entered value is used for all bridges. +GameOptionsInfo.option.disable_local_save.description=Disable local saves to the client machine when on a different server and using double blind, because they can be used to cheat. +GameOptionsInfo.option.bridgeCF.description=If zero, the CF for bridges is taken from the board files; otherwise, the entered value is used for all bridges. GameOptionsInfo.option.bridgeCF.displayableName=CF for bridges GameOptionsInfo.option.show_bay_detail.displayableName=Show detail of weapon bays. GameOptionsInfo.option.show_bay_detail.description=Show a detailed loadout of the weapons and ammo of each weapon bay during selection GameOptionsInfo.option.rng_type.displayableName=RNG Type -GameOptionsInfo.option.rng_type.description=Note: any type other than 0 or 1 is completely unofficial.\nValid types:\n0 - SunRandom: Sun regular RNG\n1 - CryptoRandom: Java crypto-strength RNG\n2 - Pool36Random: Pool of 36 values,\nrandomly shuffled\nDefaults to 1. +GameOptionsInfo.option.rng_type.description=Note: any type other than 0 or 1 is completely unofficial. Valid types:\n0 - SunRandom: Sun regular RNG\n1 - CryptoRandom: Java crypto-strength RNG\n2 - Pool36Random: Pool of 36 values, randomly shuffled\nDefaults to 1. GameOptionsInfo.option.rng_log.displayableName=RNG Log GameOptionsInfo.option.rng_log.description=Whether or not to log the Random Number Generator. GameOptionsInfo.option.flamer_heat.displayableName=Flamers per Battlemech Manual -GameOptionsInfo.option.flamer_heat.description=If checked, flamers deal both heat and damage. (BMM pg. 99)\n Otherwise, you have the option to choose heat or damage. +GameOptionsInfo.option.flamer_heat.description=If checked, flamers deal both heat and damage. (BMM pg. 99) Otherwise, you have the option to choose heat or damage. GameOptionsInfo.option.indirect_fire.displayableName=Indirect fire -GameOptionsInfo.option.indirect_fire.description=If checked,\nLRMs may be fire indirectly,\nand players may choose to spot for indirect fire instead of attacking.\nChecked by default. +GameOptionsInfo.option.indirect_fire.description=If checked, LRMs may be fire indirectly, and players may choose to spot for indirect fire instead of attacking.\nChecked by default. GameOptionsInfo.option.breeze.displayableName=Smoke Drift -GameOptionsInfo.option.breeze.description=If checked,\nsmoke will drift as though a light gale even with no wind. +GameOptionsInfo.option.breeze.description=If checked, smoke will drift as though a light gale even with no wind. GameOptionsInfo.option.year.displayableName=Year the game takes place in GameOptionsInfo.option.year.description=This setting determines the availability and tech level of equipment. GameOptionsInfo.option.techlevel.displayableName=Tech level @@ -60,7 +60,7 @@ GameOptionsInfo.option.random_basements.description=If this setting is turned on GameOptionsInfo.option.auto_ams.displayableName=Automatically Assign AMS GameOptionsInfo.option.auto_ams.description=When on, Megamek automatically determines AMS assignments based on highest expected damage from missile attacks GameOptionsInfo.option.full_rotor_hits.displayableName=(Unofficial) No reduced damage for VTOL rotor hits -GameOptionsInfo.option.full_rotor_hits.description=If checked, VTOLs will take full damage from a rotor hit instead of Total Warfare-style reduced damage.\n\nUnchecked by default. +GameOptionsInfo.option.full_rotor_hits.description=If checked, VTOLs will take full damage from a rotor hit instead of Total Warfare-style reduced damage. \nUnchecked by default. GameOptionsInfo.option.hide_unofficial.displayableName=Don't show unofficial game options GameOptionsInfo.option.hide_unofficial.description=If checked, unofficial game options will be deactivated and hidden GameOptionsInfo.option.hide_legacy.displayableName=Don't show legacy game options @@ -72,133 +72,133 @@ GameOptionsInfo.group.victory.displayableName=Victory Conditions GameOptionsInfo.option.skip_forced_victory.displayableName=Skip all phases when forced victory occurs GameOptionsInfo.option.skip_forced_victory.description=The game will skip the turn's remaining phases when a forced victory is declared, as triggered by using the /victory or /defeat commands. GameOptionsInfo.option.check_victory.displayableName=Check for victory -GameOptionsInfo.option.check_victory.description=If checked,\nthe server will enter the victory phase at the end of any turn where victory conditions are met.\n Even if unchecked or conditions are not met,\nserver admins can force victory with the /victory command.\nDefaults to checked. +GameOptionsInfo.option.check_victory.description=If checked, the server will enter the victory phase at the end of any turn where victory conditions are met. Even if unchecked or conditions are not met, server admins can force victory with the /victory command. Defaults to checked. GameOptionsInfo.option.achieve_conditions.displayableName=min conditions to win GameOptionsInfo.option.achieve_conditions.description=The number of victory conditions that must be achieved by the winning team. GameOptionsInfo.option.use_bv_destroyed.displayableName=Destroy enemy BV -GameOptionsInfo.option.use_bv_destroyed.description=Destroy/damage a certain percentage of the enemy force to win,\nmeasured by current BV / original BV +GameOptionsInfo.option.use_bv_destroyed.description=Destroy/damage a certain percentage of the enemy force to win, measured by current BV / original BV GameOptionsInfo.option.bv_destroyed_percent.displayableName=% of BV to destroy -GameOptionsInfo.option.bv_destroyed_percent.description=Measured by current BV / original BV,\non all enemy teams. +GameOptionsInfo.option.bv_destroyed_percent.description=Measured by current BV / original BV, on all enemy teams. GameOptionsInfo.option.use_bv_ratio.displayableName=Outnumber enemy -GameOptionsInfo.option.use_bv_ratio.description=Friendly forces outnumber enemy forces by a percentage ratio.\n Measured by current BV.\nE.G.\n300 means you have 3x the surviving BV of the enemy. +GameOptionsInfo.option.use_bv_ratio.description=Friendly forces outnumber enemy forces by a percentage ratio. Measured by current BV. E.G. 300 means you have 3x the surviving BV of the enemy. GameOptionsInfo.option.bv_ratio_percent.displayableName=% ratio friendly/enemy GameOptionsInfo.option.bv_ratio_percent.description=Measured by current BV of friendly team / current BV of all enemy teams. GameOptionsInfo.option.use_game_turn_limit.displayableName=Force game end at turn limit -GameOptionsInfo.option.use_game_turn_limit.description=The game automatically ends after a defined number of turns,\nwhether or not someone has otherwise won. +GameOptionsInfo.option.use_game_turn_limit.description=The game automatically ends after a defined number of turns, whether or not someone has otherwise won. GameOptionsInfo.option.game_turn_limit.displayableName=Number of turns for turn limit. -GameOptionsInfo.option.game_turn_limit.description=The game automatically ends after a defined number of turns,\nwhether or not someone has otherwise won. +GameOptionsInfo.option.game_turn_limit.description=The game automatically ends after a defined number of turns, whether or not someone has otherwise won. GameOptionsInfo.option.commander_killed.displayableName=Enemy Commander Destroyed -GameOptionsInfo.option.commander_killed.description=If checked,\nvictory is achieved when all enemy commanders are destroyed - configure units to set which are commanders. +GameOptionsInfo.option.commander_killed.description=If checked, victory is achieved when all enemy commanders are destroyed - configure units to set which are commanders. GameOptionsInfo.option.use_kill_count.displayableName=Kill count victory -GameOptionsInfo.option.use_kill_count.description=If checked, victory is achieved when a team achieves a specified number of kills.\nIn the event multiple teams achieve the condition in the same round victory goes to the team with the highest kill count. +GameOptionsInfo.option.use_kill_count.description=If checked, victory is achieved when a team achieves a specified number of kills. In the event multiple teams achieve the condition in the same round victory goes to the team with the highest kill count. GameOptionsInfo.option.game_kill_count.displayableName=Number of kills to achieve victory. -GameOptionsInfo.option.game_kill_count.description=If checked, victory is achieved when a team achieves a specified number of kills.\nIn the event multiple teams achieve the condition in the same round victory goes to the team with the highest kill count. +GameOptionsInfo.option.game_kill_count.description=If checked, victory is achieved when a team achieves a specified number of kills. In the event multiple teams achieve the condition in the same round victory goes to the team with the highest kill count. GameOptionsInfo.group.allowedUnits.displayableName=Allowed Units and Equipment GameOptionsInfo.option.canon_only.displayableName=Canon Units Only -GameOptionsInfo.option.canon_only.description=If checked,\nthe "add unit" dialog will only show official units. +GameOptionsInfo.option.canon_only.description=If checked, the "add unit" dialog will only show official units. GameOptionsInfo.option.allow_advanced_units.displayableName=Allow advanced units -GameOptionsInfo.option.allow_advanced_units.description=If checked,\nunits mounting advanced,\nexperimental or unofficial equipment may be selected from the unit selection dialog.\nUnchecked by default. +GameOptionsInfo.option.allow_advanced_units.description=If checked, units mounting advanced, experimental or unofficial equipment may be selected from the unit selection dialog. \nUnchecked by default. GameOptionsInfo.option.era_based.displayableName=Variable tech level -GameOptionsInfo.option.era_based.description=If checked,\nunit tech level will depend on the year the game is set in. +GameOptionsInfo.option.era_based.description=If checked, unit tech level will depend on the year the game is set in. GameOptionsInfo.option.allow_illegal_units.displayableName=Allow invalid unit designs -GameOptionsInfo.option.allow_illegal_units.description=If checked,\nplayers may use units that do not conform to the official construction rules.\n Basically,\nthis allows players to cheat,\nso make sure you have a good reason to check it. +GameOptionsInfo.option.allow_illegal_units.description=If checked, players may use units that do not conform to the official construction rules. Basically, this allows players to cheat, so make sure you have a good reason to check it. GameOptionsInfo.option.allow_advanced_ammo.displayableName=Allow advanced ammunition types -GameOptionsInfo.option.allow_advanced_ammo.description=If checked,\nallows advanced ammunition types to be used by units that can otherwise use them,\nas defined by options (especially Ammo & Equipment Limits). +GameOptionsInfo.option.allow_advanced_ammo.description=If checked, allows advanced ammunition types to be used by units that can otherwise use them, as defined by options (especially Ammo & Equipment Limits). GameOptionsInfo.option.allow_experimental_ammo.displayableName=Allow experimental/unofficial ammunition types -GameOptionsInfo.option.allow_experimental_ammo.description=If checked,\nallows experimental/unofficial ammunition types to be used by units that can otherwise use them,\nas defined by options (especially Ammo & Equipment Limits). +GameOptionsInfo.option.allow_experimental_ammo.description=If checked, allows experimental/unofficial ammunition types to be used by units that can otherwise use them, as defined by options (especially Ammo & Equipment Limits). GameOptionsInfo.option.is_eq_limits.displayableName=Ammo & Equipment Limits -GameOptionsInfo.option.is_eq_limits.description=If checked,\nInner Sphere units will be limited to ammo & equipment available at the game year.\n Turning this option off will not remove invalid equipment.\nChecked by default +GameOptionsInfo.option.is_eq_limits.description=If checked, Inner Sphere units will be limited to ammo & equipment available at the game year. Turning this option off will not remove invalid equipment.\nChecked by default GameOptionsInfo.option.clan_ignore_eq_limits.displayableName=Ignore Clan Ammo Limitations -GameOptionsInfo.option.clan_ignore_eq_limits.description=If checked,\nClan units can use ammo normally limited to IS units only; for example,\nThunder-Augmented,\nThunder-Inferno,\nand Thunder-Active LRM rounds. +GameOptionsInfo.option.clan_ignore_eq_limits.description=If checked, Clan units can use ammo normally limited to IS units only; for example, Thunder-Augmented, Thunder-Inferno, and Thunder-Active LRM rounds. GameOptionsInfo.option.no_clan_physical.displayableName=No physical attacks for the clans -GameOptionsInfo.option.no_clan_physical.description=If checked,\nclan Meks may not make physical attacks.\nUnchecked by default. +GameOptionsInfo.option.no_clan_physical.description=If checked, clan Meks may not make physical attacks. \nUnchecked by default. GameOptionsInfo.option.allow_nukes.displayableName=Allow command-line nukes. -GameOptionsInfo.option.allow_nukes.description=This must be checked to allow players to throw nukes from the command line.\n If this is not checked,\nnukes are still available as advanced munitions. +GameOptionsInfo.option.allow_nukes.description=This must be checked to allow players to throw nukes from the command line. If this is not checked, nukes are still available as advanced munitions. GameOptionsInfo.option.really_allow_nukes.displayableName=REALLY allow command-line nukes. -GameOptionsInfo.option.really_allow_nukes.description=This must be checked to allow players to throw nukes from the command line.\n If this is not checked,\nnukes are still available as advanced munitions. +GameOptionsInfo.option.really_allow_nukes.description=This must be checked to allow players to throw nukes from the command line. If this is not checked, nukes are still available as advanced munitions. GameOptionsInfo.group.advancedRules.displayableName=Advanced Rules GameOptionsInfo.option.minefields.displayableName=TacOps Minefields / BMM Minefield Support -GameOptionsInfo.option.minefields.description=If checked,\nminefields can be used.\nChecked by default. +GameOptionsInfo.option.minefields.description=If checked, minefields can be used.\nChecked by default. GameOptionsInfo.option.hidden_units.displayableName=Hidden Units -GameOptionsInfo.option.hidden_units.description=If checked,\nplayers may deploy units hidden. +GameOptionsInfo.option.hidden_units.description=If checked, players may deploy units hidden. GameOptionsInfo.option.double_blind.displayableName=TacOps Double blind -GameOptionsInfo.option.double_blind.description=If checked,\nenemy units will only be visible if they are in line of sight of one or more of your units,\nor within sensor range.\nUnchecked by default. +GameOptionsInfo.option.double_blind.description=If checked, enemy units will only be visible if they are in line of sight of one or more of your units, or within sensor range. \nUnchecked by default. GameOptionsInfo.option.tacops_sensors.displayableName=TacOps Sensor Rules GameOptionsInfo.option.tacops_sensors.description=If checked, units will be able to spot other units via sensors as well as line of sight GameOptionsInfo.option.supress_all_double_blind_messages.displayableName=No Double Blind Messages -GameOptionsInfo.option.supress_all_double_blind_messages.description=If checked,\nall Double blind messages will be suppressed.\nYou will only see messages from major events and units in LOS.\nUnchecked by default. +GameOptionsInfo.option.supress_all_double_blind_messages.description=If checked, all Double blind messages will be suppressed. You will only see messages from major events and units in LOS. \nUnchecked by default. GameOptionsInfo.option.suppress_double_blind_bv.displayableName=Hide Battle Value reports -GameOptionsInfo.option.suppress_double_blind_bv.description=If checked,\n and double blind is on Battle Value will be hidden in the initiative report, \nand /checkbv commands won't display enemy BV. +GameOptionsInfo.option.suppress_double_blind_bv.description=If checked, and double blind is on Battle Value will be hidden in the initiative report, and /checkbv commands won't display enemy BV. GameOptionsInfo.option.team_vision.displayableName=Teams share vision -GameOptionsInfo.option.team_vision.description=If checked,\nteams will share vision in double-blind mode.\n Only valid in double-blind mode.\nChecked by default. +GameOptionsInfo.option.team_vision.description=If checked, teams will share vision in double-blind mode. Only valid in double-blind mode.\nChecked by default. GameOptionsInfo.option.tacops_bap.displayableName=TacOps Beagle Active Probes -GameOptionsInfo.option.tacops_bap.description=If checked,\nBeagle Active Probes function according to TacOps rules. +GameOptionsInfo.option.tacops_bap.description=If checked, Beagle Active Probes function according to TacOps rules. GameOptionsInfo.option.tacops_eccm.displayableName=TacOps ECCM -GameOptionsInfo.option.tacops_eccm.description=If checked,\nUnits with ECM will be able to switch to ECCM mode. +GameOptionsInfo.option.tacops_eccm.description=If checked, Units with ECM will be able to switch to ECCM mode. GameOptionsInfo.option.tacops_ghost_target.displayableName=TacOps Ghost Targets -GameOptionsInfo.option.tacops_ghost_target.description=If checked,\nUnits with ECM will be able to switch to Ghost Targets mode. +GameOptionsInfo.option.tacops_ghost_target.description=If checked, Units with ECM will be able to switch to Ghost Targets mode. GameOptionsInfo.option.ghost_target_max.displayableName=Ghost Targets Maximum Penalty GameOptionsInfo.option.ghost_target_max.description=The maximum ghost target penalty (+5 is the effective official maximum). GameOptionsInfo.option.tacops_dig_in.displayableName=TacOps Dig In (Infantry) -GameOptionsInfo.option.tacops_dig_in.description=If checked,\nInfantry can spend a turn digging in to get a defensive bonus and avoid double damage in clear hexes,\nbut with restricted firing arc. +GameOptionsInfo.option.tacops_dig_in.description=If checked, Infantry can spend a turn digging in to get a defensive bonus and avoid double damage in clear hexes, but with restricted firing arc. GameOptionsInfo.option.tacops_ba_weight.displayableName=TacOps Battle Armor Weights GameOptionsInfo.option.tacops_ba_weight.description=If checked,BA will use alternate weights per pg 187 GameOptionsInfo.option.tacops_take_cover.displayableName=TacOps Using Non-Infantry Units as Cover (Infantry) -GameOptionsInfo.option.tacops_take_cover.description=If checked,\nInfantry can take cover behind units in the same hex as the infantry that have already moved.\nUses the Infantry units facing to determine the direction taking cover in.\n(TacOps pg 108) +GameOptionsInfo.option.tacops_take_cover.description=If checked, Infantry can take cover behind units in the same hex as the infantry that have already moved. Uses the Infantry units facing to determine the direction taking cover in. (TacOps pg 108) GameOptionsInfo.option.tacops_angel_ecm.displayableName=TacOps Angel ECM -GameOptionsInfo.option.tacops_angel_ecm.description=If checked,\nAngel ECM will work as described in TacOps +GameOptionsInfo.option.tacops_angel_ecm.description=If checked, Angel ECM will work as described in TacOps GameOptionsInfo.option.tacops_battle_wreck.displayableName=TacOps Battlefield Wreckage GameOptionsInfo.option.tacops_battle_wreck.description=Destroyed units create rough terrain. GameOptionsInfo.option.tacops_skin_of_the_teeth_ejection.displayableName=TacOps Skin of Teeth Ejection -GameOptionsInfo.option.tacops_skin_of_the_teeth_ejection.description=If checked,\na pilot will eject from his mek when the head is destroyed by damage. +GameOptionsInfo.option.tacops_skin_of_the_teeth_ejection.description=If checked, a pilot will eject from his mek when the head is destroyed by damage. GameOptionsInfo.option.tacops_mobile_hqs.displayableName=TacOps Mobile HQs -GameOptionsInfo.option.tacops_mobile_hqs.description=If checked,\nMobile HQ initiative bonus rules from TacOps will be used. +GameOptionsInfo.option.tacops_mobile_hqs.description=If checked, Mobile HQ initiative bonus rules from TacOps will be used. GameOptionsInfo.option.tacops_fatigue.displayableName=TacOps Fatigue -GameOptionsInfo.option.tacops_fatigue.description=If checked,\npilot skills will be adjusted due to fatigue in long battles as described in TacOps. \nStratOps Fatigue points can also be set in the customize unit dialog. +GameOptionsInfo.option.tacops_fatigue.description=If checked, pilot skills will be adjusted due to fatigue in long battles as described in TacOps. StratOps Fatigue points can also be set in the customize unit dialog. GameOptionsInfo.option.tacops_fumbles.displayableName=TacOps PSR Fumbles -GameOptionsInfo.option.tacops_fumbles.description=If checked,\npilot skill rolls can be Fumbled as described in TacOps. +GameOptionsInfo.option.tacops_fumbles.description=If checked, pilot skill rolls can be Fumbled as described in TacOps. GameOptionsInfo.option.tacops_self_destruct.displayableName=TacOps Self-Destruct -GameOptionsInfo.option.tacops_self_destruct.description=If checked,\nunits with a fusion engine may attempt to self-destruct as described in TacOps. +GameOptionsInfo.option.tacops_self_destruct.description=If checked, units with a fusion engine may attempt to self-destruct as described in TacOps. GameOptionsInfo.option.tacops_tank_crews.displayableName=TacOps Vehicle Crews -GameOptionsInfo.option.tacops_tank_crews.description=If checked,\ntanks will follow the rules for crew size and abilities on page 218 in TacOps. +GameOptionsInfo.option.tacops_tank_crews.description=If checked, tanks will follow the rules for crew size and abilities on page 218 in TacOps. GameOptionsInfo.option.stratops_quirks.displayableName=StratOps Quirks GameOptionsInfo.option.stratops_quirks.description=Units may have special positive and negative quirks. GameOptionsInfo.option.stratops_partialrepairs.displayableName=StratOps Partial Repairs GameOptionsInfo.option.stratops_partialrepairs.description=Units may have not completely repaired equipment GameOptionsInfo.option.assault_drop.displayableName=(Legacy) Assault Drop -GameOptionsInfo.option.assault_drop.description=If checked,\nmechs,\nProtoMechs and BA can deploy using assault drop rules.\nDefaults to off. +GameOptionsInfo.option.assault_drop.description=If checked, Meks, ProtoMeks and BA can deploy using assault drop rules. Defaults to off. GameOptionsInfo.option.paratroopers.displayableName=(Legacy) Paratroopers -GameOptionsInfo.option.paratroopers.description=If checked,\ninfantry can deploy using assault drop rules (assault drop must also be enabled). +GameOptionsInfo.option.paratroopers.description=If checked, infantry can deploy using assault drop rules (assault drop must also be enabled). GameOptionsInfo.option.inclusive_sensor_range.displayableName=(Unofficial) Inclusive Sensor Ranges -GameOptionsInfo.option.inclusive_sensor_range.description=If checked,\nthe range brackets for sensors in TacOps are inclusive of lower ranges rather than exclusive (i.e.\nmedium range includes medium and short) +GameOptionsInfo.option.inclusive_sensor_range.description=If checked, the range brackets for sensors in TacOps are inclusive of lower ranges rather than exclusive (i.e. medium range includes medium and short) GameOptionsInfo.option.sensors_detect_all.displayableName=(Unofficial) Sensors reveal all unit information GameOptionsInfo.option.sensors_detect_all.description=If checked, units will be fully revealed when only detected by sensors, instead of just displaying a sensor return GameOptionsInfo.option.magscan_nohills.displayableName=(Unofficial) Magscan sensors cannot bypass hills GameOptionsInfo.option.magscan_nohills.description=If checked, magscan sensors will be blocked by hills GameOptionsInfo.option.woods_burn_down.displayableName=(Unofficial) Woods have a chance to burn down -GameOptionsInfo.option.woods_burn_down.description=If checked,\nwoods will burn down X terrain factor per turn.\nUnchecked by default. +GameOptionsInfo.option.woods_burn_down.description=If checked, woods will burn down X terrain factor per turn. \nUnchecked by default. GameOptionsInfo.option.woods_burn_down_amount.displayableName=How many CF a will burn down. -GameOptionsInfo.option.woods_burn_down_amount.description=If "Woods have a chance to burn down" is checked then this many terrain factor per turn will burn.\n\5 by default. +GameOptionsInfo.option.woods_burn_down_amount.description=If "Woods have a chance to burn down" is checked then this many terrain factor per turn will burn. \5 by default. GameOptionsInfo.option.no_ignite_clear.displayableName=(Unofficial) No igniting clear hexes -GameOptionsInfo.option.no_ignite_clear.description=If checked,\nclear hexes can't be ignited by infernos at all. +GameOptionsInfo.option.no_ignite_clear.description=If checked, clear hexes can't be ignited by infernos at all. GameOptionsInfo.option.all_have_ei_cockpit.displayableName=(Unofficial) All units have EI cockpit -GameOptionsInfo.option.all_have_ei_cockpit.description=If checked,\npilots with EI implants get the benefit in any unit,\nnot just clan mechs and BA.\n For pilot damage,\nProtoMechs use Mech rules,\nall other units use BA rules. +GameOptionsInfo.option.all_have_ei_cockpit.description=If checked, pilots with EI implants get the benefit in any unit, not just clan Meks and BA. For pilot damage, ProtoMeks use Mek rules, all other units use BA rules. GameOptionsInfo.option.extreme_temperature_survival.displayableName=(Unofficial) Extreme temperature survival -GameOptionsInfo.option.extreme_temperature_survival.description=If checked,\nInfantry and MechWarriors don't instantly die in extreme temperatures,\nbut you get a short time to save them.\nNot implemented. -GameOptionsInfo.option.armed_mechwarriors.displayableName=(Unofficial) Armed MechWarriors -GameOptionsInfo.option.armed_mechwarriors.description=If checked,\nMechWarriors carry a sidearm that can be fired using same rules as an infantry rifle. -GameOptionsInfo.option.pilots_visual_range_one.displayableName=(Unofficial) Limited MechWarrior Visibility -GameOptionsInfo.option.pilots_visual_range_one.description=If checked,\nMechWarriors only have a visibility of 1 when visibility is set to less then 999 and DB is turned on. -GameOptionsInfo.option.pilots_cannot_spot.displayableName=(Unofficial) MechWarriors cannot spot -GameOptionsInfo.option.pilots_cannot_spot.description=If checked,\nMechWarriors are not allowed to spot for IDF fire. +GameOptionsInfo.option.extreme_temperature_survival.description=If checked, Infantry and MekWarriors don't instantly die in extreme temperatures, but you get a short time to save them. Not implemented. +GameOptionsInfo.option.armed_mechwarriors.displayableName=(Unofficial) Armed MekWarriors +GameOptionsInfo.option.armed_mechwarriors.description=If checked, MekWarriors carry a sidearm that can be fired using same rules as an infantry rifle. +GameOptionsInfo.option.pilots_visual_range_one.displayableName=(Unofficial) Limited MekWarrior Visibility +GameOptionsInfo.option.pilots_visual_range_one.description=If checked, MekWarriors only have a visibility of 1 when visibility is set to less then 999 and DB is turned on. +GameOptionsInfo.option.pilots_cannot_spot.displayableName=(Unofficial) MekWarriors cannot spot +GameOptionsInfo.option.pilots_cannot_spot.description=If checked, MekWarriors are not allowed to spot for IDF fire. GameOptionsInfo.option.metal_content.displayableName=(Unofficial) Metal content for MagScan sensors. -GameOptionsInfo.option.metal_content.description=If checked and the map in use has metal content set in hexes,\nthat metal content will affect MagScan sensor ability. -GameOptionsInfo.option.ba_grab_bars.displayableName=(Unofficial) BA Grab Bars on Standard Mechs -GameOptionsInfo.option.ba_grab_bars.description=If checked, BA can mount any mech/vee instead of just OmniMechs/OmniVees. +GameOptionsInfo.option.metal_content.description=If checked and the map in use has metal content set in hexes, that metal content will affect MagScan sensor ability. +GameOptionsInfo.option.ba_grab_bars.displayableName=(Unofficial) BA Grab Bars on Standard Meks +GameOptionsInfo.option.ba_grab_bars.description=If checked, BA can mount any Mek/vee instead of just OmniMeks/OmniVees. GameOptionsInfo.option.maxtech_movement_mods.displayableName=(Legacy MaxTech) MaxTech Movement Mods GameOptionsInfo.option.maxtech_movement_mods.description=If checked, the "Advanced Movement Mods" from MaxTech are used. GameOptionsInfo.option.alternate_masc.displayableName=(Unofficial) Alternate "Better" MASC/Supercharger @@ -209,53 +209,53 @@ GameOptionsInfo.option.alternate_masc_enhanced.description=If checked, MASC or S GameOptionsInfo.group.advancedCombat.displayableName=Advanced Combat GameOptionsInfo.option.tacops_ams.displayableName=TacOps Enhanced Missile Defense -GameOptionsInfo.option.tacops_ams.description=If activated,\nthe -4 applied to the roll on the cluster hit table can reduce the roll below 2; if this happens,\nthe attack deals no damage. +GameOptionsInfo.option.tacops_ams.description=If activated, the -4 applied to the roll on the cluster hit table can reduce the roll below 2; if this happens, the attack deals no damage. GameOptionsInfo.option.tacops_manual_ams.displayableName=TacOps AMS as a Weapon GameOptionsInfo.option.tacops_manual_ams.description=If checked, AMS can be used manually as a machine gun/pulse laser per TO p99. GameOptionsInfo.option.floating_crits.displayableName=Through-armor criticals will 'float' -GameOptionsInfo.option.floating_crits.description=If checked,\nrolls of '2' on hit location will result in a new location being rolled for a critical hit,\ninstead of just hitting the local torso.\nUnchecked by default. +GameOptionsInfo.option.floating_crits.description=If checked, rolls of '2' on hit location will result in a new location being rolled for a critical hit, instead of just hitting the local torso. \nUnchecked by default. GameOptionsInfo.option.tacops_crit_roll.displayableName=TacOps Advanced Determining Critical Hits GameOptionsInfo.option.tacops_crit_roll.description=If checked, critical hit determination is affected by the damage value of the attack. GameOptionsInfo.option.tacops_engine_explosions.displayableName=TacOps engine explosions -GameOptionsInfo.option.tacops_engine_explosions.description=If checked,\nany time a mech takes 4 or more engine crits in one round,\na roll of '10' will cause a cascading engine explosion.\n Any time an Aero or Tank takes 1 or more engine crits in one round,\na roll of '12' will cause a cascading engine explosion. +GameOptionsInfo.option.tacops_engine_explosions.description=If checked, any time a Mek takes 4 or more engine crits in one round, a roll of '10' will cause a cascading engine explosion. Any time an Aero or Tank takes 1 or more engine crits in one round, a roll of '12' will cause a cascading engine explosion. GameOptionsInfo.option.tacops_called_shots.displayableName=TacOps Called Shots -GameOptionsInfo.option.tacops_called_shots.description=If checked,\nunits can make high,\nlow,\nleft,\nor right called shots. +GameOptionsInfo.option.tacops_called_shots.description=If checked, units can make high, low, left, or right called shots. GameOptionsInfo.option.tacops_prone_fire.displayableName=TacOps firing while prone -GameOptionsInfo.option.tacops_prone_fire.description=If checked,\nmechs that are prone can fire if they are missing one arm.\nStandard rules disallow firing when prone and missing an arm.\nAll weapons are +1 BTH and weapons mounted in propping arm can not be fired. +GameOptionsInfo.option.tacops_prone_fire.description=If checked, Meks that are prone can fire if they are missing one arm. Standard rules disallow firing when prone and missing an arm. All weapons are +1 BTH and weapons mounted in propping arm can not be fired. GameOptionsInfo.option.tacops_start_fire.displayableName=TacOps Starting Fires -GameOptionsInfo.option.tacops_start_fire.description=If checked,\nfires may be set accidentally or intentionally. +GameOptionsInfo.option.tacops_start_fire.description=If checked, fires may be set accidentally or intentionally. GameOptionsInfo.option.tacops_range.displayableName=TacOps Extreme Range Rules -GameOptionsInfo.option.tacops_range.description=If checked,\nWeapons have an extreme range bracket past their long range distance. +GameOptionsInfo.option.tacops_range.description=If checked, Weapons have an extreme range bracket past their long range distance. GameOptionsInfo.option.tacops_los_range.displayableName=TacOps LOS Range Rules -GameOptionsInfo.option.tacops_los_range.description=If checked,\nWeapons have a LOS range bracket past their extreme range distance. +GameOptionsInfo.option.tacops_los_range.description=If checked, Weapons have a LOS range bracket past their extreme range distance. GameOptionsInfo.option.tacops_dead_zones.displayableName=TacOps Dead Zone Rule -GameOptionsInfo.option.tacops_dead_zones.description=If checked,\nLOS can be blocked by dead zones,\nper the rule on TacOps,\npg.\n79-80 (not compatible with diagramming LOS rules) +GameOptionsInfo.option.tacops_dead_zones.description=If checked, LOS can be blocked by dead zones, per the rule on TacOps, pg. 79-80 (not compatible with diagramming LOS rules) GameOptionsInfo.option.tacops_LOS1.displayableName=TacOps Diagramming Line of Sight Rules -GameOptionsInfo.option.tacops_LOS1.description=If checked,\nLOS will be calculated using the Diagramming LOS rules from TacOps revised,\npage 22 (not compatible with dead zone rule) +GameOptionsInfo.option.tacops_LOS1.description=If checked, LOS will be calculated using the Diagramming LOS rules from TacOps revised, page 22 (not compatible with dead zone rule) GameOptionsInfo.option.tacops_altdmg.displayableName=TacOps Altered Energy Weapons Damage -GameOptionsInfo.option.tacops_altdmg.description=If checked,\nthe damage inflicted by energy weapons (Laser,\nFlamer,\nPPC) is altered as follows: -1 damage at long range,\n+1 damage at range <= 1.\nDefaults to false. +GameOptionsInfo.option.tacops_altdmg.description=If checked, the damage inflicted by energy weapons (Laser, Flamer, PPC) is altered as follows: -1 damage at long range, +1 damage at range <= 1. Defaults to false. GameOptionsInfo.option.tacops_clusterhitpen.displayableName=TacOps Cluster Hit Penalties -GameOptionsInfo.option.tacops_clusterhitpen.description=If checked,\napply the following penalties to the roll to determine number of missiles hit: +1 (Range <= 1 hex); 0 (Short range); -1 (Long range).\nDoes not apply to Streak SRMs,\nLRMS,\nATM Standard,\nor ATM Extended Range.\nThe roll cannot be increased above 12,\nor decreased below 2. +GameOptionsInfo.option.tacops_clusterhitpen.description=If checked, apply the following penalties to the roll to determine number of missiles hit: +1 (Range <= 1 hex); 0 (Short range); -1 (Long range). Does not apply to Streak SRMs, LRMS, ATM Standard, or ATM Extended Range. The roll cannot be increased above 12, or decreased below 2. GameOptionsInfo.option.tacops_ppc_inhibitors.displayableName=TacOps PPC Field Inhibitor Disengage -GameOptionsInfo.option.tacops_ppc_inhibitors.description=If checked,\nthe field inhibitor of a PPC can be disengaged to disregard the minimum range modifiers.\nHowever,\nafter each shot,\nthere is a chance that the PPC is destroyed in the process and the IS of the PPC's location takes 10 points of damage.\nThe chance for this depends on range,\nroll 2d6 to avoid on: 3+ for >=3 hex range; 6+ for 2 hex range and 10+ for 1 hex range.\nDefaults to off. +GameOptionsInfo.option.tacops_ppc_inhibitors.description=If checked, the field inhibitor of a PPC can be disengaged to disregard the minimum range modifiers. However, after each shot, there is a chance that the PPC is destroyed in the process and the IS of the PPC's location takes 10 points of damage. The chance for this depends on range, roll 2d6 to avoid on: 3+ for >=3 hex range; 6+ for 2 hex range and 10+ for 1 hex range. Defaults to off. GameOptionsInfo.option.tacops_charge_damage.displayableName=TacOps Charge Damage -GameOptionsInfo.option.tacops_charge_damage.description=If checked,\nthe attacker in a charge will receive damage proportional to the distance of the charge.\nDefaults to off. +GameOptionsInfo.option.tacops_charge_damage.description=If checked, the attacker in a charge will receive damage proportional to the distance of the charge. Defaults to off. GameOptionsInfo.option.tacops_glancing_blows.displayableName=TacOps Glancing Blows -GameOptionsInfo.option.tacops_glancing_blows.description=If checked,\nattacks that roll for to-hit and roll exactly the target number required deal only reduced damage: Normal attacks deal only half damage,\nwhile missile attacks get a -2 for the roll on the # of missiles roll.\nIf the roll is reduced below 2,\nonly 1 missile hits.\nAdditionally,\nif a glancing blow deals a critical hit,\napply a -2 modifier to the check.\nAttacks that do not roll for attack (Falling damage,\n...),\nattacks that deal no damage (TAG),\nand Streak SRMs are unaffected.\nDefaults to false. +GameOptionsInfo.option.tacops_glancing_blows.description=If checked, attacks that roll for to-hit and roll exactly the target number required deal only reduced damage: Normal attacks deal only half damage, while missile attacks get a -2 for the roll on the # of missiles roll. If the roll is reduced below 2, only 1 missile hits. Additionally, if a glancing blow deals a critical hit, apply a -2 modifier to the check. Attacks that do not roll for attack (Falling damage, ...), attacks that deal no damage (TAG), and Streak SRMs are unaffected. Defaults to false. GameOptionsInfo.option.tacops_direct_blow.displayableName=TacOps Direct Blow -GameOptionsInfo.option.tacops_direct_blow.description=If checked,\nfor every 3 numbers rolled above the to-hit 1 extra point of damage is added to the attack.\nCluster weapons get a +2 to the CHT for every 3 MoS.\nAny Rolls for Crits will get a +1 for every 3 MoS. +GameOptionsInfo.option.tacops_direct_blow.description=If checked, for every 3 numbers rolled above the to-hit 1 extra point of damage is added to the attack. Cluster weapons get a +2 to the CHT for every 3 MoS. Any Rolls for Crits will get a +1 for every 3 MoS. GameOptionsInfo.option.tacops_burst.displayableName=TacOps Burst Fire MGs -GameOptionsInfo.option.tacops_burst.description=If checked,\nMGs may use burst fire rules: They inflict 1D6 of damage,\ncreate an equal amount of heat and use triple the amount of ammunition.\nClick the 'Configure Unit' button to configure MGs.\nDefaults to false. +GameOptionsInfo.option.tacops_burst.description=If checked, MGs may use burst fire rules: They inflict 1D6 of damage, create an equal amount of heat and use triple the amount of ammunition. Click the 'Configure Unit' button to configure MGs. Defaults to false. GameOptionsInfo.option.tacops_heat.displayableName=Tactical Operations Expanded Heat Scale -GameOptionsInfo.option.tacops_heat.description=If checked,\nthe heat scale is expanded as shown in Tactical Operations,\npg.\n104,\nand the Avoiding Shutdown rule on the same page is used.\nDefaults to false. +GameOptionsInfo.option.tacops_heat.description=If checked, the heat scale is expanded as shown in Tactical Operations, pg. 104, and the Avoiding Shutdown rule on the same page is used. Defaults to false. GameOptionsInfo.option.tacops_partial_cover.displayableName=TacOps Partial Cover -GameOptionsInfo.option.tacops_partial_cover.description=If checked,\n1/4 and 3/4 partial cover is allowed.\nDefaults to false. +GameOptionsInfo.option.tacops_partial_cover.description=If checked, 1/4 and 3/4 partial cover is allowed. Defaults to false. GameOptionsInfo.option.tacops_ba_criticals.displayableName=TacOps BA Critical hits -GameOptionsInfo.option.tacops_ba_criticals.description=If checked,\nbattle armour suffer a critical hit if the same trooper is rolled twice.\n Critical hits instantly kill a trooper. +GameOptionsInfo.option.tacops_ba_criticals.description=If checked, battle armour suffer a critical hit if the same trooper is rolled twice. Critical hits instantly kill a trooper. GameOptionsInfo.option.tacops_hotload.displayableName=TacOps Hot-Loading -GameOptionsInfo.option.tacops_hotload.description=If checked,\nplayer will be able to hot load ammo for LRM's and ATM's on their Meks and Vehicles. +GameOptionsInfo.option.tacops_hotload.description=If checked, player will be able to hot load ammo for LRM's and ATM's on their Meks and Vehicles. GameOptionsInfo.option.hotload_in_game.displayableName=(Unofficial) Meks can switch hot-loading mid-game -GameOptionsInfo.option.hotload_in_game.description=If checked,\nplayer will be able to toggle hot loading ammo for LRM's and ATM's on their Meks in game. +GameOptionsInfo.option.hotload_in_game.description=If checked, player will be able to toggle hot loading ammo for LRM's and ATM's on their Meks in game. GameOptionsInfo.option.tacops_rapid_ac.displayableName=TacOps Rapidfire Autocannons GameOptionsInfo.option.tacops_rapid_ac.description=If checked Standard and Light Autocannons may fire as an Ultra Autocannons with an increased risk of jams and a chance of explosion. GameOptionsInfo.option.kind_rapid_ac.displayableName=(Unofficial) Kinder Rapidfire Autocannons @@ -263,57 +263,57 @@ GameOptionsInfo.option.kind_rapid_ac.description=If checked Standard and Light A GameOptionsInfo.option.multiuse_ams.displayableName=(Unofficial) Allow AMS to engage multiple missile attacks GameOptionsInfo.option.multiuse_ams.description=If checked, AMS is not limited to engaging one missile attack per round GameOptionsInfo.option.tacops_grappling.displayableName=TacOps Grappling skill -GameOptionsInfo.option.tacops_grappling.description=If checked,\nmeks and protomeks will be able to do a grappling attack +GameOptionsInfo.option.tacops_grappling.description=If checked, meks and protomeks will be able to do a grappling attack GameOptionsInfo.option.tacops_jump_jet_attack.displayableName=TacOps Jump Jet Attack -GameOptionsInfo.option.tacops_jump_jet_attack.description=If checked,\nmeks attack using their jump jets +GameOptionsInfo.option.tacops_jump_jet_attack.description=If checked, meks attack using their jump jets GameOptionsInfo.option.tacops_trip_attack.displayableName=TacOps Trip Attack -GameOptionsInfo.option.tacops_trip_attack.description=If checked,\nmeks may try to trip other meks +GameOptionsInfo.option.tacops_trip_attack.description=If checked, meks may try to trip other meks GameOptionsInfo.option.tacops_energy_weapons.displayableName=TacOps Energy Weapons -GameOptionsInfo.option.tacops_energy_weapons.description=If checked,\nammoless energy weapons can be dialed back to do less damage and heat. +GameOptionsInfo.option.tacops_energy_weapons.description=If checked, ammoless energy weapons can be dialed back to do less damage and heat. GameOptionsInfo.option.tacops_gauss_weapons.displayableName=TacOps Gauss Weapons -GameOptionsInfo.option.tacops_gauss_weapons.description=If checked,\nGauss Weapons can be powered up/down.\nPowered down gauss weapons do not explode it critted. +GameOptionsInfo.option.tacops_gauss_weapons.description=If checked, Gauss Weapons can be powered up/down. Powered down gauss weapons do not explode it critted. GameOptionsInfo.option.tacops_retractable_blades.displayableName=TacOps Retractable Blades -GameOptionsInfo.option.tacops_retractable_blades.description=If checked,\nretracted retractable blades can be extended for potential critical hits when punching. +GameOptionsInfo.option.tacops_retractable_blades.description=If checked, retracted retractable blades can be extended for potential critical hits when punching. GameOptionsInfo.option.tacops_ammunition.displayableName=TacOps Ammunition -GameOptionsInfo.option.tacops_ammunition.description=If checked,\nAmmunition explosions of sufficient damage could damage other units in the surrounding hexes. +GameOptionsInfo.option.tacops_ammunition.description=If checked, Ammunition explosions of sufficient damage could damage other units in the surrounding hexes. GameOptionsInfo.option.tacops_woods_cover.displayableName=TacOps Woods Cover -GameOptionsInfo.option.tacops_woods_cover.description=If checked,\nwhen a unit is standing in a wood/jungle hex the hex will absorb damage instead of adding to the to-hit modifier. +GameOptionsInfo.option.tacops_woods_cover.description=If checked, when a unit is standing in a wood/jungle hex the hex will absorb damage instead of adding to the to-hit modifier. GameOptionsInfo.option.tacops_vehicle_effective.displayableName=TacOps Vehicle Effectiveness GameOptionsInfo.option.tacops_vehicle_effective.description=Vehicles are less likely to take critical hits GameOptionsInfo.option.tacops_vehicle_arcs.displayableName=TacOps Vehicle Firing Arcs -GameOptionsInfo.option.tacops_vehicle_arcs.description=Vehicles have unique firing arcs,\nas described in Tactical Operations +GameOptionsInfo.option.tacops_vehicle_arcs.description=Vehicles have unique firing arcs, as described in Tactical Operations GameOptionsInfo.option.tacops_vtol_attacks.displayableName=TacOps VTOL Special Attacks GameOptionsInfo.option.tacops_vtol_attacks.description=VTOLs can make strafing and bombing attacks. -GameOptionsInfo.option.tacops_advanced_mech_hit_locations.displayableName=TacOps Advanced 'Mech Hit Locations -GameOptionsInfo.option.tacops_advanced_mech_hit_locations.description=If checked,\nThe TacOps Hit locations will be used for Meks +GameOptionsInfo.option.tacops_advanced_mech_hit_locations.displayableName=TacOps Advanced 'Mek Hit Locations +GameOptionsInfo.option.tacops_advanced_mech_hit_locations.description=If checked, The TacOps Hit locations will be used for Meks GameOptionsInfo.option.tacops_coolant_failure.displayableName=TacOps Heat Sink Coolant Failure GameOptionsInfo.option.tacops_coolant_failure.description=Possible for Heat Sink Coolant to become less efficient every time the Unit goes over 5 heat each round. GameOptionsInfo.option.tacops_ba_vs_ba.displayableName=TacOps BattleArmor vs BattleArmor Damage GameOptionsInfo.option.tacops_ba_vs_ba.description=Increases the effectiveness of certain BA weapons vs other BA, TO pg 109 GameOptionsInfo.option.no_tac.displayableName=(Unofficial) No through-armor criticals -GameOptionsInfo.option.no_tac.description=If checked,\nrolls of '2' on hit location will only result in a torso hit,\nand no critical roll.\n Only applies to mechs.\n Supercedes the floating criticals option.\nUnchecked by default. +GameOptionsInfo.option.no_tac.description=If checked, rolls of '2' on hit location will only result in a torso hit, and no critical roll. Only applies to Meks. Supercedes the floating criticals option. \nUnchecked by default. GameOptionsInfo.option.vehicles_threshold.displayableName=(Unofficial) Vehicle damage thresholds -GameOptionsInfo.option.vehicles_threshold.description=If checked,\nVehicles gain damage thresholds similar to those of Warships\nas described on page 239 of TW. +GameOptionsInfo.option.vehicles_threshold.description=If checked, Vehicles gain damage thresholds similar to those of Warshipsas described on page 239 of TW. GameOptionsInfo.option.vehicles_threshold_variable.displayableName=(Unofficial) Variable vehicle damage thresholds -GameOptionsInfo.option.vehicles_threshold_variable.description=If checked,\nVehicle damage thresholds are variable\nas described on page 117 of StratOps. +GameOptionsInfo.option.vehicles_threshold_variable.description=If checked, Vehicle damage thresholds are variableas described on page 117 of StratOps. GameOptionsInfo.option.vehicles_threshold_divisor.displayableName=(Unofficial) Vehicle damage threshold divisor (defaults to 10) -GameOptionsInfo.option.vehicles_threshold_divisor.description=Which divisor to use for the damage thresholds of vehicles.\nDefault is 10 per the damage threshold rules for Aerospace assets on page 239 of TW. +GameOptionsInfo.option.vehicles_threshold_divisor.description=Which divisor to use for the damage thresholds of vehicles. Default is 10 per the damage threshold rules for Aerospace assets on page 239 of TW. GameOptionsInfo.option.vtol_strafing.displayableName=(Unofficial) VTOL Strafing -GameOptionsInfo.option.vtol_strafing.description=If checked,\nVTOLs can making strafing attacks per original rules in TacOps. +GameOptionsInfo.option.vtol_strafing.description=If checked, VTOLs can making strafing attacks per original rules in TacOps. GameOptionsInfo.option.vehicles_safe_from_infernos.displayableName=(Unofficial) Vehicles may not be the target of an Inferno missile attack. -GameOptionsInfo.option.vehicles_safe_from_infernos.description=If checked,\nVehicles cannot be the target of an Inferno SRM attack.\nUnchecked by default. -GameOptionsInfo.option.protos_safe_from_infernos.displayableName=(Unofficial) ProtoMechs may not be the target of an Inferno missile attack. -GameOptionsInfo.option.protos_safe_from_infernos.description=If checked,\nProtoMechs cannot be the target of an Inferno SRM attack.\nUnchecked by default. +GameOptionsInfo.option.vehicles_safe_from_infernos.description=If checked, Vehicles cannot be the target of an Inferno SRM attack. \nUnchecked by default. +GameOptionsInfo.option.protos_safe_from_infernos.displayableName=(Unofficial) ProtoMeks may not be the target of an Inferno missile attack. +GameOptionsInfo.option.protos_safe_from_infernos.description=If checked, ProtoMeks cannot be the target of an Inferno SRM attack. \nUnchecked by default. GameOptionsInfo.option.indirect_always_possible.displayableName=(Unofficial) Indirect LRM fire always possible -GameOptionsInfo.option.indirect_always_possible.description=If checked,\nand indirect fire for LRMs active,\nindirect fire is possible regardless of LOS from attacker to target.\nUnchecked by default. +GameOptionsInfo.option.indirect_always_possible.description=If checked, and indirect fire for LRMs active, indirect fire is possible regardless of LOS from attacker to target. \nUnchecked by default. GameOptionsInfo.option.increased_ac_dmg.displayableName=(Unofficial) Increased AC Damage GameOptionsInfo.option.increased_ac_dmg.description=If checked, standard and light AC/2 and AC/5 have their damage increased by 1 each. GameOptionsInfo.option.increased_iserll_range.displayableName=(Unofficial) Increased IS ER Large Laser Range GameOptionsInfo.option.increased_iserll_range.description=If checked, the IS ER Large Laser & IS ER Large Laser Prototype have their range increased to 7/14/21/28. GameOptionsInfo.option.unjam_uac.displayableName=(Unofficial) Unjam Ultra Autocannons -GameOptionsInfo.option.unjam_uac.description=When checked,\nyou will be able to unjam Ultra Autocannons just like Rotary models. +GameOptionsInfo.option.unjam_uac.description=When checked, you will be able to unjam Ultra Autocannons just like Rotary models. GameOptionsInfo.option.uac_tworolls.displayableName=(Unofficial) Ultra Autocannons To-Hit roll twice in Ultra Mode. -GameOptionsInfo.option.uac_tworolls.description=If checked,\nUltra Autocannons will roll twice for To-Hit instead of rolling on the 2 column of the missile hits table.\nNote: Autocannons firing with the TacOps rapid fire autocannons rules will not benefit from this option +GameOptionsInfo.option.uac_tworolls.description=If checked, Ultra Autocannons will roll twice for To-Hit instead of rolling on the 2 column of the missile hits table. Note: Autocannons firing with the TacOps rapid fire autocannons rules will not benefit from this option GameOptionsInfo.option.clubs_punch.displayableName=(Unofficial) Club (Hatchet, Sword, etc...) attacks use punch table. GameOptionsInfo.option.clubs_punch.description=When checked, all club type attacks will be rolled like punches. GameOptionsInfo.option.on_map_predesignate.displayableName=(Unofficial) Allow artillery units on-map to pre-designate autohit hexes. @@ -328,82 +328,84 @@ GameOptionsInfo.option.forest_fires_no_smoke.description=If selected, burning wo GameOptionsInfo.group.advancedGroundMovement.displayableName=Advanced Ground Movement GameOptionsInfo.option.tacops_sprint.displayableName=TacOps Sprinting -GameOptionsInfo.option.tacops_sprint.description=If checked,\nMeks can sprint as per the rules in TacOps,\npg.\n18. +GameOptionsInfo.option.tacops_sprint.description=If checked, Meks can sprint as per the rules in TacOps, pg. 18. GameOptionsInfo.option.tacops_standing_still.displayableName=TacOps Standing Still -GameOptionsInfo.option.tacops_standing_still.description=If checked,\nthe standing still rule (Tactical Operations,\npg.\n18) takes effect (Non-infantry units that do not expend MP are easier to hit.) +GameOptionsInfo.option.tacops_standing_still.description=If checked, the standing still rule (Tactical Operations, pg. 18) takes effect (Non-infantry units that do not expend MP are easier to hit.) GameOptionsInfo.option.tacops_evade.displayableName=TacOps Evading -GameOptionsInfo.option.tacops_evade.description=If checked,\nMeks may use evasive movement per the rules in TacOps. +GameOptionsInfo.option.tacops_evade.description=If checked, Meks may use evasive movement per the rules in TacOps. GameOptionsInfo.option.tacops_skilled_evasion.displayableName=TacOps Skilled Evading -GameOptionsInfo.option.tacops_skilled_evasion.description=If checked,\npenalties to-hit an evading unit are based on the unit's piloting skill. +GameOptionsInfo.option.tacops_skilled_evasion.description=If checked, penalties to-hit an evading unit are based on the unit's piloting skill. GameOptionsInfo.option.tacops_leaping.displayableName=TacOps Leaping -GameOptionsInfo.option.tacops_leaping.description=If checked,\nMeks can leap down more than two levels at the risk of damage and falling. +GameOptionsInfo.option.tacops_leaping.description=If checked, Meks can leap down more than two levels at the risk of damage and falling. GameOptionsInfo.option.tacops_physical_psr.displayableName=TacOps defensive physical PSR weight modifier -GameOptionsInfo.option.tacops_physical_psr.description=If checked,\nafter being kicked,\npushed,\nor taking 20+ damage the PSR is modified by the weight classes of the attacked mech.\nBTH is altered by weight class.\nLights get +1 to BTH where as assaults get -2.\nMediums and heavies are in between +GameOptionsInfo.option.tacops_physical_psr.description=If checked, after being kicked, pushed, or taking 20+ damage the PSR is modified by the weight classes of the attacked Mek. BTH is altered by weight class. Lights get +1 to BTH where as assaults get -2. Mediums and heavies are in between GameOptionsInfo.option.tacops_attack_physical_psr.displayableName=TacOps attack physical PSR weight modifier -GameOptionsInfo.option.tacops_attack_physical_psr.description=If checked,\nlights get -2 modifier when making physical attacks,\nmediums get a -1,\nheavies and assaults get +0 +GameOptionsInfo.option.tacops_attack_physical_psr.description=If checked, lights get -2 modifier when making physical attacks, mediums get a -1, heavies and assaults get +0 GameOptionsInfo.option.tacops_taking_damage.displayableName=TacOps taking damage -GameOptionsInfo.option.tacops_taking_damage.description=If checked,\nunits will have +1 to their piloting skill roll for every 20 damage taken,\nnot just the first damage. +GameOptionsInfo.option.tacops_taking_damage.description=If checked, units will have +1 to their piloting skill roll for every 20 damage taken, not just the first damage. GameOptionsInfo.option.tacops_leg_damage.displayableName=TacOps Leg Damage Rule -GameOptionsInfo.option.tacops_leg_damage.description=If checked,\nhip criticals are cumulative with other damage to legs,\nbut reduce movement by 2 instead of halving.\nDestroying both hips does not reduce MPs to zero. +GameOptionsInfo.option.tacops_leg_damage.description=If checked, hip criticals are cumulative with other damage to legs, but reduce movement by 2 instead of halving. Destroying both hips does not reduce MPs to zero. GameOptionsInfo.option.tacops_walk_backwards.displayableName=TacOps Backward Movement (Expanded) GameOptionsInfo.option.tacops_walk_backwards.description=If checked Meks and Tanks can move backwards over elevation changes of 1 with a PSR check. GameOptionsInfo.option.tacops_fast_infantry_move.displayableName=TacOps Fast Infantry Movement -GameOptionsInfo.option.tacops_fast_infantry_move.description=If checked,\ninfantry can sprint as per the rules in TacOps,\npg.\n27. +GameOptionsInfo.option.tacops_fast_infantry_move.description=If checked,infantry can sprint as per the rules in TacOps,pg.27. +GameOptionsInfo.option.tacops_inf_pave_bonus.displayableName=TacOps Infantry Movement on Pavement +GameOptionsInfo.option.tacops_inf_pave_bonus.description=If checked, infantry can get the same bonus movement tracked and wheeled vehicles get for moving on pavement. TO:AR p25 GameOptionsInfo.option.mek_lance_movement.displayableName=(Unofficial) Mek Lance Movement -GameOptionsInfo.option.mek_lance_movement.description=If checked,\nMeks must move as a complete lance at once,\nset the number of vehicles per lance below.\nDefault 4.\nIncompatible with individual initiative. +GameOptionsInfo.option.mek_lance_movement.description=If checked, Meks must move as a complete lance at once, set the number of vehicles per lance below. Default 4. Incompatible with individual initiative. GameOptionsInfo.option.mek_lance_movement_number.displayableName=Number of meks per lance -GameOptionsInfo.option.mek_lance_movement_number.description=The number of meks that have to move for every turn.\nOnly used if Mek Lance Movement is checked.\nDefault of 4. +GameOptionsInfo.option.mek_lance_movement_number.description=The number of meks that have to move for every turn. Only used if Mek Lance Movement is checked. Default of 4. GameOptionsInfo.option.vehicle_lance_movement.displayableName=TacOps Vehicle Lance Movement -GameOptionsInfo.option.vehicle_lance_movement.description=If checked,\nVehicles must move as a complete lance at once,\nset the number of vehicles per lance below.\nDefault 4.\nIncompatible with individual initiative. +GameOptionsInfo.option.vehicle_lance_movement.description=If checked, Vehicles must move as a complete lance at once, set the number of vehicles per lance below. Default 4. Incompatible with individual initiative. GameOptionsInfo.option.vehicle_lance_movement_number.displayableName=Number of vehicles per lance -GameOptionsInfo.option.vehicle_lance_movement_number.description=The number of vehicles that have to move for every Mek.\nOnly used if TacOps Vehicle Lance Movement is checked.\nDefault of 4. +GameOptionsInfo.option.vehicle_lance_movement_number.description=The number of vehicles that have to move for every Mek. Only used if TacOps Vehicle Lance Movement is checked. Default of 4. GameOptionsInfo.option.vehicle_acceleration.displayableName=TacOps Vehicle Acceleration -GameOptionsInfo.option.vehicle_acceleration.description=If checked,\nVehicles must make a driving skill check to use flanking movement after not moving the previous turn. +GameOptionsInfo.option.vehicle_acceleration.description=If checked, Vehicles must make a driving skill check to use flanking movement after not moving the previous turn. GameOptionsInfo.option.reverse_gear.displayableName=TacOps Vehicle Reverse Gear -GameOptionsInfo.option.reverse_gear.description=If checked,\nVehicles may not mix backward and forward movement in the same round (except VTOL). +GameOptionsInfo.option.reverse_gear.description=If checked, Vehicles may not mix backward and forward movement in the same round (except VTOL). GameOptionsInfo.option.vehicle_turn_mode.displayableName=TacOps Vehicle Turn Mode -GameOptionsInfo.option.vehicle_turn_mode.description=If checked,\nVehicles must make a driving skill check if they attempt to make a turn too sharp for their speed. +GameOptionsInfo.option.vehicle_turn_mode.description=If checked, Vehicles must make a driving skill check if they attempt to make a turn too sharp for their speed. GameOptionsInfo.option.vehicle_advanced_maneuvers.displayableName=TacOps Vehicle Advanced Maneuvers -GameOptionsInfo.option.vehicle_advanced_maneuvers.description=If checked,\nVehicles may used overdrive, bootlegger, and controlled sideslip maneuvers\nand WiGEs get bonus MP for descent.\nOverdrive requires TacOps Sprinting. +GameOptionsInfo.option.vehicle_advanced_maneuvers.description=If checked, Vehicles may used overdrive, bootlegger, and controlled sideslip maneuversand WiGEs get bonus MP for descent. Overdrive requires TacOps Sprinting. GameOptionsInfo.option.tacops_hull_down.displayableName=TacOps Hull Down -GameOptionsInfo.option.tacops_hull_down.description=If checked,\nmechs and vehicles may go hull down for additional cover +GameOptionsInfo.option.tacops_hull_down.description=If checked, Meks and vehicles may go hull down for additional cover GameOptionsInfo.option.tacops_falling_expanded.displayableName=TacOps Falling (Expanded) -GameOptionsInfo.option.tacops_falling_expanded.description=If checked,\na mech that fails to make a piloting roll can go to hull down instead of taking falling damage.\nNOTE: only works if hull down is checked. +GameOptionsInfo.option.tacops_falling_expanded.description=If checked, a Mek that fails to make a piloting roll can go to hull down instead of taking falling damage. NOTE: only works if hull down is checked. GameOptionsInfo.option.tacops_attempting_stand.displayableName=TacOps Attempting to Stand -GameOptionsInfo.option.tacops_attempting_stand.description=If checked,\na 'Mech has a harder time standing up if it has damaged or destroyed arms +GameOptionsInfo.option.tacops_attempting_stand.description=If checked, a Mek has a harder time standing up if it has damaged or destroyed arms GameOptionsInfo.option.tacops_careful_stand.displayableName=TacOps Careful Stand -GameOptionsInfo.option.tacops_careful_stand.description=If checked,\n'Mech can spend the entire movement phase trying to stand with a -2 psr mod. +GameOptionsInfo.option.tacops_careful_stand.description=If checked, Meks can spend the entire movement phase trying to stand with a -2 psr mod. GameOptionsInfo.option.tacops_ziplines.displayableName=TacOps Zip Lines GameOptionsInfo.option.tacops_ziplines.description=If checked, Infantry without jump MP can unload from an airborne VTOL using zip lines(TO pg 219) GameOptionsInfo.option.no_immobile_vehicles.displayableName=(Unofficial) Vehicles not immobilized by crits -GameOptionsInfo.option.no_immobile_vehicles.description=If checked,\nvehicles with a drive or engine hit will not be counted as 'immobile' for purposes of determining to-hit numbers.\nUnchecked by default. +GameOptionsInfo.option.no_immobile_vehicles.description=If checked, vehicles with a drive or engine hit will not be counted as 'immobile' for purposes of determining to-hit numbers. \nUnchecked by default. GameOptionsInfo.option.vehicles_can_eject.displayableName=(Unofficial) Vehicles can be abandoned -GameOptionsInfo.option.vehicles_can_eject.description=If checked,\nvehicle crews can leave their unit (effectively removing it from the game).\nUnchecked by default. +GameOptionsInfo.option.vehicles_can_eject.description=If checked, vehicle crews can leave their unit (effectively removing it from the game). \nUnchecked by default. GameOptionsInfo.option.ejected_pilots_flee.displayableName=(Unofficial) Ejected Pilots Flee -GameOptionsInfo.option.ejected_pilots_flee.description=If checked,\nan ejected pilot (whether autoejected or not) is automatically fled from the field.\nUnchecked by default. +GameOptionsInfo.option.ejected_pilots_flee.description=If checked, an ejected pilot (whether autoejected or not) is automatically fled from the field. \nUnchecked by default. GameOptionsInfo.option.auto_abandon_unit.displayableName=(Unofficial) Auto Abandon Unit -GameOptionsInfo.option.auto_abandon_unit.description=If checked,\nMechWarriors are created in place of the destroyed Mek,\nno more hiding good pilots in downed meks. +GameOptionsInfo.option.auto_abandon_unit.description=If checked, MekWarriors are created in place of the destroyed Mek, no more hiding good pilots in downed meks. GameOptionsInfo.option.no_hover_charge.displayableName=(Unofficial) No charge attacks for Hover vehicles -GameOptionsInfo.option.no_hover_charge.description=If checked,\nHover vehicles may not make rams/charges.\nUnchecked by default. +GameOptionsInfo.option.no_hover_charge.description=If checked, Hover vehicles may not make rams/charges. \nUnchecked by default. GameOptionsInfo.option.no_premove_vibra.displayableName=(Unofficial) Do not damage Mek by Vibrabomb if it has not yet moved -GameOptionsInfo.option.no_premove_vibra.description=If checked,\nvibrabombs that explode will not damage Meks that have not yet finished their move.\nUnchecked by default. +GameOptionsInfo.option.no_premove_vibra.description=If checked, vibrabombs that explode will not damage Meks that have not yet finished their move. \nUnchecked by default. GameOptionsInfo.option.falls_end_movement.displayableName=(Unofficial) Falling ends movement -GameOptionsInfo.option.falls_end_movement.description=If checked,\na fall will end a unit's movement for the turn.\nIt cannot get up again or change facing until the next movement phase. +GameOptionsInfo.option.falls_end_movement.description=If checked, a fall will end a unit's movement for the turn. It cannot get up again or change facing until the next movement phase. GameOptionsInfo.option.psr_jump_heavy_woods.displayableName=(Unofficial) Jumping into heavy woods PSR -GameOptionsInfo.option.psr_jump_heavy_woods.description=If checked,\njumping into heavy woods will require a mech to succeed at an unmodified PSR or fall. +GameOptionsInfo.option.psr_jump_heavy_woods.description=If checked, jumping into heavy woods will require a Mek to succeed at an unmodified PSR or fall. GameOptionsInfo.option.no_night_move_pen.displayableName=(Unofficial) No Movement penalty for night/fog GameOptionsInfo.option.no_night_move_pen.description=If checked, units will not suffer the movement penalties listed in TacOps for night and fog conditions. GameOptionsInfo.group.advancedAeroRules.displayableName=Advanced Aerospace Rules GameOptionsInfo.option.aero_ground_move.displayableName=Allow aerospace units on ground maps -GameOptionsInfo.option.aero_ground_move.description=Aerospace units will be allowed to fly on ground mapsheets,\nper the rule on pg.\n92 of Total Warfare. +GameOptionsInfo.option.aero_ground_move.description=Aerospace units will be allowed to fly on ground mapsheets, per the rule on pg. 92 of Total Warfare. GameOptionsInfo.option.stratops_capital_fighter.displayableName=StratOps Capital Fighters GameOptionsInfo.option.stratops_capital_fighter.description=Fighters will be at capital-scale (this must be checked to use squadrons) GameOptionsInfo.option.fuel_consumption.displayableName=StratOps Fuel Consumption GameOptionsInfo.option.fuel_consumption.description=thrust costs fuel points GameOptionsInfo.option.stratops_conv_fusion_bonus.displayableName=StratOps Conventional Fusion Fuel Bonus -GameOptionsInfo.option.stratops_conv_fusion_bonus.description=If checked,\nconventional fighters using fusion engines will be more fuel efficient than aerospace fighters +GameOptionsInfo.option.stratops_conv_fusion_bonus.description=If checked, conventional fighters using fusion engines will be more fuel efficient than aerospace fighters GameOptionsInfo.option.stratops_harjel.displayableName=StratOps HarJel GameOptionsInfo.option.stratops_harjel.description=All clan large craft gain additional protection from HarJel GameOptionsInfo.option.stratops_grav_effects.displayableName=StratOps Gravitational Effects @@ -415,21 +417,21 @@ GameOptionsInfo.option.heat_by_bay.description=Heat is produced by individual we GameOptionsInfo.option.atmospheric_control.displayableName=StratOps Advanced Atmospheric Control Rolls GameOptionsInfo.option.atmospheric_control.description=atmospheric control rolls only made for damage above the damage threshold GameOptionsInfo.option.ammo_explosions.displayableName=StratOps Ammo explosions -GameOptionsInfo.option.ammo_explosions.description=Roll 2D6 on critical hits to ammo-fed weapons.\nOn a roll of 10 or higher,\nthe ammunition explodes. +GameOptionsInfo.option.ammo_explosions.description=Roll 2D6 on critical hits to ammo-fed weapons. On a roll of 10 or higher, the ammunition explodes. GameOptionsInfo.option.stratops_aa_fire.displayableName=(Unofficial) Advanced Anti-Aircraft GameOptionsInfo.option.stratops_aa_fire.description=If checked, velocity is added to the to-hit roll; Was in SO pg 94 since removed (previously affected range/position but this is now a core TW rule, pg 107) GameOptionsInfo.option.stratops_aaa_laser.displayableName=StratOps AAA Capital Laser Targeting -GameOptionsInfo.option.stratops_aaa_laser.description=If checked,\ncapital laser bays can change mode to target small craft. +GameOptionsInfo.option.stratops_aaa_laser.description=If checked, capital laser bays can change mode to target small craft. GameOptionsInfo.option.stratops_adv_pointdef.displayableName=StratOps Advanced Point Defense -GameOptionsInfo.option.stratops_adv_pointdef.description=If checked,\npoint defense bays can target incoming missile attacks. +GameOptionsInfo.option.stratops_adv_pointdef.description=If checked, point defense bays can target incoming missile attacks. GameOptionsInfo.option.stratops_bracket_fire.displayableName=StratOps Bracketing Fire -GameOptionsInfo.option.stratops_bracket_fire.description=If checked,\ncapital and sub-capital weapon bays can use the bracketing fire mode as per the rules in StratOps. +GameOptionsInfo.option.stratops_bracket_fire.description=If checked, capital and sub-capital weapon bays can use the bracketing fire mode as per the rules in StratOps. GameOptionsInfo.option.stratops_ecm.displayableName=StratOps Electronic Warfare -GameOptionsInfo.option.stratops_ecm.description=If checked,\nunits can use ECM and ECCM measures in space as described in StratOps. +GameOptionsInfo.option.stratops_ecm.description=If checked, units can use ECM and ECCM measures in space as described in StratOps. GameOptionsInfo.option.stratops_sensor_shadow.displayableName=StratOps Sensor Shadows GameOptionsInfo.option.stratops_sensor_shadow.description=Smaller units can gain defensive benefits from being near larger craft. GameOptionsInfo.option.stratops_over_penetrate.displayableName=StratOps Over-Penetration Fire -GameOptionsInfo.option.stratops_over_penetrate.description=If checked,\nweapons fire that does SI damage may over-penetrate and damage the opposite side,\ninstead of structural integrity. +GameOptionsInfo.option.stratops_over_penetrate.description=If checked, weapons fire that does SI damage may over-penetrate and damage the opposite side, instead of structural integrity. GameOptionsInfo.option.stratops_space_bomb.displayableName=StratOps Space Bombing GameOptionsInfo.option.stratops_space_bomb.description=Allow space bombing against large craft GameOptionsInfo.option.stratops_bearings_only.displayableName=StratOps Capital Missile Bearings-Only Launch @@ -443,7 +445,7 @@ GameOptionsInfo.option.stratops_advanced_sensors.description=Advanced sensor rul GameOptionsInfo.option.variable_damage_thresh.displayableName=StratOps variable damage thresholds GameOptionsInfo.option.variable_damage_thresh.description=Damage threshold for critical hits depends depends on current armor levels rather than initial armor levels GameOptionsInfo.option.at2_nukes.displayableName=Allow nuclear weapons -GameOptionsInfo.option.at2_nukes.description=Allows Alamo and Santa Anna missiles as ship-to-ship weapons,\nper the rules in Jihad Hot Spots,\n3070 +GameOptionsInfo.option.at2_nukes.description=Allows Alamo and Santa Anna missiles as ship-to-ship weapons, per the rules in Jihad Hot Spots, 3070 GameOptionsInfo.option.return_flyover.displayableName=(Unofficial) Allow return flyovers GameOptionsInfo.option.return_flyover.description=Allows Aero units that have flown off the map to return after a number of turns equal to 1 + roundup(velocity/4) (+2 if OOC). GameOptionsInfo.option.aa_move_mod.displayableName=(Unofficial) Reduced to hit-mods when using StratOps AAA @@ -453,7 +455,7 @@ GameOptionsInfo.option.single_no_cap.description=When checked, single fighters a GameOptionsInfo.option.allow_large_squadrons.displayableName=(Unofficial) Allow large (up to 10) fighter squadrons GameOptionsInfo.option.allow_large_squadrons.description=Allow up to 10 fighters in a squadron instead of the arbitrary 6 of the official record sheets. GameOptionsInfo.option.aero_sanity.displayableName=(Unofficial) Aero Sanity Mod for damage -GameOptionsInfo.option.aero_sanity.description= A modification of aero damage rules to make damage consistent across different unit types.\nSee document in the docs folder for details. +GameOptionsInfo.option.aero_sanity.description= A modification of aero damage rules to make damage consistent across different unit types. See document in the docs folder for details. GameOptionsInfo.option.cargo_bay_damage.displayableName=(Unofficial) Damage Cargo/Transport Bays on Cargo Critical Hit GameOptionsInfo.option.cargo_bay_damage.description= If a Cargo critical hit is taken, the cargo/transport bay itself suffers damage in addition to the cargo/units inside. GameOptionsInfo.option.aero_artillery_munitions.displayableName=(Unofficial) DropShips can use alternate artillery munitions @@ -464,51 +466,51 @@ GameOptionsInfo.option.expanded_kf_drive_damage.description=If a K-F Drive criti GameOptionsInfo.group.initiative.displayableName=Initiative Rules GameOptionsInfo.option.inf_move_even.displayableName=(Unofficial) Infantry don't count for movement initiative -GameOptionsInfo.option.inf_move_even.description=If checked,\nInfantry units no longer count towards the initiative for the player's team in the movement phase,\nunless that team has no other units.\n Instead,\ntheir moves are distributed 'evenly' throughout the turn.\n The move order of Meks and Vehicles ignores the presence of Infantry.\n The order of the fire phase is unaffected.\nMutually exclusive with "multiple Infantry for every Mek or Vehicle".\nUnchecked by default. +GameOptionsInfo.option.inf_move_even.description=If checked, Infantry units no longer count towards the initiative for the player's team in the movement phase, unless that team has no other units. Instead, their moves are distributed 'evenly' throughout the turn. The move order of Meks and Vehicles ignores the presence of Infantry. The order of the fire phase is unaffected. Mutually exclusive with "multiple Infantry for every Mek or Vehicle". \nUnchecked by default. GameOptionsInfo.option.inf_deploy_even.displayableName=(Unofficial) Infantry don't count for deployment initiative -GameOptionsInfo.option.inf_deploy_even.description=If checked,\nInfantry units no longer count towards the initiative for the player's team in the deployment phase,\nunless that team has no other units.\n Instead,\ntheir deployments are distributed 'evenly' throughout the turn.\n The deployment order of Meks and Vehicles ignores the presence of Infantry.\nThe above option,\n"Infantry move after Meks and Vehicles" must also be checked to use this option.\nUnchecked by default. +GameOptionsInfo.option.inf_deploy_even.description=If checked, Infantry units no longer count towards the initiative for the player's team in the deployment phase, unless that team has no other units. Instead, their deployments are distributed 'evenly' throughout the turn. The deployment order of Meks and Vehicles ignores the presence of Infantry. The above option, "Infantry move after Meks and Vehicles" must also be checked to use this option. \nUnchecked by default. GameOptionsInfo.option.inf_move_later.displayableName=(Unofficial) Infantry moves after that players other units -GameOptionsInfo.option.inf_move_later.description=If checked,\neach player must move all their other units before they move their Infantry.\n If "ProtoMechs move after that team's other units" is also checked,\nthen Infantry and Protomechs are lumped together into the same category.\nMutually exclusive with "multiple Infantry for every Mek or Vehicle" and "Infantry don't count for movement initiative".\nUnchecked by default. +GameOptionsInfo.option.inf_move_later.description=If checked, each player must move all their other units before they move their Infantry. If "ProtoMeks move after that team's other units" is also checked, then Infantry and ProtoMeks are lumped together into the same category. Mutually exclusive with "multiple Infantry for every Mek or Vehicle" and "Infantry don't count for movement initiative". \nUnchecked by default. GameOptionsInfo.option.inf_move_multi.displayableName=(Unofficial) move multiple Infantry for every Mek or Vehicle -GameOptionsInfo.option.inf_move_multi.description=If checked,\nmultiple infantry units will have to move in place of a single Mek or Vehicle.\n Set the number per mech in the appropriate Game Option.\n If there are less than above units remaining,\nthey all must move.\n The move order includes the presence of Infantry.\nMutually exclusive with "Infantry move after Meks and Vehicles".\nUnchecked by default. -GameOptionsInfo.option.protos_move_even.displayableName=(Unofficial) ProtoMechs don't count for movement initiative -GameOptionsInfo.option.protos_move_even.description=If checked,\nProtomech units no longer count towards the initiative for the player's team in the movement phase,\nunless that team has no other units.\n Instead,\ntheir moves are distributed 'evenly' throughout the turn.\n The move order of Meks and Vehicles ignores the presence of Protomechs.\n The order of the fire phase is unaffected.\nMutually exclusive with "multiple Protomechs for every Mek or Vehicle".\nUnchecked by default. -GameOptionsInfo.option.protos_deploy_even.displayableName=(Unofficial) ProtoMechs don't count for deployment initiative -GameOptionsInfo.option.protos_deploy_even.description=If checked,\nProtomech units no longer count towards the initiative for the player's team in the deployment phase,\nunless that team has no other units.\n Instead,\ntheir deployments are distributed 'evenly' throughout the turn.\n The deployment order of Meks and Vehicles ignores the presence of Protomechs.\nThe above option,\n"Protomechs move after Meks and Vehicles" must also be checked to use this option.\nUnchecked by default. -GameOptionsInfo.option.protos_move_later.displayableName=(Unofficial) ProtoMechs move after that players other units -GameOptionsInfo.option.protos_move_later.description=If checked,\neach player must move all their other units before they move their ProtoMechs.\n If "ProtoMechs moves after that team's other units" is also checked,\nthen Infantry and Protomechs are lumped together into the same category.\nMutually exclusive with "multiple Protomechs for every Mek or Vehicle" and "Protomechs don't count for movement initiative".\nUnchecked by default. -GameOptionsInfo.option.protos_move_multi.displayableName=(Unofficial) move multiple ProtoMechs for every Mek or Vehicle -GameOptionsInfo.option.protos_move_multi.description=If checked,\nmultiple ProtoMechs will have to move in place of a single Mek or Vehicle.\nSet the number per mech in the appropriate Game Option.\n If there are less than above specified protos remaining,\nthey all must move.\n The move order includes the presence of Protomechs.\nMutually exclusive with "Protomechs move after Meks and Vehicles".\nUnchecked by default. -GameOptionsInfo.option.inf_proto_move_multi.displayableName=(Unofficial) number of Infantry/ProtoMech to move per Mek -GameOptionsInfo.option.inf_proto_move_multi.description=The number of Infantry units/Protomechs that have to move for every Mek or Vehicle,\nif the inf_move_multi or the protos_move_multi option is selected.\nDefault of 3. +GameOptionsInfo.option.inf_move_multi.description=If checked, multiple infantry units will have to move in place of a single Mek or Vehicle. Set the number per Mek in the appropriate Game Option. If there are less than above units remaining, they all must move. The move order includes the presence of Infantry. Mutually exclusive with "Infantry move after Meks and Vehicles". \nUnchecked by default. +GameOptionsInfo.option.protos_move_even.displayableName=(Unofficial) ProtoMeks don't count for movement initiative +GameOptionsInfo.option.protos_move_even.description=If checked, ProtoMek units no longer count towards the initiative for the player's team in the movement phase, unless that team has no other units. Instead, their moves are distributed 'evenly' throughout the turn. The move order of Meks and Vehicles ignores the presence of ProtoMeks. The order of the fire phase is unaffected. Mutually exclusive with "multiple ProtoMeks for every Mek or Vehicle". \nUnchecked by default. +GameOptionsInfo.option.protos_deploy_even.displayableName=(Unofficial) ProtoMeks don't count for deployment initiative +GameOptionsInfo.option.protos_deploy_even.description=If checked, ProtoMek units no longer count towards the initiative for the player's team in the deployment phase, unless that team has no other units. Instead, their deployments are distributed 'evenly' throughout the turn. The deployment order of Meks and Vehicles ignores the presence of ProtoMeks. The above option, "ProtoMeks move after Meks and Vehicles" must also be checked to use this option. \nUnchecked by default. +GameOptionsInfo.option.protos_move_later.displayableName=(Unofficial) ProtoMeks move after that players other units +GameOptionsInfo.option.protos_move_later.description=If checked, each player must move all their other units before they move their ProtoMeks. If "ProtoMeks moves after that team's other units" is also checked, then Infantry and ProtoMeks are lumped together into the same category. Mutually exclusive with "multiple ProtoMeks for every Mek or Vehicle" and "ProtoMeks don't count for movement initiative". \nUnchecked by default. +GameOptionsInfo.option.protos_move_multi.displayableName=(Unofficial) move multiple ProtoMeks for every Mek or Vehicle +GameOptionsInfo.option.protos_move_multi.description=If checked, multiple ProtoMeks will have to move in place of a single Mek or Vehicle. Set the number per Mek in the appropriate Game Option. If there are less than above specified protos remaining, they all must move. The move order includes the presence of ProtoMeks. Mutually exclusive with "ProtoMeks move after Meks and Vehicles". \nUnchecked by default. +GameOptionsInfo.option.inf_proto_move_multi.displayableName=(Unofficial) number of Infantry/ProtoMek to move per Mek +GameOptionsInfo.option.inf_proto_move_multi.description=The number of Infantry units/ProtoMeks that have to move for every Mek or Vehicle, if the inf_move_multi or the protos_move_multi option is selected. Default of 3. GameOptionsInfo.option.simultaneous_deployment.displayableName=(Unofficial) Simultaneous deployment phase -GameOptionsInfo.option.simultaneous_deployment.description=If checked,\nall players declare deployment in parallel.\nConflicts resolved according to double blind rules -TBD- +GameOptionsInfo.option.simultaneous_deployment.description=If checked, all players declare deployment in parallel. Conflicts resolved according to double blind rules -TBD- GameOptionsInfo.option.simultaneous_movement.displayableName=(Unofficial) Simultaneous movement phase -GameOptionsInfo.option.simultaneous_movement.description=If checked,\nall players declare movement in parallel.\nConflicts resolved according to double blind rules -TBD- +GameOptionsInfo.option.simultaneous_movement.description=If checked, all players declare movement in parallel. Conflicts resolved according to double blind rules -TBD- GameOptionsInfo.option.simultaneous_targeting.displayableName=(Unofficial) Simultaneous targeting phase -GameOptionsInfo.option.simultaneous_targeting.description=If checked,\nall players declare offboard attacks in the targeting phase in parallel +GameOptionsInfo.option.simultaneous_targeting.description=If checked, all players declare offboard attacks in the targeting phase in parallel GameOptionsInfo.option.simultaneous_firing.displayableName=(Unofficial) Simultaneous firing phase -GameOptionsInfo.option.simultaneous_firing.description=If checked,\nall players declare onboard attacks in the firing phase in parallel.\nAttack arrows are not shown to other players. +GameOptionsInfo.option.simultaneous_firing.description=If checked, all players declare onboard attacks in the firing phase in parallel. Attack arrows are not shown to other players. GameOptionsInfo.option.simultaneous_physical.displayableName=(Unofficial) Simultaneous physical phase -GameOptionsInfo.option.simultaneous_physical.description=If checked,\nall players declare attacks in the physical phase in parallel.\nAttack arrows are not shown to other players. +GameOptionsInfo.option.simultaneous_physical.description=If checked, all players declare attacks in the physical phase in parallel. Attack arrows are not shown to other players. GameOptionsInfo.option.front_load_initiative.displayableName=(Unofficial) Front load initiative -GameOptionsInfo.option.front_load_initiative.description=If checked,\nthe team with the greater number of units moves them at the beginning of the initiative phase rather than the end,\ne.g.\nABBAB instead of ABABB as in the TW rules. +GameOptionsInfo.option.front_load_initiative.description=If checked, the team with the greater number of units moves them at the beginning of the initiative phase rather than the end, e.g. ABBAB instead of ABABB as in the TW rules. GameOptionsInfo.option.initiative_streak_compensation.displayableName=(Unofficial) Initiative streak compensation -GameOptionsInfo.option.initiative_streak_compensation.description=If checked,\nawards an increasing initiative roll bonus to a team that loses initiative several times in a row.\n Incompatible with Individual Initiative. +GameOptionsInfo.option.initiative_streak_compensation.description=If checked, awards an increasing initiative roll bonus to a team that loses initiative several times in a row. Incompatible with Individual Initiative. GameOptionsInfo.group.rpg.displayableName=RPG Related GameOptionsInfo.option.pilot_advantages.displayableName=Pilot Special Abilities -GameOptionsInfo.option.pilot_advantages.description=If checked,\nplayers can add additional advantages to their pilots through the 'configure mech' window. +GameOptionsInfo.option.pilot_advantages.description=If checked, players can add additional advantages to their pilots through the 'Configure Unit' window. GameOptionsInfo.option.edge.displayableName=Edge GameOptionsInfo.option.edge.description=if checked, pilots can be assigned edge which can trigger re-rolls in certain situations GameOptionsInfo.option.manei_domini.displayableName=Manei Domini Options -GameOptionsInfo.option.manei_domini.description=VDNI,\nBuffered VDNI,\nand Pain Shunt as pilot options +GameOptionsInfo.option.manei_domini.description=VDNI, Buffered VDNI, and Pain Shunt as pilot options GameOptionsInfo.option.individual_initiative.displayableName=(Unofficial) Individual Initiative -GameOptionsInfo.option.individual_initiative.description=If checked,\neach unit has its own initiative roll,\nand must move in that fixed order.\n Good for zellbrigen or RPG style games.\nIncompatible with the lance movement options. +GameOptionsInfo.option.individual_initiative.description=If checked, each unit has its own initiative roll, and must move in that fixed order. Good for zellbrigen or RPG style games. Incompatible with the lance movement options. GameOptionsInfo.option.command_init.displayableName=(Unofficial) Commander Initiative GameOptionsInfo.option.command_init.description=Each unit will have a commander initiative bonus and the highest bonus among active units for each team will be added to initiative. GameOptionsInfo.option.rpg_gunnery.displayableName=RPG Gunnery Skills (Legacy) [Gunnery Laser/Gunnery Missile/Gunnery Ballistic/Piloting] -GameOptionsInfo.option.rpg_gunnery.description=Separate skill levels for laser,\nmissile,\nand ballistic weapons. +GameOptionsInfo.option.rpg_gunnery.description=Separate skill levels for laser, missile, and ballistic weapons. GameOptionsInfo.option.artillery_skill.displayableName=Separate Artillery Skill GameOptionsInfo.option.artillery_skill.description=Use a separate skill for artillery attacks GameOptionsInfo.option.toughness.displayableName=(Unofficial) Toughness Bonus @@ -518,21 +520,21 @@ GameOptionsInfo.option.conditional_ejection.description=Only fire the ejection s GameOptionsInfo.option.manual_shutdown.displayableName=(Unofficial) Manual Shutdown/Startup GameOptionsInfo.option.manual_shutdown.description=Adds a button in the movement phase for manual shutdown/startup. GameOptionsInfo.option.begin_shutdown.displayableName=(Unofficial) Begin Game Shutdown -GameOptionsInfo.option.begin_shutdown.description=Adds a deployment option to begin the game in a shutdown state.\nRequires Manual Shutdown/Startup +GameOptionsInfo.option.begin_shutdown.description=Adds a deployment option to begin the game in a shutdown state. Requires Manual Shutdown/Startup GameOptionsInfo.option.max_external_heat.displayableName=(Unofficial) Maximum Heat from External Heat Sources GameOptionsInfo.option.max_external_heat.description=The maximum heat a unit takes per round from external heat sources (+15 is the official maximum). GameOptionsInfo.option.case_pilot_damage.displayableName=(Unofficial) CASE/CASEII reduces pilot damage on ammo explosion GameOptionsInfo.option.case_pilot_damage.description=If an ammo explosion occurs in a location protected by CASE/CASEII the pilot damage is reduced by 1. GameOptionsInfo.option.no_forced_primary_targets.displayableName=(Unofficial) Do not force primary target to be in front arc -GameOptionsInfo.option.no_forced_primary_targets.description=If selected the Total Warfare rules on page 109\nthat require the primary target to be in the front arc are ignored +GameOptionsInfo.option.no_forced_primary_targets.description=If selected the Total Warfare rules on page 109 that require the primary target to be in the front arc are ignored PilotOptionsInfo.group.adv.displayableName=Advantages PilotOptionsInfo.option.animal_mimic.displayableName=Animal Mimicry (CamOps) -PilotOptionsInfo.option.animal_mimic.description=Allows a Quad Mech or ProtoMech, or a bipedal Mech or ProtoMech with the animalistic quirk, the following benefits.\n-1 MP per hex of Woods and Jungle terrain.\n In addition quads gain a -1 to any quad related PSR check.\nNOTE: The quirk should be used only on bipedal units that have an animal like appearance. +PilotOptionsInfo.option.animal_mimic.description=Allows a Quad Mek or ProtoMek, or a bipedal Mek or ProtoMek with the animalistic quirk, the following benefits.\n-1 MP per hex of Woods and Jungle terrain.\n In addition quads gain a -1 to any quad related PSR check.\nNOTE: The quirk should be used only on bipedal units that have an animal like appearance. PilotOptionsInfo.option.blood_stalker.displayableName=Blood Stalker (CamOps) PilotOptionsInfo.option.blood_stalker.description=Unit has -1 bonus against designated target, +2 penalty against all others; lasts until target retreats, can only be used once per battle. PilotOptionsInfo.option.dodge_maneuver.displayableName= Dodge (MaxTech) -PilotOptionsInfo.option.dodge_maneuver.description=Enables the unit to make a dodge maneuver instead of a physical attack.\nThis maneuver adds +2 to the BTH to physical attacks against the unit.\nNOTE: The dodge maneuver is declared during the weapons phase.\nNote: This ability is only used for BattleMechs. +PilotOptionsInfo.option.dodge_maneuver.description=Enables the unit to make a dodge maneuver instead of a physical attack.\nThis maneuver adds +2 to the BTH to physical attacks against the unit.\nNOTE: The dodge maneuver is declared during the weapons phase.\nNote: This ability is only used for BattleMeks. PilotOptionsInfo.option.eagle_eyes.displayableName= Eagle's Eyes (CamOps) PilotOptionsInfo.option.eagle_eyes.description= Acts as an active probe or extends range of existing active probe. Also makes avoiding minefields easier PilotOptionsInfo.option.hot_dog.displayableName= Hot Dog (CamOps) @@ -544,7 +546,7 @@ PilotOptionsInfo.option.hopping_jack.description=Unit only suffers a +2 to-hit p PilotOptionsInfo.option.maneuvering_ace.displayableName=Maneuvering Ace (CamOps) PilotOptionsInfo.option.maneuvering_ace.description=Enables the unit to move laterally like a Quad.\nQuads can move laterally for 1 less MP.\nAerospace units can perform maneuvers for 1 less thrust point.\nUnits also receive a -1 BTH to rolls against skidding, sideslipping, and going out of control. PilotOptionsInfo.option.melee_specialist.displayableName=Melee Specialist (CamOps) -PilotOptionsInfo.option.melee_specialist.description=Enables the unit to do 1 additional point of damage with physical attacks and applies a -1 to-hit modifier to physical attacks.\nNote: This ability is only used for BattleMechs. +PilotOptionsInfo.option.melee_specialist.description=Enables the unit to do 1 additional point of damage with physical attacks and applies a -1 to-hit modifier to physical attacks.\nNote: This ability is only used for BattleMeks. PilotOptionsInfo.option.melee_master.displayableName=Melee Master (CamOps) PilotOptionsInfo.option.melee_master.description=Enables the unit to do one additional kick, punch, or club attack on the same opponent. PilotOptionsInfo.option.tm_forest_ranger.displayableName=Terrain Master [Forest Ranger] (CamOps) @@ -564,7 +566,7 @@ PilotOptionsInfo.option.oblique_attacker.description=The penalty for indirect fi PilotOptionsInfo.option.oblique_artillery.displayableName=Oblique Artilleryman (CamOps) PilotOptionsInfo.option.oblique_artillery.description=Reduces scatter distance by two hexes. PilotOptionsInfo.option.pain_resistance.displayableName=Pain Resistance (MaxTech) -PilotOptionsInfo.option.pain_resistance.description=When making consciousness rolls,\n1 is added to all rolls.\nAlso,\ndamage received from ammo explosions is reduced to 1.\nNote: This ability is only used for BattleMechs. +PilotOptionsInfo.option.pain_resistance.description=When making consciousness rolls,\n1 is added to all rolls.\nAlso,\ndamage received from ammo explosions is reduced to 1.\nNote: This ability is only used for BattleMeks. PilotOptionsInfo.option.range_master.displayableName= RangeMaster (CamOps) PilotOptionsInfo.option.range_master.description=Range modifiers are swapped with short range (Medium, Long, or Extreme). PilotOptionsInfo.option.sniper.displayableName= Sniper (CamOps) @@ -626,28 +628,28 @@ PilotOptionsInfo.group.edge.displayableName=Edge PilotOptionsInfo.option.edge.displayableName=Edge (MaxTech) PilotOptionsInfo.option.edge.description=Certain rolls against this unit have to be rerolled. -PilotOptionsInfo.option.edge_when_tac.displayableName= (Mech) Use Edge for TACs +PilotOptionsInfo.option.edge_when_tac.displayableName= (Mek) Use Edge for TACs PilotOptionsInfo.option.edge_when_tac.description=Through Armor Criticals will be rerolled with Edge. -PilotOptionsInfo.option.edge_when_headhit.displayableName= (Mech) Use Edge for head hits +PilotOptionsInfo.option.edge_when_headhit.displayableName= (Mek) Use Edge for head hits PilotOptionsInfo.option.edge_when_headhit.description=Hits to the head will be rerolled with Edge. -PilotOptionsInfo.option.edge_when_ko.displayableName= (Mech) Use Edge for pilot KOs +PilotOptionsInfo.option.edge_when_ko.displayableName= (Mek) Use Edge for pilot KOs PilotOptionsInfo.option.edge_when_ko.description=Pilot blackout rolls will be rerolled with Edge. -PilotOptionsInfo.option.edge_when_explosion.displayableName= (Mech) Use Edge for explosions. +PilotOptionsInfo.option.edge_when_explosion.displayableName= (Mek) Use Edge for explosions. PilotOptionsInfo.option.edge_when_explosion.description=Critical hits on explosive devices will be rerolled with Edge -PilotOptionsInfo.option.edge_when_masc_fails.displayableName= (Mech) Use Edge for MASC/Supercharger failures. +PilotOptionsInfo.option.edge_when_masc_fails.displayableName= (Mek) Use Edge for MASC/Supercharger failures. PilotOptionsInfo.option.edge_when_masc_fails.description=MASC/Supercharger failures will be rerolled with Edge -PilotOptionsInfo.option.edge_when_aero_alt_loss.displayableName= (Aero) Use Edge for atmospheric altitude loss. +PilotOptionsInfo.option.edge_when_aero_alt_loss.displayableName= (Aero) Use Edge for atmospheric altitude loss. PilotOptionsInfo.option.edge_when_aero_alt_loss.description=Altitude loss that results in a crash will be rerolled with Edge. -PilotOptionsInfo.option.edge_when_aero_explosion.displayableName= (Aero) Use Edge for explosions. +PilotOptionsInfo.option.edge_when_aero_explosion.displayableName= (Aero) Use Edge for explosions. PilotOptionsInfo.option.edge_when_aero_explosion.description=Critical hits on explosive equipment and fuel tanks will be rerolled with Edge. -PilotOptionsInfo.option.edge_when_aero_ko.displayableName= (Aero, ASF/CF/SC only) Use Edge for pilot KOs. +PilotOptionsInfo.option.edge_when_aero_ko.displayableName= (Aero, ASF/CF/SC only) Use Edge for pilot KOs. PilotOptionsInfo.option.edge_when_aero_ko.description=Pilot blackout rolls will be rerolled with Edge. (Not applicable to capital fighters, squadrons or DS/JS/WS/SS) -PilotOptionsInfo.option.edge_when_aero_lucky_crit.displayableName= (Aero) Use Edge for crits resulting from 12-to-hit rolls. +PilotOptionsInfo.option.edge_when_aero_lucky_crit.displayableName= (Aero) Use Edge for crits resulting from 12-to-hit rolls. PilotOptionsInfo.option.edge_when_aero_lucky_crit.description=Critical hits resulting from to-hit rolls of 12 will be rerolled with Edge. -PilotOptionsInfo.option.edge_when_aero_nuke_crit.displayableName= (Aero) Use Edge for crits resulting from nuclear missile hits. +PilotOptionsInfo.option.edge_when_aero_nuke_crit.displayableName= (Aero) Use Edge for crits resulting from nuclear missile hits. PilotOptionsInfo.option.edge_when_aero_nuke_crit.description=Critical hits resulting in direct SI damage from nuclear missile hits will be rerolled with Edge. -PilotOptionsInfo.option.edge_when_aero_unit_cargo_lost.displayableName= (Aero, SC/DS/JS/WS/SS only) Use Edge for crits resulting in the loss of transported units. +PilotOptionsInfo.option.edge_when_aero_unit_cargo_lost.displayableName= (Aero, SC/DS/JS/WS/SS only) Use Edge for crits resulting in the loss of transported units. PilotOptionsInfo.option.edge_when_aero_unit_cargo_lost.description=Critical hits resulting in the loss of transported units will be rerolled with Edge. PilotOptionsInfo.group.md.displayableName=Manei Domini Implants @@ -675,7 +677,7 @@ PilotOptionsInfo.option.gas_effuser_toxin.displayableName=Gas Effuser (Toxin) (N PilotOptionsInfo.option.gas_effuser_toxin.description=Gas Effuser (Toxin) \nSee IO pg 79 for details. PilotOptionsInfo.option.dermal_armor.displayableName=Myomer Implants (Dermal Armor) PilotOptionsInfo.option.dermal_armor.description=Units are more resistant to damage. \nSee IO pg 80 for details. -PilotOptionsInfo.option.dermal_camo_armor.displayableName=Myomer Implants (Dermal Armor Camoflage) +PilotOptionsInfo.option.dermal_camo_armor.displayableName=Myomer Implants (Dermal Armor Camoflage) PilotOptionsInfo.option.dermal_camo_armor.description=Myomer Implants (Dermal Armor Camoflage) \nSee IO pg 80 for details. PilotOptionsInfo.option.tsm_implant.displayableName=Myomer Implants (Triple Strength) PilotOptionsInfo.option.tsm_implant.description=Units receive benefits as described in \nSee IO pg 81 for details. @@ -688,7 +690,7 @@ PilotOptionsInfo.option.bvdni.description=Pilot is more connected with vehicle.\ PilotOptionsInfo.option.pl_enhanced.displayableName=Prosthetic limbs, Enhanced (Not Implemented) PilotOptionsInfo.option.pl_enhanced.description=Additional Damage to unit weapons.\n See IO 84 for details PilotOptionsInfo.option.pl_ienhanced.displayableName=Prosthetic Limbs, Improved Enhanced (Not Implemented) -PilotOptionsInfo.option.pl_ienhanced.description= Like the Enhanced Limbs but allows multiple enhancements. \nSee IO pg 83 +PilotOptionsInfo.option.pl_ienhanced.description= Like the Enhanced Limbs but allows multiple enhancements. \nSee IO pg 83 PilotOptionsInfo.option.grappler.description=Was Grappler/Electromagnet - \nSee IO pg 84 for details PilotOptionsInfo.option.pl_masc.displayableName=Prosthetic leg MASC PilotOptionsInfo.option.pl_masc.description=Conventional Infantry units can go faster. @@ -759,7 +761,7 @@ PartialRepairsInfo.option.mech_gyro_replace.description=+1 to piloting rolls QuirksInfo.group.pos_quirks.displayableName=Positive Quirks QuirksInfo.option.animalistic.displayableName=Animalistic Appearance -QuirksInfo.option.animalistic.description=Given to bipedal Mechs and ProtoMechs whose appearance resembles that of an animal (ie Kodiak and Mandrill) (CO pg 72) +QuirksInfo.option.animalistic.description=Given to bipedal Meks and ProtoMeks whose appearance resembles that of an animal (ie Kodiak and Mandrill) (CO pg 72) QuirksInfo.option.anti_air.displayableName=Anti-Aircraft Targeting QuirksInfo.option.anti_air.description=-2 to hit airborne units. (SO pg 193) QuirksInfo.option.atmo_flyer.displayableName=Atmospheric Flyer @@ -776,9 +778,9 @@ QuirksInfo.option.battle_fists_ra.displayableName=Battle Fists (RA) QuirksInfo.option.battle_fists_ra.description=-1 to-hit when making punches with hands (RS NTNU 3145 pg 12) QuirksInfo.option.combat_computer.displayableName=Combat Computer QuirksInfo.option.combat_computer.description=The combat computer reduces heat level by four points. (SO pg 193) -QuirksInfo.option.command_mech.displayableName=Command 'Mech +QuirksInfo.option.command_mech.displayableName=Command Mek QuirksInfo.option.command_mech.description=+1 to initiative. (SO pg 193) -QuirksInfo.option.compact_mech.displayableName=Compact Mech +QuirksInfo.option.compact_mech.displayableName=Compact Mek QuirksInfo.option.compact_mech.description=No game effect,\nincluded for completeness. (RS NTNU 3145 pg 12) QuirksInfo.option.cowl.displayableName=Cowl QuirksInfo.option.cowl.description=Extra head armor. (SO pg 193) @@ -797,7 +799,7 @@ QuirksInfo.option.ext_twist.description=The unit can torso twist 2 hexsides. (SO QuirksInfo.option.fast_reload.displayableName=Fast Reload QuirksInfo.option.fast_reload.description=No game effect,\ncurrently. (SO pg 194) QuirksInfo.option.fine_manipulators.displayableName=Fine Manipulators -QuirksInfo.option.fine_manipulators.description=Mech is capable of delicate work. No game effect,\nNot Implemented (BMM pg 84) +QuirksInfo.option.fine_manipulators.description=Mek is capable of delicate work. No game effect,\nNot Implemented (BMM pg 84) QuirksInfo.option.good_rep_1.displayableName=Good Reputation (1) QuirksInfo.option.good_rep_1.description=Unit costs 10% more C-bills.\nincluded for completeness. \nNot Implemented (BMM pg 85) QuirksInfo.option.good_rep_2.displayableName=Good Reputation (2) @@ -811,7 +813,7 @@ QuirksInfo.option.low_profile.description=This unit is may take less damage beca QuirksInfo.option.imp_com.displayableName=Improved Communications QuirksInfo.option.imp_com.description=No game effect.\nIncluded for completeness. (SO pg 195) QuirksInfo.option.imp_life_support.displayableName=Improved Life Support -QuirksInfo.option.imp_life_support.description=harder to damage mechwarrior from heat when life support damaged. (SO pg 195) +QuirksInfo.option.imp_life_support.description=harder to damage Mekwarrior from heat when life support damaged. (SO pg 195) QuirksInfo.option.imp_sensors.displayableName=Improved Sensors QuirksInfo.option.imp_sensors.description=Acts as an active probe or extends range of existing active probe (SO pg 195) QuirksInfo.option.imp_target_short.displayableName=Improved Targeting (Short) @@ -831,9 +833,9 @@ QuirksInfo.option.pro_actuator.description=Infantry leg and swarm attacks are ha QuirksInfo.option.reinforced_legs.displayableName=Reinforced Legs QuirksInfo.option.reinforced_legs.description=Half damage to attacker on successful DFA. (SO pg 195) QuirksInfo.option.rugged_1.displayableName=Rugged (1 Point) -QuirksInfo.option.rugged_1.description=Mech is extremely reliable and doesn't need as much Maintenance. (BMM pg 85) +QuirksInfo.option.rugged_1.description=Mek is extremely reliable and doesn't need as much Maintenance. (BMM pg 85) QuirksInfo.option.rugged_2.displayableName=Rugged (2 Point) -QuirksInfo.option.rugged_2.description=Mech is extremely reliable and doesn't need as much Maintenance. (BMM pg 85) +QuirksInfo.option.rugged_2.description=Mek is extremely reliable and doesn't need as much Maintenance. (BMM pg 85) QuirksInfo.option.rumble_seat.displayableName=Rumble Seat (Legacy) QuirksInfo.option.rumble_seat.description=No game effect,\nincluded for completeness. (RS NTNU 3145 pg 12) QuirksInfo.option.searchlight.displayableName=Searchlight @@ -855,9 +857,9 @@ QuirksInfo.option.variable_range_long.description=Attacks at long range are -1 b QuirksInfo.option.variable_range_short.displayableName=Variable Range Targeting (short) QuirksInfo.option.variable_range_short.description=Attacks at short range are -1 but long range is +1. (SO pg 196) QuirksInfo.option.vestigial_hands_la.displayableName=Vestigial Hands (Left) -QuirksInfo.option.vestigial_hands_la.description=Mech equipped with left hand capable of simplied actions,, but no hand crit slots. \nNot Implemented (BMM pg 86) +QuirksInfo.option.vestigial_hands_la.description=Mek equipped with left hand capable of simplied actions,, but no hand crit slots. \nNot Implemented (BMM pg 86) QuirksInfo.option.vestigial_hands_ra.displayableName=Vestigial Hands (Right) -QuirksInfo.option.vestigial_hands_ra.description=Mech equipped with right hand capable of simplied actions, but no hand crit slots. \nNot Implemented (BMM pg 86) +QuirksInfo.option.vestigial_hands_ra.description=Mek equipped with right hand capable of simplied actions, but no hand crit slots. \nNot Implemented (BMM pg 86) QuirksInfo.option.vtol_rotor.displayableName=VTOL Rotor Arrangement QuirksInfo.option.vtol_rotor.description=Not implemented because advanced vee move rules not implemented. (SO pg 196) @@ -908,7 +910,7 @@ QuirksInfo.option.obsolete.description=No game effect,\nincluded for completenes QuirksInfo.option.oversized.displayableName=Oversized QuirksInfo.option.oversized.description=Ranged attacks against unit receive -1 modifier. \nPiloting check +1 passing through building/boarding dropships QuirksInfo.option.poor_life_support.displayableName=Poor Life Support -QuirksInfo.option.poor_life_support.description=easier to damage mechwarrior from heat when life support damaged. (SO pg 198) +QuirksInfo.option.poor_life_support.description=easier to damage Mekwarrior from heat when life support damaged. (SO pg 198) QuirksInfo.option.poor_performance.displayableName=Poor Performance QuirksInfo.option.poor_performance.description=Cannot accelerate immediately to Running/Flanking speed. (SO pg 199) QuirksInfo.option.poor_sealing.displayableName=Poor Sealing @@ -920,11 +922,11 @@ QuirksInfo.option.poor_target_med.description=+1 to ranged attacks at medium ran QuirksInfo.option.poor_target_long.displayableName=Poor Targeting (Long) QuirksInfo.option.poor_target_long.description=+1 to ranged attacks at long range. (SO pg 199) QuirksInfo.option.poor_work.displayableName=Poor Workmanship -QuirksInfo.option.poor_work.description=+1 to critical hit rolls. (SO pg 199) +QuirksInfo.option.poor_work.description=+1 to critical hit rolls. (SO pg 199) QuirksInfo.option.prototype.displayableName=Prototype QuirksInfo.option.prototype.description=+2 to critical hit rolls. (SO pg 199) QuirksInfo.option.ramshackle.displayableName=Ramshackle -QuirksInfo.option.ramshackle.description=Mech has random negative quirks. \nNot Implemented (BMM pg 88) +QuirksInfo.option.ramshackle.description=Mek has random negative quirks. \nNot Implemented (BMM pg 88) QuirksInfo.option.sensor_ghosts.displayableName=Sensor Ghosts QuirksInfo.option.sensor_ghosts.description=-1 to ranged attacks. (SO pg 199) QuirksInfo.option.unbalanced.displayableName=Unbalanced diff --git a/megamek/i18n/megamek/common/report-messages.properties b/megamek/i18n/megamek/common/report-messages.properties index 7b30819ee88..0a285b8d386 100755 --- a/megamek/i18n/megamek/common/report-messages.properties +++ b/megamek/i18n/megamek/common/report-messages.properties @@ -201,6 +201,7 @@ 2395= () breaks through magma crust on a 6+, rolls . 2396= () breaks through magma crust on a 4+, rolls . 2400= () falls into liquid magma, and is instantly destroyed! +2404= () takes additional damage from beginning and ending movement in a magma hex! 2405= () is damaged by the extreme heat of liquid magma! 2410= () breaks through ice from below 2415= collapes due to nuclear explosion ground zero. diff --git a/megamek/mmconf/defaultKeyBinds.xml b/megamek/mmconf/defaultKeyBinds.xml index 91628d1b021..c4fe389f7e5 100644 --- a/megamek/mmconf/defaultKeyBinds.xml +++ b/megamek/mmconf/defaultKeyBinds.xml @@ -162,7 +162,7 @@ - viewActingUnit + viewActingUnit 86 0 false @@ -357,6 +357,13 @@ false + + togglePlanetaryConditions + 80 + 128 + false + + clientSettings 67 diff --git a/megamek/src/megamek/SuiteConstants.java b/megamek/src/megamek/SuiteConstants.java index 8b23f2a418f..cd001437bf6 100644 --- a/megamek/src/megamek/SuiteConstants.java +++ b/megamek/src/megamek/SuiteConstants.java @@ -18,21 +18,31 @@ */ package megamek; -import java.time.LocalDate; - /** * These are constants that hold across the entire MegaMek Suite of MegaMek, MegaMekLab, and MekHQ. */ public abstract class SuiteConstants { //region General Constants public static final String PROJECT_NAME = "MegaMek Suite"; - public static final Version VERSION = new Version("0.49.11-SNAPSHOT"); + public static final Version VERSION = new Version("0.49.12-SNAPSHOT"); public static final int MAXIMUM_D6_VALUE = 6; // This is used in creating the name of save files, e.g. the MekHQ campaign file public static final String FILENAME_DATE_FORMAT = "yyyyMMdd"; //endregion General Constants + //region Font Constants + // FIXME : These uses all need to be converted into SuiteOptions, and this step was done to + // FIXME : simplify and isolate places that will be required + // FIXME : This is an accessibility issue + public static final String FONT_ARIAL = "Arial"; + public static final String FONT_COURIER_NEW = "Courier New"; + public static final String FONT_DIALOG = "Dialog"; + public static final String FONT_HELVETICA = "Helvetica"; + public static final String FONT_MONOSPACED = "Monospaced"; + public static final String FONT_SANS_SERIF = "Sans Serif"; + //endregion Font Constants + //region GUI Constants //endregion GUI Constants diff --git a/megamek/src/megamek/Version.java b/megamek/src/megamek/Version.java index 9e49554fa3f..cb9004184d3 100644 --- a/megamek/src/megamek/Version.java +++ b/megamek/src/megamek/Version.java @@ -26,6 +26,7 @@ import javax.swing.*; import java.io.PrintWriter; import java.io.Serializable; +import java.util.Objects; /** * This is used for versioning, and to track the current Version the suite is running at. @@ -55,6 +56,15 @@ public Version(final @Nullable String text) { this(); fillFromText(text); } + + public Version(final String release, final String major, final String minor, + final String snapshot) throws NumberFormatException { + this(); + setRelease(Integer.parseInt(release)); + setMajor(Integer.parseInt(major)); + setMinor(Integer.parseInt(minor)); + setSnapshot(Boolean.parseBoolean(snapshot)); + } //endregion Constructors //region Getters diff --git a/megamek/src/megamek/client/Client.java b/megamek/src/megamek/client/Client.java index 167dac93ab5..9585ea82ec3 100644 --- a/megamek/src/megamek/client/Client.java +++ b/megamek/src/megamek/client/Client.java @@ -916,7 +916,7 @@ public void sendLoadEntity(int id, int loaderId, int bayNumber) { public void sendLoadGame(File f) { try (InputStream fis = new FileInputStream(f); InputStream is = new GZIPInputStream(fis)) { game.reset(); - send(new Packet(PacketCommand.LOAD_GAME, SerializationHelper.getXStream().fromXML(is))); + send(new Packet(PacketCommand.LOAD_GAME, SerializationHelper.getLoadSaveGameXStream().fromXML(is))); } catch (Exception ex) { LogManager.getLogger().error("Can't find the local savegame " + f, ex); } diff --git a/megamek/src/megamek/client/bot/BotClient.java b/megamek/src/megamek/client/bot/BotClient.java index 1b93f4ccc3b..e9e495f1a8f 100644 --- a/megamek/src/megamek/client/bot/BotClient.java +++ b/megamek/src/megamek/client/bot/BotClient.java @@ -116,7 +116,7 @@ public void gamePhaseChange(GamePhaseChangeEvent e) { @Override public void gameReport(GameReportEvent e) { - if (game.getPhase() == GamePhase.INITIATIVE_REPORT) { + if (game.getPhase().isInitiativeReport()) { // Opponent has used tactical genius, must press // "Done" again to advance past initiative report. sendDone(true); @@ -506,7 +506,7 @@ private synchronized boolean calculateMyTurnWorker() { currentTurnFriendlyEntities = null; try { - if (game.getPhase() == GamePhase.MOVEMENT) { + if (game.getPhase().isMovement()) { MovePath mp; if (game.getTurn() instanceof GameTurn.SpecificEntityTurn) { GameTurn.SpecificEntityTurn turn = (GameTurn.SpecificEntityTurn) game.getTurn(); @@ -521,37 +521,34 @@ private synchronized boolean calculateMyTurnWorker() { } } moveEntity(mp.getEntity().getId(), mp); - } else if (game.getPhase() == GamePhase.FIRING) { + } else if (game.getPhase().isFiring()) { calculateFiringTurn(); - } else if (game.getPhase() == GamePhase.PHYSICAL) { + } else if (game.getPhase().isPhysical()) { PhysicalOption po = calculatePhysicalTurn(); // Bug #1072137: don't crash if the bot can't find a physical. if (null != po) { sendAttackData(po.attacker.getId(), po.getVector()); } else { // Send a "no attack" to clear the game turn, if any. - sendAttackData(game.getFirstEntityNum(getMyTurn()), - new Vector<>(0)); + sendAttackData(game.getFirstEntityNum(getMyTurn()), new Vector<>(0)); } - } else if (game.getPhase() == GamePhase.DEPLOYMENT) { + } else if (game.getPhase().isDeployment()) { calculateDeployment(); - } else if (game.getPhase() == GamePhase.DEPLOY_MINEFIELDS) { + } else if (game.getPhase().isDeployMinefields()) { Vector mines = calculateMinefieldDeployment(); for (Minefield mine : mines) { game.addMinefield(mine); } sendDeployMinefields(mines); sendPlayerInfo(); - } else if (game.getPhase() == GamePhase.SET_ARTILLERY_AUTOHIT_HEXES) { + } else if (game.getPhase().isSetArtilleryAutohitHexes()) { // For now, declare no autohit hexes. Vector autoHitHexes = calculateArtyAutoHitHexes(); sendArtyAutoHitHexes(autoHitHexes); - } else if ((game.getPhase() == GamePhase.TARGETING) - || (game.getPhase() == GamePhase.OFFBOARD)) { + } else if (game.getPhase().isTargeting() || game.getPhase().isOffboard()) { // Princess implements arty targeting calculateTargetingOffBoardTurn(); - } else if ((game.getPhase() == GamePhase.PREMOVEMENT) - || (game.getPhase() == GamePhase.PREFIRING)) { + } else if (game.getPhase().isPremovement() || game.getPhase().isPrefiring()) { calculatePrephaseTurn(); } diff --git a/megamek/src/megamek/client/bot/Messages.java b/megamek/src/megamek/client/bot/Messages.java index dd35ad8dbce..b70598890db 100644 --- a/megamek/src/megamek/client/bot/Messages.java +++ b/megamek/src/megamek/client/bot/Messages.java @@ -14,7 +14,6 @@ package megamek.client.bot; import megamek.MegaMek; -import megamek.common.util.EncodeControl; import java.text.MessageFormat; import java.util.MissingResourceException; @@ -23,7 +22,7 @@ public class Messages { private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle.getBundle("megamek.client.bot.messages", - MegaMek.getMMOptions().getLocale(), new EncodeControl()); + MegaMek.getMMOptions().getLocale()); private Messages() { } diff --git a/megamek/src/megamek/client/bot/ui/swing/BotGUI.java b/megamek/src/megamek/client/bot/ui/swing/BotGUI.java index 9e6d682dd7b..f130f42e864 100644 --- a/megamek/src/megamek/client/bot/ui/swing/BotGUI.java +++ b/megamek/src/megamek/client/bot/ui/swing/BotGUI.java @@ -19,7 +19,6 @@ import megamek.client.ui.dialogs.helpDialogs.BotHelpDialog; import megamek.client.ui.swing.ConfirmDialog; import megamek.client.ui.swing.GUIPreferences; -import megamek.common.enums.GamePhase; import megamek.common.event.*; import javax.swing.*; @@ -34,8 +33,7 @@ public BotGUI(BotClient bot) { @Override public void gamePhaseChange(GamePhaseChangeEvent e) { - if (bot.getGame().getPhase() == GamePhase.LOUNGE - || bot.getGame().getPhase() == GamePhase.STARTING_SCENARIO) { + if (bot.getGame().getPhase().isLounge() || bot.getGame().getPhase().isStartingScenario()) { notifyOfBot(); } } diff --git a/megamek/src/megamek/client/commands/FireCommand.java b/megamek/src/megamek/client/commands/FireCommand.java index 1d9a03e9991..14df91339e3 100644 --- a/megamek/src/megamek/client/commands/FireCommand.java +++ b/megamek/src/megamek/client/commands/FireCommand.java @@ -20,7 +20,6 @@ import megamek.common.*; import megamek.common.actions.*; import megamek.common.enums.AimingMode; -import megamek.common.enums.GamePhase; import megamek.common.options.OptionsConstants; import megamek.common.weapons.Weapon; @@ -272,11 +271,10 @@ private String calculateToHit(int weaponId, Targetable target) { str += " Can't shoot: " + Messages.getString("FiringDisplay.alreadyFired"); } else if ((m.getType().hasFlag(WeaponType.F_AUTO_TARGET) && !m.curMode().equals(Weapon.MODE_AMS_MANUAL)) - || (m.getType().hasModes() && m.curMode().equals("Point Defense"))) { + || (m.getType().hasModes() && m.curMode().equals("Point Defense"))) { str += " Can't shoot: " + Messages.getString("FiringDisplay.autoFiringWeapon"); - } else if (getClient().getGame().getPhase() == GamePhase.FIRING - && m.isInBearingsOnlyMode()) { + } else if (getClient().getGame().getPhase().isFiring() && m.isInBearingsOnlyMode()) { str += " Can't shoot: " + Messages.getString("FiringDisplay.bearingsOnlyWrongPhase"); } else if (toHit.getValue() == TargetRoll.AUTOMATIC_FAIL) { diff --git a/megamek/src/megamek/client/generator/enums/SkillGeneratorMethod.java b/megamek/src/megamek/client/generator/enums/SkillGeneratorMethod.java index 9745941c258..172e762b2fd 100644 --- a/megamek/src/megamek/client/generator/enums/SkillGeneratorMethod.java +++ b/megamek/src/megamek/client/generator/enums/SkillGeneratorMethod.java @@ -20,7 +20,6 @@ import megamek.MegaMek; import megamek.client.generator.skillGenerators.*; -import megamek.common.util.EncodeControl; import java.util.ResourceBundle; @@ -41,7 +40,7 @@ public enum SkillGeneratorMethod { //region Constructors SkillGeneratorMethod(final String name, final String toolTipText) { final ResourceBundle resources = ResourceBundle.getBundle("megamek.client.messages", - MegaMek.getMMOptions().getLocale(), new EncodeControl()); + MegaMek.getMMOptions().getLocale()); this.name = resources.getString(name); this.toolTipText = resources.getString(toolTipText); } diff --git a/megamek/src/megamek/client/generator/enums/SkillGeneratorType.java b/megamek/src/megamek/client/generator/enums/SkillGeneratorType.java index 5a9376e4b41..a4f8a675cc4 100644 --- a/megamek/src/megamek/client/generator/enums/SkillGeneratorType.java +++ b/megamek/src/megamek/client/generator/enums/SkillGeneratorType.java @@ -19,7 +19,6 @@ package megamek.client.generator.enums; import megamek.MegaMek; -import megamek.common.util.EncodeControl; import java.util.ResourceBundle; @@ -38,7 +37,7 @@ public enum SkillGeneratorType { //region Constructors SkillGeneratorType(final String name, final String toolTipText) { final ResourceBundle resources = ResourceBundle.getBundle("megamek.client.messages", - MegaMek.getMMOptions().getLocale(), new EncodeControl()); + MegaMek.getMMOptions().getLocale()); this.name = resources.getString(name); this.toolTipText = resources.getString(toolTipText); } diff --git a/megamek/src/megamek/client/ui/Messages.java b/megamek/src/megamek/client/ui/Messages.java index c76f16e152a..a20eba5e13b 100644 --- a/megamek/src/megamek/client/ui/Messages.java +++ b/megamek/src/megamek/client/ui/Messages.java @@ -15,7 +15,6 @@ package megamek.client.ui; import megamek.MegaMek; -import megamek.common.util.EncodeControl; import org.apache.logging.log4j.LogManager; import java.text.MessageFormat; @@ -24,7 +23,7 @@ public class Messages { private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle.getBundle("megamek.client.messages", - MegaMek.getMMOptions().getLocale(), new EncodeControl()); + MegaMek.getMMOptions().getLocale()); // All static class, should never be instantiated private Messages() { } diff --git a/megamek/src/megamek/client/ui/baseComponents/AbstractButtonDialog.java b/megamek/src/megamek/client/ui/baseComponents/AbstractButtonDialog.java index b2f37878756..f171032ccdd 100644 --- a/megamek/src/megamek/client/ui/baseComponents/AbstractButtonDialog.java +++ b/megamek/src/megamek/client/ui/baseComponents/AbstractButtonDialog.java @@ -20,7 +20,6 @@ import megamek.MegaMek; import megamek.client.ui.enums.DialogResult; -import megamek.common.util.EncodeControl; import org.apache.logging.log4j.LogManager; import javax.swing.*; @@ -65,7 +64,7 @@ protected AbstractButtonDialog(final JFrame frame, final String name, final Stri protected AbstractButtonDialog(final JFrame frame, final boolean modal, final String name, final String title) { this(frame, modal, ResourceBundle.getBundle("megamek.client.messages", - MegaMek.getMMOptions().getLocale(), new EncodeControl()), name, title); + MegaMek.getMMOptions().getLocale()), name, title); } /** diff --git a/megamek/src/megamek/client/ui/baseComponents/AbstractDialog.java b/megamek/src/megamek/client/ui/baseComponents/AbstractDialog.java index c5660647c1a..4033d052db3 100644 --- a/megamek/src/megamek/client/ui/baseComponents/AbstractDialog.java +++ b/megamek/src/megamek/client/ui/baseComponents/AbstractDialog.java @@ -21,7 +21,6 @@ import megamek.MegaMek; import megamek.client.ui.preferences.JWindowPreference; import megamek.client.ui.preferences.PreferencesNode; -import megamek.common.util.EncodeControl; import org.apache.logging.log4j.LogManager; import javax.swing.*; @@ -64,7 +63,7 @@ protected AbstractDialog(final JFrame frame, final String name, final String tit */ protected AbstractDialog(final JFrame frame, final boolean modal, final String name, final String title) { this(frame, modal, ResourceBundle.getBundle("megamek.client.messages", - MegaMek.getMMOptions().getLocale(), new EncodeControl()), name, title); + MegaMek.getMMOptions().getLocale()), name, title); } /** diff --git a/megamek/src/megamek/client/ui/baseComponents/AbstractPanel.java b/megamek/src/megamek/client/ui/baseComponents/AbstractPanel.java index e994c7cfa7c..e0e25f79228 100644 --- a/megamek/src/megamek/client/ui/baseComponents/AbstractPanel.java +++ b/megamek/src/megamek/client/ui/baseComponents/AbstractPanel.java @@ -20,7 +20,6 @@ import megamek.MegaMek; import megamek.client.ui.preferences.PreferencesNode; -import megamek.common.util.EncodeControl; import javax.swing.*; import java.awt.*; @@ -54,7 +53,7 @@ protected AbstractPanel(final JFrame frame, final String name) { */ protected AbstractPanel(final JFrame frame, final String name, final boolean isDoubleBuffered) { this(frame, ResourceBundle.getBundle("megamek.client.messages", - MegaMek.getMMOptions().getLocale(), new EncodeControl()), + MegaMek.getMMOptions().getLocale()), name, new FlowLayout(), isDoubleBuffered); } @@ -73,7 +72,7 @@ protected AbstractPanel(final JFrame frame, final String name, final LayoutManag protected AbstractPanel(final JFrame frame, final String name, final LayoutManager layoutManager, final boolean isDoubleBuffered) { this(frame, ResourceBundle.getBundle("megamek.client.messages", - MegaMek.getMMOptions().getLocale(), new EncodeControl()), + MegaMek.getMMOptions().getLocale()), name, layoutManager, isDoubleBuffered); } diff --git a/megamek/src/megamek/client/ui/baseComponents/AbstractScrollPane.java b/megamek/src/megamek/client/ui/baseComponents/AbstractScrollPane.java index 0a470d9c37b..ac36b118e3b 100644 --- a/megamek/src/megamek/client/ui/baseComponents/AbstractScrollPane.java +++ b/megamek/src/megamek/client/ui/baseComponents/AbstractScrollPane.java @@ -20,7 +20,6 @@ import megamek.MegaMek; import megamek.client.ui.preferences.PreferencesNode; -import megamek.common.util.EncodeControl; import javax.swing.*; import java.util.ResourceBundle; @@ -55,7 +54,7 @@ protected AbstractScrollPane(final JFrame frame, final String name) { protected AbstractScrollPane(final JFrame frame, final String name, final int verticalScrollBarPolicy, final int horizontalScrollBarPolicy) { this(frame, ResourceBundle.getBundle("megamek.client.messages", - MegaMek.getMMOptions().getLocale(), new EncodeControl()), name, + MegaMek.getMMOptions().getLocale()), name, verticalScrollBarPolicy, horizontalScrollBarPolicy); } diff --git a/megamek/src/megamek/client/ui/baseComponents/AbstractSplitPane.java b/megamek/src/megamek/client/ui/baseComponents/AbstractSplitPane.java index 966ef20705b..bbe6c8324ea 100644 --- a/megamek/src/megamek/client/ui/baseComponents/AbstractSplitPane.java +++ b/megamek/src/megamek/client/ui/baseComponents/AbstractSplitPane.java @@ -21,7 +21,6 @@ import megamek.MegaMek; import megamek.client.ui.preferences.JSplitPanePreference; import megamek.client.ui.preferences.PreferencesNode; -import megamek.common.util.EncodeControl; import org.apache.logging.log4j.LogManager; import javax.swing.*; @@ -50,7 +49,7 @@ public abstract class AbstractSplitPane extends JSplitPane { */ protected AbstractSplitPane(final JFrame frame, final String name) { this(frame, ResourceBundle.getBundle("megamek.client.messages", - MegaMek.getMMOptions().getLocale(), new EncodeControl()), name); + MegaMek.getMMOptions().getLocale()), name); } /** diff --git a/megamek/src/megamek/client/ui/baseComponents/AbstractTabbedPane.java b/megamek/src/megamek/client/ui/baseComponents/AbstractTabbedPane.java index b12a7109318..5ec5e2ff02a 100644 --- a/megamek/src/megamek/client/ui/baseComponents/AbstractTabbedPane.java +++ b/megamek/src/megamek/client/ui/baseComponents/AbstractTabbedPane.java @@ -19,7 +19,6 @@ package megamek.client.ui.baseComponents; import megamek.MegaMek; -import megamek.common.util.EncodeControl; import megamek.client.ui.preferences.JTabbedPanePreference; import megamek.client.ui.preferences.PreferencesNode; import org.apache.logging.log4j.LogManager; @@ -48,7 +47,7 @@ public abstract class AbstractTabbedPane extends JTabbedPane { */ protected AbstractTabbedPane(final JFrame frame, final String name) { this(frame, ResourceBundle.getBundle("megamek.client.messages", - MegaMek.getMMOptions().getLocale(), new EncodeControl()), name); + MegaMek.getMMOptions().getLocale()), name); } /** diff --git a/megamek/src/megamek/client/ui/baseComponents/AbstractValidationButtonDialog.java b/megamek/src/megamek/client/ui/baseComponents/AbstractValidationButtonDialog.java index dcf3858e552..66cbf07597e 100644 --- a/megamek/src/megamek/client/ui/baseComponents/AbstractValidationButtonDialog.java +++ b/megamek/src/megamek/client/ui/baseComponents/AbstractValidationButtonDialog.java @@ -21,7 +21,6 @@ import megamek.MegaMek; import megamek.client.ui.enums.ValidationState; import megamek.common.annotations.Nullable; -import megamek.common.util.EncodeControl; import org.apache.logging.log4j.LogManager; import javax.swing.*; @@ -70,7 +69,7 @@ protected AbstractValidationButtonDialog(final JFrame frame, final String name, protected AbstractValidationButtonDialog(final JFrame frame, final boolean modal, final String name, final String title) { this(frame, modal, ResourceBundle.getBundle("megamek.client.messages", - MegaMek.getMMOptions().getLocale(), new EncodeControl()), name, title); + MegaMek.getMMOptions().getLocale()), name, title); } /** diff --git a/megamek/src/megamek/client/ui/dialogs/ASConversionInfoDialog.java b/megamek/src/megamek/client/ui/dialogs/ASConversionInfoDialog.java index 7ba22df1e3b..e7859298bb9 100644 --- a/megamek/src/megamek/client/ui/dialogs/ASConversionInfoDialog.java +++ b/megamek/src/megamek/client/ui/dialogs/ASConversionInfoDialog.java @@ -76,7 +76,7 @@ private ASConversionInfoDialog(final JFrame frame, CalculationReport report, @Nu @Override protected void finalizeInitialization() throws Exception { super.finalizeInitialization(); - UIUtil.adjustDialog(getContentPane()); + adaptToGUIScale(); if (!StringUtility.isNullOrBlank(unitName)) { setTitle(getTitle() + " (" + unitName + ")"); } @@ -119,5 +119,9 @@ private void copyToClipboard(String reportString) { Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard(); clipboard.setContents(new StringSelection(reportString), null); } + + private void adaptToGUIScale() { + UIUtil.adjustDialog(this, UIUtil.FONT_SCALE1); + } } diff --git a/megamek/src/megamek/client/ui/dialogs/AbstractIconChooserDialog.java b/megamek/src/megamek/client/ui/dialogs/AbstractIconChooserDialog.java index 25a6ffe8100..fda9b99865c 100644 --- a/megamek/src/megamek/client/ui/dialogs/AbstractIconChooserDialog.java +++ b/megamek/src/megamek/client/ui/dialogs/AbstractIconChooserDialog.java @@ -25,7 +25,6 @@ import megamek.client.ui.panels.AbstractIconChooser; import megamek.common.annotations.Nullable; import megamek.common.icons.AbstractIcon; -import megamek.common.util.EncodeControl; import javax.swing.*; import java.awt.*; @@ -52,7 +51,7 @@ public abstract class AbstractIconChooserDialog extends AbstractButtonDialog { public AbstractIconChooserDialog(final JFrame frame, final String name, final String title, final AbstractIconChooser chooser, final boolean doubleClick) { this(frame, true, ResourceBundle.getBundle("megamek.client.messages", - MegaMek.getMMOptions().getLocale(), new EncodeControl()), name, + MegaMek.getMMOptions().getLocale()), name, title, chooser, doubleClick); } diff --git a/megamek/src/megamek/client/ui/dialogs/AlphaStrikeStatsDialog.java b/megamek/src/megamek/client/ui/dialogs/AlphaStrikeStatsDialog.java index 33ee5bef706..b2e7f3fcb93 100644 --- a/megamek/src/megamek/client/ui/dialogs/AlphaStrikeStatsDialog.java +++ b/megamek/src/megamek/client/ui/dialogs/AlphaStrikeStatsDialog.java @@ -61,7 +61,7 @@ public AlphaStrikeStatsDialog(JFrame frame, Collection entities) { super(frame, "AlphaStrikeStatsDialog", "AlphaStrikeStatsDialog.title"); this.entities = new ArrayList<>(entities); initialize(); - UIUtil.adjustDialog(this); + adaptToGUIScale(); } @Override @@ -89,7 +89,7 @@ private void setupTable() { var asPanel = new AlphaStrikeStatsTablePanel(getFrame(), entities, pilotToggle.isSelected()); scrollPane.setViewportView(asPanel); centerPanel.add(scrollPane); - UIUtil.adjustDialog(this); + adaptToGUIScale(); } private void copyToClipboard() { @@ -145,4 +145,7 @@ private StringBuilder dataLine(AlphaStrikeElement element) { return dataLine; } + private void adaptToGUIScale() { + UIUtil.adjustDialog(this, UIUtil.FONT_SCALE1); + } } \ No newline at end of file diff --git a/megamek/src/megamek/client/ui/dialogs/BVDisplayDialog.java b/megamek/src/megamek/client/ui/dialogs/BVDisplayDialog.java index 7b39e2fadbe..c95194eeffc 100644 --- a/megamek/src/megamek/client/ui/dialogs/BVDisplayDialog.java +++ b/megamek/src/megamek/client/ui/dialogs/BVDisplayDialog.java @@ -48,7 +48,7 @@ public BVDisplayDialog(final JFrame frame, final boolean modal, final Entity ent protected void finalizeInitialization() throws Exception { super.finalizeInitialization(); setTitle(getTitle() + " (" + entity.getShortName() + ")"); - UIUtil.adjustDialog(getContentPane()); + adaptToGUIScale(); pack(); Dimension screenSize = UIUtil.getScaledScreenSize(this); setSize(new Dimension(getSize().width, Math.min(getHeight(), (int) (screenSize.getHeight() * 0.8)))); @@ -88,4 +88,8 @@ private void copyToClipboard(String reportString) { Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard(); clipboard.setContents(new StringSelection(reportString), null); } + + private void adaptToGUIScale() { + UIUtil.adjustDialog(this, UIUtil.FONT_SCALE1); + } } diff --git a/megamek/src/megamek/client/ui/dialogs/BotConfigDialog.java b/megamek/src/megamek/client/ui/dialogs/BotConfigDialog.java index 5562d5eedd2..6c1b78d1d18 100644 --- a/megamek/src/megamek/client/ui/dialogs/BotConfigDialog.java +++ b/megamek/src/megamek/client/ui/dialogs/BotConfigDialog.java @@ -34,7 +34,6 @@ import megamek.client.ui.swing.util.UIUtil.*; import megamek.common.*; import megamek.common.annotations.Nullable; -import megamek.common.enums.GamePhase; import org.apache.logging.log4j.LogManager; import javax.swing.*; @@ -129,7 +128,7 @@ public BotConfigDialog(JFrame parent, @Nullable String botName, updatePresets(); initialize(); updateDialogFields(); - UIUtil.adjustDialog(this); + adaptToGUIScale(); } @Override @@ -788,7 +787,7 @@ public Component getListCellRendererComponent(JList list, Object value, int i content = Messages.getString("BotConfigDialog.hexListIntro", coords.getX() + 1, coords.getY() + 1); if (client != null) { Board board = client.getBoard(); - if (client.getGame().getPhase() == GamePhase.LOUNGE) { + if (client.getGame().getPhase().isLounge()) { board = clientGui.chatlounge.getPossibleGameBoard(true); } if (board == null) { @@ -835,5 +834,8 @@ public Component getListCellRendererComponent(JList list, Object value, int i public void stateChanged(ChangeEvent e) { updateEnabledStates(); } - + + private void adaptToGUIScale() { + UIUtil.adjustDialog(this, UIUtil.FONT_SCALE1); + } } \ No newline at end of file diff --git a/megamek/src/megamek/client/ui/dialogs/BotConfigTargetHexDialog.java b/megamek/src/megamek/client/ui/dialogs/BotConfigTargetHexDialog.java index 9ebf5c91e63..72cf2555fd1 100644 --- a/megamek/src/megamek/client/ui/dialogs/BotConfigTargetHexDialog.java +++ b/megamek/src/megamek/client/ui/dialogs/BotConfigTargetHexDialog.java @@ -18,24 +18,28 @@ */ package megamek.client.ui.dialogs; -import static megamek.common.Terrains.*; - -import java.awt.Component; -import java.awt.Container; -import java.awt.event.*; -import java.util.*; - -import javax.swing.*; - +import megamek.client.ui.Messages; import megamek.client.ui.baseComponents.AbstractButtonDialog; import megamek.client.ui.swing.ClientGUI; import megamek.client.ui.swing.util.UIUtil; import megamek.client.ui.swing.util.UIUtil.TipList; import megamek.client.ui.swing.util.UIUtil.TipTextField; -import megamek.client.ui.Messages; -import megamek.common.*; +import megamek.common.Board; +import megamek.common.Building; +import megamek.common.Coords; +import megamek.common.Hex; import megamek.common.annotations.Nullable; -import megamek.common.enums.GamePhase; + +import javax.swing.*; +import java.awt.*; +import java.awt.event.ActionEvent; +import java.awt.event.KeyEvent; +import java.awt.event.WindowAdapter; +import java.awt.event.WindowEvent; +import java.util.ArrayList; +import java.util.List; + +import static megamek.common.Terrains.*; public class BotConfigTargetHexDialog extends AbstractButtonDialog { @@ -53,7 +57,7 @@ protected BotConfigTargetHexDialog(JFrame frame, @Nullable ClientGUI cg) { super(frame, "BotConfigTargetUnitDialog", "BotConfigDialog.bcthdTitle"); clientGui = cg; if (clientGui != null) { - if (clientGui.getClient().getGame().getPhase() == GamePhase.LOUNGE) { + if (clientGui.getClient().getGame().getPhase().isLounge()) { board = clientGui.chatlounge.getPossibleGameBoard(true); } else { board = clientGui.getClient().getBoard(); @@ -79,8 +83,8 @@ public void actionPerformed(ActionEvent evt) { public void windowOpened(WindowEvent e) { coordsField.requestFocus(); } - }); - UIUtil.adjustDialog(this); + }); + adaptToGUIScale(); } @Override @@ -169,5 +173,8 @@ public Component getListCellRendererComponent(JList list, Object value, int i return super.getListCellRendererComponent(list, content, index, isSelected, cellHasFocus); } } - + + private void adaptToGUIScale() { + UIUtil.adjustDialog(this, UIUtil.FONT_SCALE1); + } } diff --git a/megamek/src/megamek/client/ui/dialogs/BotConfigTargetUnitDialog.java b/megamek/src/megamek/client/ui/dialogs/BotConfigTargetUnitDialog.java index 9134f571a74..79b897142c8 100644 --- a/megamek/src/megamek/client/ui/dialogs/BotConfigTargetUnitDialog.java +++ b/megamek/src/megamek/client/ui/dialogs/BotConfigTargetUnitDialog.java @@ -57,8 +57,8 @@ public void actionPerformed(ActionEvent evt) { public void windowOpened(WindowEvent e) { unitIDField.requestFocus(); } - }); - UIUtil.adjustDialog(this); + }); + adaptToGUIScale(); } @Override @@ -97,4 +97,8 @@ public Set getSelectedIDs() { } return result; } + + private void adaptToGUIScale() { + UIUtil.adjustDialog(this, UIUtil.FONT_SCALE1); + } } diff --git a/megamek/src/megamek/client/ui/dialogs/CamoChooserDialog.java b/megamek/src/megamek/client/ui/dialogs/CamoChooserDialog.java index 2f2d760741d..99005ef47df 100644 --- a/megamek/src/megamek/client/ui/dialogs/CamoChooserDialog.java +++ b/megamek/src/megamek/client/ui/dialogs/CamoChooserDialog.java @@ -17,6 +17,7 @@ import megamek.client.ui.baseComponents.MMButton; import megamek.client.ui.panels.CamoChooser; +import megamek.client.ui.swing.util.UIUtil; import megamek.common.annotations.Nullable; import megamek.common.icons.AbstractIcon; import megamek.common.icons.Camouflage; @@ -91,4 +92,14 @@ protected CamoChooser getChooser() { public Camouflage getSelectedItem() { return useDefault ? new Camouflage() : ((Camouflage) super.getSelectedItem()).clone(); } + + @Override + protected void finalizeInitialization() throws Exception { + super.finalizeInitialization(); + adaptToGUIScale(); + } + + private void adaptToGUIScale() { + UIUtil.adjustDialog(this, UIUtil.FONT_SCALE1); + } } diff --git a/megamek/src/megamek/client/ui/dialogs/CostDisplayDialog.java b/megamek/src/megamek/client/ui/dialogs/CostDisplayDialog.java index a5dc002bc39..712130d15b8 100644 --- a/megamek/src/megamek/client/ui/dialogs/CostDisplayDialog.java +++ b/megamek/src/megamek/client/ui/dialogs/CostDisplayDialog.java @@ -115,7 +115,7 @@ private void updateCalculation() { /** Does gui-scaling, packs the dialog and reduces the height if its too big. */ private void updateDialogSize() { - UIUtil.adjustDialog(getContentPane()); + adaptToGUIScale(); pack(); Dimension screenSize = UIUtil.getScaledScreenSize(this); setSize(new Dimension(getSize().width, Math.min(getHeight(), (int) (screenSize.getHeight() * 0.8)))); @@ -125,4 +125,8 @@ private void copyToClipboard(String reportString) { Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard(); clipboard.setContents(new StringSelection(reportString), null); } + + private void adaptToGUIScale() { + UIUtil.adjustDialog(this, UIUtil.FONT_SCALE1); + } } diff --git a/megamek/src/megamek/client/ui/dialogs/helpDialogs/AbstractHelpDialog.java b/megamek/src/megamek/client/ui/dialogs/helpDialogs/AbstractHelpDialog.java index 49b7e4987d2..81c4d9af07a 100644 --- a/megamek/src/megamek/client/ui/dialogs/helpDialogs/AbstractHelpDialog.java +++ b/megamek/src/megamek/client/ui/dialogs/helpDialogs/AbstractHelpDialog.java @@ -20,6 +20,7 @@ import megamek.client.ui.Messages; import megamek.client.ui.baseComponents.AbstractDialog; +import megamek.client.ui.swing.util.UIUtil; import org.apache.logging.log4j.LogManager; import javax.swing.*; @@ -32,6 +33,7 @@ public abstract class AbstractHelpDialog extends AbstractDialog { //region Variable Declarations private String helpFilePath; + //endregion Variable Declarations //region Constructors @@ -54,7 +56,7 @@ public void setHelpFilePath(final String helpFilePath) { @Override protected Container createCenterPane() { - final JEditorPane pane = new JEditorPane(); + JEditorPane pane = new JEditorPane(); pane.setName("helpPane"); pane.setEditable(false); @@ -69,6 +71,17 @@ protected Container createCenterPane() { pane.setText(Messages.getString("AbstractHelpDialog.errorReading") + e.getMessage()); LogManager.getLogger().error("", e); } + return new JScrollPane(pane); } + + @Override + protected void finalizeInitialization() throws Exception { + super.finalizeInitialization(); + adaptToGUIScale(); + } + + private void adaptToGUIScale() { + UIUtil.adjustDialog(this, UIUtil.FONT_SCALE1); + } } diff --git a/megamek/src/megamek/client/ui/swing/AccessibilityWindow.java b/megamek/src/megamek/client/ui/swing/AccessibilityWindow.java index 1a4acba7185..91a580d76e3 100644 --- a/megamek/src/megamek/client/ui/swing/AccessibilityWindow.java +++ b/megamek/src/megamek/client/ui/swing/AccessibilityWindow.java @@ -18,6 +18,7 @@ */ package megamek.client.ui.swing; +import megamek.MMConstants; import megamek.client.Client; import megamek.client.ui.Messages; import megamek.common.Coords; @@ -161,7 +162,7 @@ public void gameVictory(GameVictoryEvent e) { chatArea.setEditable(false); chatArea.setLineWrap(true); chatArea.setWrapStyleWord(true); - chatArea.setFont(new Font("Sans Serif", Font.PLAIN, 12)); + chatArea.setFont(new Font(MMConstants.FONT_SANS_SERIF, Font.PLAIN, 12)); add(new JScrollPane(chatArea, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER), BorderLayout.CENTER); diff --git a/megamek/src/megamek/client/ui/swing/AdvancedSearchDialog.java b/megamek/src/megamek/client/ui/swing/AdvancedSearchDialog.java index d9022eca9d4..051f7d56b93 100644 --- a/megamek/src/megamek/client/ui/swing/AdvancedSearchDialog.java +++ b/megamek/src/megamek/client/ui/swing/AdvancedSearchDialog.java @@ -13,66 +13,32 @@ */ package megamek.client.ui.swing; -import java.awt.BorderLayout; -import java.awt.Dimension; -import java.awt.Font; -import java.awt.Frame; -import java.awt.GridBagConstraints; -import java.awt.GridBagLayout; -import java.awt.Insets; -import java.awt.Label; -import java.awt.event.ActionListener; -import java.awt.event.ItemEvent; -import java.awt.event.ItemListener; -import java.awt.event.KeyEvent; -import java.awt.event.KeyListener; -import java.awt.event.WindowAdapter; -import java.awt.event.WindowEvent; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Enumeration; -import java.util.Vector; +import megamek.MMConstants; +import megamek.client.ui.Messages; +import megamek.client.ui.swing.table.MegamekTable; +import megamek.client.ui.swing.unitSelector.TWAdvancedSearchPanel; +import megamek.client.ui.swing.util.UIUtil; +import megamek.common.*; -import javax.swing.DefaultCellEditor; -import javax.swing.DefaultComboBoxModel; -import javax.swing.DefaultRowSorter; -import javax.swing.JButton; -import javax.swing.JCheckBox; -import javax.swing.JComboBox; -import javax.swing.JDialog; -import javax.swing.JLabel; -import javax.swing.JOptionPane; -import javax.swing.JPanel; -import javax.swing.JScrollPane; -import javax.swing.JTextArea; -import javax.swing.JTextField; -import javax.swing.ListSelectionModel; -import javax.swing.RowFilter; +import javax.swing.*; import javax.swing.RowSorter.SortKey; -import javax.swing.SortOrder; -import javax.swing.SwingConstants; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; import javax.swing.table.AbstractTableModel; import javax.swing.table.TableColumn; import javax.swing.table.TableRowSorter; - -import megamek.client.ui.Messages; -import megamek.client.ui.swing.table.MegamekTable; -import megamek.client.ui.swing.unitSelector.TWAdvancedSearchPanel; -import megamek.common.EquipmentType; -import megamek.common.Mech; -import megamek.common.MechSearchFilter; -import megamek.common.MiscType; -import megamek.common.TechConstants; -import megamek.common.UnitType; -import megamek.common.WeaponType; +import java.awt.*; +import java.awt.event.*; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Enumeration; +import java.util.Vector; /** * JDialog that allows the user to create a unit filter. * * @author Arlith - * @author Jay Lawson + * @author Jay Lawson */ public class AdvancedSearchDialog extends JDialog implements ActionListener, ItemListener, KeyListener, ListSelectionListener { @@ -255,8 +221,6 @@ public AdvancedSearchDialog(Frame frame, int yr) { cboTechClass.addActionListener(this); //Setup Weapons Table - scrTableWeapons.setMinimumSize(new Dimension(850, 150)); - scrTableWeapons.setPreferredSize(new Dimension(850, 150)); weaponsModel = new WeaponsTableModel(); tblWeapons = new MegamekTable(weaponsModel,WeaponsTableModel.COL_NAME); TableColumn wpsCol = tblWeapons.getColumnModel().getColumn( @@ -266,34 +230,14 @@ public AdvancedSearchDialog(Frame frame, int yr) { weaponsSorter = new TableRowSorter<>(weaponsModel); tblWeapons.setRowSorter(weaponsSorter); tblWeapons.addKeyListener(this); - TableColumn column = null; - for (int i = 0; i < WeaponsTableModel.N_COL; i++) { - column = tblWeapons.getColumnModel().getColumn(i); - if ((i == WeaponsTableModel.COL_QTY)) { - column.setPreferredWidth(40); - } else if ( i == WeaponsTableModel.COL_IS_CLAN) { - column.setPreferredWidth(75); - } else if ( i == WeaponsTableModel.COL_NAME) { - column.setPreferredWidth(310); - } else if ( i == WeaponsTableModel.COL_LEVEL) { - column.setPreferredWidth(100); - } else if ((i == WeaponsTableModel.COL_DMG) || - (i == WeaponsTableModel.COL_HEAT) || - (i == WeaponsTableModel.COL_SHORT) || - (i == WeaponsTableModel.COL_MED) || - (i == WeaponsTableModel.COL_LONG)) { - column.setPreferredWidth(50); - } else { - column.setPreferredWidth(25); - } - } - tblWeapons.setFont(new Font("Monospaced", Font.PLAIN, 12)); + tblWeapons.setFont(new Font(MMConstants.FONT_MONOSPACED, Font.PLAIN, 12)); tblWeapons.getSelectionModel().addListSelectionListener(this); + for (int i = 0; i < weaponsModel.getColumnCount(); i++) { + tblWeapons.getColumnModel().getColumn(i).setPreferredWidth(weaponsModel.getPreferredWidth(i)); + } scrTableWeapons.setViewportView(tblWeapons); //Setup Equipment Table - scrTableEquipment.setMinimumSize(new java.awt.Dimension(850, 150)); - scrTableEquipment.setPreferredSize(new java.awt.Dimension(850, 150)); equipmentModel = new EquipmentTableModel(); tblEquipment = new MegamekTable(equipmentModel, EquipmentTableModel.COL_NAME); @@ -304,25 +248,11 @@ public AdvancedSearchDialog(Frame frame, int yr) { equipmentSorter = new TableRowSorter<>(equipmentModel); tblEquipment.setRowSorter(equipmentSorter); tblEquipment.addKeyListener(this); - column = null; - for (int i = 0; i < EquipmentTableModel.N_COL; i++) { - column = tblEquipment.getColumnModel().getColumn(i); - if (i == EquipmentTableModel.COL_NAME) { - column.setPreferredWidth(400); - } else if (i == EquipmentTableModel.COL_COST) { - column.setPreferredWidth(175); - } else if (i == EquipmentTableModel.COL_LEVEL) { - column.setPreferredWidth(100); - } else if ((i == EquipmentTableModel.COL_QTY)) { - column.setPreferredWidth(40); - } else if (i == EquipmentTableModel.COL_IS_CLAN) { - column.setPreferredWidth(75); - } else { - column.setPreferredWidth(25); - } - } - tblEquipment.setFont(new Font("Monospaced", Font.PLAIN, 12)); + tblEquipment.setFont(new Font(MMConstants.FONT_MONOSPACED, Font.PLAIN, 12)); tblEquipment.getSelectionModel().addListSelectionListener(this); + for (int i = 0; i < tblEquipment.getColumnCount(); i++) { + tblEquipment.getColumnModel().getColumn(i).setPreferredWidth(equipmentModel.getPreferredWidth(i)); + } scrTableEquipment.setViewportView(tblEquipment); //Populate Tables @@ -348,86 +278,72 @@ public AdvancedSearchDialog(Frame frame, int yr) { txtEqExp.setEditable(false); txtEqExp.setLineWrap(true); txtEqExp.setWrapStyleWord(true); - Dimension size = new Dimension(325, 50); - txtEqExp.setPreferredSize(size); - expScroller.setPreferredSize(size); - expScroller.setMaximumSize(size); // Layout GridBagConstraints c = new GridBagConstraints(); - setLayout(new GridBagLayout()); + JPanel mainPanel = new JPanel(new GridBagLayout()); + c.weighty = 0; + c.fill = GridBagConstraints.NONE; c.anchor = GridBagConstraints.WEST; - c.insets = new Insets(0, 0, 0, 0); - c.insets = new Insets(0, 10, 0, 0); c.gridx = 0; c.gridy = 0; - this.add(lblWalk, c); + mainPanel.add(lblWalk, c); c.gridx = 1; c.gridy = 0; c.insets = new Insets(0, 0, 0, 0); c.anchor = GridBagConstraints.EAST; JPanel panWalk = new JPanel(); panWalk.add(cWalk); panWalk.add(tWalk); - this.add(panWalk, c); + mainPanel.add(panWalk, c); c.gridx = 3; c.gridy = 0; c.insets = new Insets(0, 40, 0, 0); - c.weighty = 1; c.anchor = GridBagConstraints.WEST; JPanel cockpitPanel = new JPanel(); cockpitPanel.add(cbxEnableCockpitSearch,BorderLayout.WEST); cockpitPanel.add(lblCockpitType,BorderLayout.WEST); cockpitPanel.add(cboCockpitType,BorderLayout.EAST); - this.add(cockpitPanel, c); - c.insets = new Insets(0, 0, 0, 0); - c.weighty = 0; - + mainPanel.add(cockpitPanel, c); c.gridx = 0; c.gridy = 1; c.anchor = GridBagConstraints.WEST; c.insets = new Insets(0, 10, 0, 0); - this.add(lblJump, c); + mainPanel.add(lblJump, c); c.insets = new Insets(0, 0, 0, 0); c.gridx = 1; c.gridy = 1; c.anchor = GridBagConstraints.EAST; JPanel panJump = new JPanel(); panJump.add(cJump); panJump.add(tJump); - this.add(panJump, c); + mainPanel.add(panJump, c); c.anchor = GridBagConstraints.WEST; c.gridx = 3; c.gridy = 1; - c.weighty = 1; c.insets = new Insets(0, 40, 0, 0); JPanel internalsPanel = new JPanel(); internalsPanel.add(cbxEnableInternalsSearch); internalsPanel.add(lblInternalsType); internalsPanel.add(cboInternalsType,BorderLayout.EAST); - this.add(internalsPanel, c); - c.weighty = 0; - c.insets = new Insets(0, 0, 0, 0); + mainPanel.add(internalsPanel, c); c.anchor = GridBagConstraints.WEST; c.gridx = 0; c.gridy++; c.insets = new Insets(0, 10, 0, 0); - this.add(lblArmor, c); + mainPanel.add(lblArmor, c); c.insets = new Insets(0, 0, 0, 0); c.gridx = 1; - this.add(cArmor, c); + mainPanel.add(cArmor, c); c.gridx = 3; - c.weighty = 1; c.insets = new Insets(0, 40, 0, 0); JPanel armorPanel = new JPanel(); armorPanel.add(cbxEnableArmorSearch); armorPanel.add(lblArmorType); armorPanel.add(cboArmorType,BorderLayout.EAST); - this.add(armorPanel, c); - c.weighty = 0; + mainPanel.add(armorPanel, c); c.anchor = GridBagConstraints.CENTER; - c.insets = new Insets(16, 0, 0, 0); c.gridx = 0; c.gridy++; - this.add(lblTableFilters, c); + mainPanel.add(lblTableFilters, c); c.insets = new Insets(0, 0, 0, 0); c.gridx = 0; c.gridy++; c.gridwidth = 4; @@ -438,32 +354,29 @@ public AdvancedSearchDialog(Frame frame, int yr) { cboPanel.add(cboTechClass); cboPanel.add(lblTechLevel, c); cboPanel.add(cboTechLevel, c); - this.add(cboPanel, c); + mainPanel.add(cboPanel, c); c.gridwidth = 1; c.insets = new Insets(0, 0, 0, 0); c.gridx = 0; c.gridy++; - this.add(lblWeapons, c); + mainPanel.add(lblWeapons, c); c.insets = new Insets(0, 0, 0, 0); c.gridwidth = 4; c.gridx = 0; c.gridy++; - this.add(scrTableWeapons, c); - c.gridwidth = 1; - + mainPanel.add(scrTableWeapons, c); c.gridwidth = 1; c.insets = new Insets(16, 0, 0, 0); c.gridx = 0; c.gridy++; - this.add(lblEquipment, c); + mainPanel.add(lblEquipment, c); c.insets = new Insets(0, 0, 0, 0); c.gridwidth = 4; c.gridx = 0; c.gridy++; - this.add(scrTableEquipment, c); - c.gridwidth = 1; + mainPanel.add(scrTableEquipment, c); c.gridx = 0; c.gridy++; c.gridwidth = 4; @@ -475,44 +388,45 @@ public AdvancedSearchDialog(Frame frame, int yr) { btnPanel.add(btnOr, c); btnPanel.add(btnBack, c); btnPanel.add(btnClear, c); - this.add(btnPanel, c); + mainPanel.add(btnPanel, c); c.gridwidth = 1; // Filter Expression - // c.insets = new Insets(50, 0, 0, 0); c.gridx = 0; c.gridy++; - this.add(lblEqExpTxt, c); + mainPanel.add(lblEqExpTxt, c); c.fill = GridBagConstraints.BOTH; c.gridwidth = 4; c.gridx = 1; - this.add(expScroller, c); + mainPanel.add(expScroller, c); c.fill = GridBagConstraints.NONE; c.insets = new Insets(0, 0, 0, 0); c.gridwidth = 1; c.gridx = 0; c.gridy++; - this.add(lblYear, c); + mainPanel.add(lblYear, c); c.gridx = 1; JPanel designYearPanel = new JPanel(); designYearPanel.add(tStartYear); designYearPanel.add(new Label("-")); designYearPanel.add(tEndYear); - add(designYearPanel, c); - + mainPanel.add(designYearPanel, c); c.gridwidth = 1; c.gridx = 2; c.gridy++; c.anchor = GridBagConstraints.EAST; c.insets = new Insets(0, 20, 10, 0); - this.add(btnOkay, c); + mainPanel.add(btnOkay, c); c.gridx = 3; c.insets = new Insets(0, 20, 10, 0); c.anchor = GridBagConstraints.WEST; - this.add(btnCancel, c); + mainPanel.add(btnCancel, c); + + JScrollPane mainScrollPane = new JScrollPane(mainPanel); + add(mainScrollPane); addWindowListener(new WindowAdapter() { @Override - public void windowClosing(WindowEvent e) { + public void windowClosing(WindowEvent evt) { setVisible(false); } }); @@ -527,6 +441,14 @@ public void windowClosing(WindowEvent e) { setLocation(x, y); } + @Override + public void setVisible(boolean show) { + if (show) { + adaptToGUIScale(); + } + super.setVisible(show); + } + /** * Listener for check box state changes */ @@ -880,6 +802,7 @@ public MechSearchFilter showDialog() { } else { updateMechSearchFilter(); } + return mechFilter; } @@ -1005,6 +928,31 @@ public int getColumnCount() { return N_COL; } + public int getPreferredWidth(int col) { + switch (col) { + case COL_QTY: + return 40; + case COL_NAME: + return 310; + case COL_IS_CLAN: + return 75; + case COL_DMG: + return 50; + case COL_HEAT: + return 50; + case COL_SHORT: + return 50; + case COL_MED: + return 50; + case COL_LONG: + return 50; + case COL_LEVEL: + return 100; + default: + return 0; + } + } + @Override public String getColumnName(int column) { switch (column) { @@ -1137,6 +1085,23 @@ public int getColumnCount() { return N_COL; } + public int getPreferredWidth(int column) { + switch (column) { + case COL_QTY: + return 40; + case COL_NAME: + return 400; + case COL_IS_CLAN: + return 75; + case COL_COST: + return 175; + case COL_LEVEL: + return 100; + default: + return 0; + } + } + @Override public String getColumnName(int column) { switch (column) { @@ -1321,4 +1286,12 @@ public String toString() { } } } + + private void adaptToGUIScale() { + UIUtil.adjustDialog(this, UIUtil.FONT_SCALE1); + scrTableWeapons.setMinimumSize(new Dimension(UIUtil.scaleForGUI(850), UIUtil.scaleForGUI(150))); + scrTableWeapons.setPreferredSize(new Dimension(UIUtil.scaleForGUI(850), UIUtil.scaleForGUI(150))); + scrTableEquipment.setMinimumSize(new Dimension(UIUtil.scaleForGUI(850), UIUtil.scaleForGUI(150))); + scrTableEquipment.setPreferredSize(new Dimension(UIUtil.scaleForGUI(850), UIUtil.scaleForGUI(150))); + } } diff --git a/megamek/src/megamek/client/ui/swing/AnalyzeFormationDialog.java b/megamek/src/megamek/client/ui/swing/AnalyzeFormationDialog.java index e08a12a149d..3bdb022516f 100644 --- a/megamek/src/megamek/client/ui/swing/AnalyzeFormationDialog.java +++ b/megamek/src/megamek/client/ui/swing/AnalyzeFormationDialog.java @@ -5,6 +5,7 @@ import megamek.client.ratgenerator.RATGenerator; import megamek.client.ratgenerator.UnitTable; import megamek.client.ui.Messages; +import megamek.client.ui.swing.util.UIUtil; import megamek.common.EntityWeightClass; import megamek.common.MechSummary; import megamek.common.UnitRole; @@ -199,6 +200,8 @@ public AnalyzeFormationDialog(JFrame frame, List generatedUnits, JButton btnOk = new JButton(Messages.getString("Okay")); btnOk.addActionListener(ev -> setVisible(false)); getContentPane().add(btnOk, BorderLayout.SOUTH); + + adaptToGUIScale(); pack(); } @@ -326,4 +329,8 @@ public Object getValueAt(int rowIndex, int columnIndex) { } } } + + private void adaptToGUIScale() { + UIUtil.adjustDialog(this, UIUtil.FONT_SCALE1); + } } diff --git a/megamek/src/megamek/client/ui/swing/BoardEditor.java b/megamek/src/megamek/client/ui/swing/BoardEditor.java index bcea278e586..06b93831745 100644 --- a/megamek/src/megamek/client/ui/swing/BoardEditor.java +++ b/megamek/src/megamek/client/ui/swing/BoardEditor.java @@ -19,6 +19,7 @@ */ package megamek.client.ui.swing; +import megamek.MMConstants; import megamek.client.event.BoardViewEvent; import megamek.client.event.BoardViewListenerAdapter; import megamek.client.ui.Messages; @@ -59,7 +60,6 @@ import java.io.*; import java.util.List; import java.util.*; -import java.util.stream.Collectors; import static megamek.common.Terrains.*; @@ -241,7 +241,7 @@ public void setTerrainTypes(List terrainTypes) { // The brush size: 1 = 1 hex, 2 = radius 1, 3 = radius 2 private int brushSize = 1; private int hexLeveltoDraw = -1000; - private final Font fontComboTerr = new Font("SansSerif", Font.BOLD, 12); + private final Font fontComboTerr = new Font(MMConstants.FONT_SANS_SERIF, Font.BOLD, 12); private EditorTextField texElev; private ScalingIconButton butElevUp; private ScalingIconButton butElevDown; @@ -2312,11 +2312,11 @@ public void paintComponent(Graphics g) { RenderingHints.VALUE_ANTIALIAS_ON); } g.setColor(getForeground()); - g.setFont(new Font("SansSerif", Font.PLAIN, 9)); + g.setFont(new Font(MMConstants.FONT_SANS_SERIF, Font.PLAIN, 9)); g.drawString(Messages.getString("BoardEditor.LEVEL") + curHex.getLevel(), 24, 70); StringBuffer errBuf = new StringBuffer(); if (!curHex.isValid(errBuf)) { - g.setFont(new Font("SansSerif", Font.BOLD, 14)); + g.setFont(new Font(MMConstants.FONT_SANS_SERIF, Font.BOLD, 14)); Point hexCenter = new Point(BoardView.HEX_W / 2, BoardView.HEX_H / 2); BoardView.drawCenteredText((Graphics2D) g, Messages.getString("BoardEditor.INVALID"), hexCenter, guip.getWarningColor(), false); @@ -2446,7 +2446,7 @@ public void mouseReleased(MouseEvent e) { }); setMargin(new Insets(1, 1, 1, 1)); setHorizontalAlignment(JTextField.CENTER); - setFont(new Font("SansSerif", Font.BOLD, 20)); + setFont(new Font(MMConstants.FONT_SANS_SERIF, Font.BOLD, 20)); setCursor(Cursor.getDefaultCursor()); } diff --git a/megamek/src/megamek/client/ui/swing/ChatterBox.java b/megamek/src/megamek/client/ui/swing/ChatterBox.java index 5cb57b810f5..d4844363885 100644 --- a/megamek/src/megamek/client/ui/swing/ChatterBox.java +++ b/megamek/src/megamek/client/ui/swing/ChatterBox.java @@ -15,7 +15,10 @@ import megamek.client.Client; import megamek.client.ui.Messages; +import megamek.client.ui.swing.util.UIUtil; import megamek.common.event.*; +import megamek.common.preference.IPreferenceChangeListener; +import megamek.common.preference.PreferenceChangeEvent; import megamek.common.preference.PreferenceManager; import javax.swing.*; @@ -28,7 +31,7 @@ * ChatterBox keeps track of a player list and a (chat) message buffer. Although * it is not an AWT component, it keeps one that it will gladly supply. */ -public class ChatterBox implements KeyListener { +public class ChatterBox implements KeyListener, IPreferenceChangeListener { public static final int MAX_HISTORY = 10; Client client; @@ -42,9 +45,15 @@ public class ChatterBox implements KeyListener { public LinkedList history; public int historyBookmark = -1; - + protected static final GUIPreferences GUIP = GUIPreferences.getInstance(); private ChatterBox2 cb2; + private static final String CB_KEY_ADVANCED_CHATBOXSIZE = "AdvancedChatboxSize"; + + private static final String MSG_MEGAMEK = Messages.getString("ChatterBox.Megamek"); + private static final String MSG_DONE = Messages.getString("ChatterBox.ImDone"); + private static final String MSG_ENTITIESADDED = Messages.getString("ChatterBox.entitiesAdded"); + public ChatterBox(ClientGUI clientgui) { client = clientgui.getClient(); client.getGame().addGameListener(new GameListenerAdapter() { @@ -75,7 +84,7 @@ public void gameEntityNew(GameEntityNewEvent e) { PlayerListDialog.refreshPlayerList(playerList, client); if (PreferenceManager.getClientPreferences() .getPrintEntityChange()) { - systemMessage(e.getNumberOfEntities() + " Entities added."); + systemMessage(e.getNumberOfEntities() + " " + MSG_ENTITIESADDED); } } @@ -94,18 +103,17 @@ public void gameEntityChange(GameEntityChangeEvent e) { }); history = new LinkedList<>(); - chatArea = new JTextArea(" \n", GUIPreferences.getInstance().getInt("AdvancedChatboxSize"), 40); + chatArea = new JTextArea(" \n", GUIPreferences.getInstance().getInt(CB_KEY_ADVANCED_CHATBOXSIZE), 40); chatArea.setEditable(false); chatArea.setLineWrap(true); chatArea.setWrapStyleWord(true); - chatArea.setFont(new Font("Sans Serif", Font.PLAIN, 12)); playerList = new JList<>(new DefaultListModel<>()); - playerList.setVisibleRowCount(GUIPreferences.getInstance().getInt("AdvancedChatboxSize")); + playerList.setVisibleRowCount(GUIPreferences.getInstance().getInt(CB_KEY_ADVANCED_CHATBOXSIZE)); scrPlayers = new JScrollPane(playerList); - scrPlayers.setPreferredSize(new Dimension(100, chatArea.getHeight())); + scrPlayers.setPreferredSize(new Dimension(250, chatArea.getHeight())); inputField = new JTextField(); inputField.addKeyListener(this); - butDone = new JButton(Messages.getString("ChatterBox.ImDone")); + butDone = new JButton(MSG_DONE); butDone.setEnabled(false); chatPanel = new JPanel(new BorderLayout()); @@ -116,8 +124,8 @@ public void gameEntityChange(GameEntityChangeEvent e) { playerChatSplit.setResizeWeight(0.01); JPanel subPanel = new JPanel(new BorderLayout()); - subPanel.setPreferredSize(new Dimension(284, 100)); - subPanel.setMinimumSize(new Dimension(284, 100)); + subPanel.setPreferredSize(new Dimension(284, 80)); + subPanel.setMinimumSize(new Dimension(284, 80)); subPanel.add(playerChatSplit, BorderLayout.CENTER); subPanel.add(inputField, BorderLayout.SOUTH); @@ -138,6 +146,9 @@ public void gameEntityChange(GameEntityChangeEvent e) { butDone.setPreferredSize(butDone.getSize()); butDone.setMinimumSize(butDone.getSize()); chatPanel.setMinimumSize(chatPanel.getPreferredSize()); + + adaptToGUIScale(); + GUIP.addPreferenceChangeListener(this); } /** @@ -164,7 +175,7 @@ public JComponent getComponent() { * @param message the String message to be shown. */ public void systemMessage(String message) { - chatArea.append("\nMegaMek: " + message); + chatArea.append("\n" + MSG_MEGAMEK + " " + message); moveToEnd(); } @@ -245,6 +256,18 @@ public void setChatterBox2(ChatterBox2 cb2) { this.cb2 = cb2; } + private void adaptToGUIScale() { + UIUtil.adjustContainer(chatPanel, UIUtil.FONT_SCALE1); + UIUtil.adjustContainer(butDone, UIUtil.FONT_SCALE1); + } + @Override + public void preferenceChange(PreferenceChangeEvent e) { + switch (e.getName()) { + case GUIPreferences.GUI_SCALE: + adaptToGUIScale(); + break; + } + } } diff --git a/megamek/src/megamek/client/ui/swing/ChatterBox2.java b/megamek/src/megamek/client/ui/swing/ChatterBox2.java index fcee7242c09..5306a747cbe 100644 --- a/megamek/src/megamek/client/ui/swing/ChatterBox2.java +++ b/megamek/src/megamek/client/ui/swing/ChatterBox2.java @@ -14,12 +14,14 @@ */ package megamek.client.ui.swing; +import megamek.MMConstants; import megamek.client.Client; import megamek.client.ui.IDisplayable; import megamek.client.ui.swing.boardview.BoardView; import megamek.client.ui.swing.util.CommandAction; import megamek.client.ui.swing.util.KeyCommandBind; import megamek.client.ui.swing.util.MegaMekController; +import megamek.client.ui.swing.util.UIUtil; import megamek.client.ui.swing.widget.PMUtil; import megamek.codeUtilities.StringUtility; import megamek.common.Configuration; @@ -27,6 +29,8 @@ import megamek.common.event.GameEntityNewEvent; import megamek.common.event.GameListenerAdapter; import megamek.common.event.GamePlayerChatEvent; +import megamek.common.preference.IPreferenceChangeListener; +import megamek.common.preference.PreferenceChangeEvent; import megamek.common.preference.PreferenceManager; import megamek.common.util.StringUtil; import megamek.common.util.fileUtils.MegaMekFile; @@ -44,17 +48,17 @@ * A graphical chatterbox within the boardview. * @author beerockxs2 */ -public class ChatterBox2 implements KeyListener, IDisplayable { +public class ChatterBox2 implements KeyListener, IDisplayable, IPreferenceChangeListener { private static final String FILENAME_BUTTON_UP = "upbutton.gif"; private static final String FILENAME_BUTTON_DOWN = "downbutton.gif"; private static final String FILENAME_BUTTON_MINIMISE = "minbutton.gif"; private static final String FILENAME_BUTTON_MAXIMISE = "maxbutton.gif"; private static final String FILENAME_BUTTON_RESIZE = "resizebutton.gif"; - private static final Font FONT_CHAT = new Font("SansSerif", Font.BOLD, - GUIPreferences.getInstance().getInt("AdvancedChatbox2Fontsize")); - private static final Color COLOR_TEXT_BACK = Color.black; - private static final Color COLOR_TEXT_FRONT = Color.white; + private Font FONT_CHAT = new Font(MMConstants.FONT_SANS_SERIF, Font.BOLD, + UIUtil.FONT_SCALE1); + private static final Color COLOR_TEXT_BACK = Color.BLACK; + private static final Color COLOR_TEXT_FRONT = Color.WHITE; private static final Color COLOR_BACKGROUND; private ChatterBox cb; @@ -116,6 +120,7 @@ public class ChatterBox2 implements KeyListener, IDisplayable { private Image resizebutton; private FontMetrics fm; + protected static final GUIPreferences GUIP = GUIPreferences.getInstance(); public ChatterBox2(ClientGUI client, BoardView boardview, MegaMekController controller) { this.client = client.getClient(); @@ -142,7 +147,7 @@ public void gameEntityChange(GameEntityChangeEvent e) { }); bv = boardview; - fm = bv.getFontMetrics(FONT_CHAT); + adaptToGUIScale(); Toolkit toolkit = bv.getToolkit(); upbutton = toolkit.getImage(new MegaMekFile(Configuration.widgetsDir(), @@ -162,6 +167,8 @@ public void gameEntityChange(GameEntityChangeEvent e) { PMUtil.setImage(resizebutton, client); registerKeyboardCommands(controller); + + GUIP.addPreferenceChangeListener(this); } private void registerKeyboardCommands(MegaMekController controller) { @@ -454,6 +461,7 @@ public boolean isHit(Point p, Dimension size) { public void draw(Graphics graph, Rectangle clipBounds) { graph.setColor(COLOR_BACKGROUND); graph.setFont(FONT_CHAT); + int h = fm.getHeight(); // Draw box. int yOffset = ((clipBounds.height) - height - DIST_BOTTOM) + slideOffset + clipBounds.y; @@ -469,7 +477,7 @@ public void draw(Graphics graph, Rectangle clipBounds) { } // Title - printLine(graph, "Incoming messages...", 29 + clipBounds.x, yOffset + 15); + printLine(graph, "Incoming messages...", 29 + clipBounds.x, yOffset + h); // resize button graph.drawImage(resizebutton, (width - 16) + clipBounds.x, yOffset + 3, bv); @@ -492,12 +500,13 @@ public void draw(Graphics graph, Rectangle clipBounds) { printLine(graph, visibleMessage + "_", 13 + clipBounds.x, (yOffset + height) - 7); } + // Text rows int rows = messages.size(); if (rows <= max_nbr_rows) { for (int i = 0; i < messages.size(); i++) { printLine(graph, messages.elementAt(i), 10 + clipBounds.x, yOffset - + 15 + ((i + 1) * 15)); + + h + ((i + 1) * h)); } } else { int row = 1; @@ -506,7 +515,7 @@ public void draw(Graphics graph, Rectangle clipBounds) { - chatScroll); i++) { if (i > -1) { printLine(graph, messages.elementAt(i), 10 + clipBounds.x, yOffset - + 15 + (row * 15)); + + h + (row * h)); row++; } } @@ -882,11 +891,32 @@ private int getMaxScrollbarHeight() { } private int getMaxSlideOffset() { - return height - 20; + return height - (fm.getHeight() + 10); } public void clearMessage() { message = ""; visibleMessage =""; } + + private void adaptToGUIScale() { + FONT_CHAT = FONT_CHAT.deriveFont((float) UIUtil.scaleForGUI(UIUtil.FONT_SCALE1)); + fm = bv.getFontMetrics(FONT_CHAT); + max_nbr_rows = (height / fm.getHeight()) - 2; + bv.refreshDisplayables(); + } + + @Override + public void preferenceChange(PreferenceChangeEvent e) { + switch (e.getName()) { + case GUIPreferences.GUI_SCALE: + if (isDown()) { + slideUp(); + } + + adaptToGUIScale(); + break; + + } + } } diff --git a/megamek/src/megamek/client/ui/swing/ClientDialog.java b/megamek/src/megamek/client/ui/swing/ClientDialog.java index 995d6bd599f..9e96acb485c 100644 --- a/megamek/src/megamek/client/ui/swing/ClientDialog.java +++ b/megamek/src/megamek/client/ui/swing/ClientDialog.java @@ -186,9 +186,13 @@ public void setVisible(boolean b) { * by {@link java.awt.Container#getComponent(int)}. */ public void guiScale() { - UIUtil.adjustDialog(getContentPane()); + adaptToGUIScale(); pack(); center(); } + private void adaptToGUIScale() { + UIUtil.adjustDialog(this, UIUtil.FONT_SCALE1); + } + } diff --git a/megamek/src/megamek/client/ui/swing/ClientGUI.java b/megamek/src/megamek/client/ui/swing/ClientGUI.java index 0b64d451371..8b59d1c94f5 100644 --- a/megamek/src/megamek/client/ui/swing/ClientGUI.java +++ b/megamek/src/megamek/client/ui/swing/ClientGUI.java @@ -23,7 +23,6 @@ import megamek.client.bot.princess.Princess; import megamek.client.event.BoardViewEvent; import megamek.client.event.BoardViewListener; -import megamek.client.ui.GBC; import megamek.client.ui.Messages; import megamek.client.ui.dialogs.UnitDisplayDialog; import megamek.client.ui.dialogs.helpDialogs.AbstractHelpDialog; @@ -56,11 +55,12 @@ import org.apache.logging.log4j.LogManager; import javax.imageio.ImageIO; +import javax.sound.sampled.AudioInputStream; +import javax.sound.sampled.AudioSystem; +import javax.sound.sampled.Clip; import javax.swing.*; import javax.swing.filechooser.FileFilter; import javax.swing.filechooser.FileNameExtensionFilter; -import java.applet.Applet; -import java.applet.AudioClip; import java.awt.*; import java.awt.event.*; import java.io.File; @@ -145,6 +145,7 @@ public class ClientGUI extends JPanel implements BoardViewListener, public static final String VIEW_UNIT_DISPLAY = "viewMekDisplay"; public static final String VIEW_ACCESSIBILITY_WINDOW = "viewAccessibilityWindow"; public static final String VIEW_KEYBINDS_OVERLAY = "viewKeyboardShortcuts"; + public static final String VIEW_PLANETARYCONDITIONS_OVERLAY = "viewPlanetaryConditions"; public static final String VIEW_MINI_MAP = "viewMinimap"; public static final String VIEW_UNIT_OVERVIEW = "viewUnitOverview"; public static final String VIEW_ZOOM_IN = "viewZoomIn"; @@ -179,6 +180,98 @@ public class ClientGUI extends JPanel implements BoardViewListener, //endregion help menu //endregion action commands + public static final String CG_BOARDVIEW = "BoardView"; + public static final String CG_CHATLOUNGE = "ChatLounge"; + public static final String CG_STARTINGSCENARIO = "JLabel-StartingScenario"; + public static final String CG_EXCHANGE = "JLabel-Exchange"; + public static final String CG_SELECTARTYAUTOHITHEXDISPLAY = "SelectArtyAutoHitHexDisplay"; + public static final String CG_DEPLOYMINEFIELDDISPLAY = "DeployMinefieldDisplay"; + public static final String CG_DEPLOYMENTDISPLAY = "DeploymentDisplay"; + public static final String CG_TARGETINGPHASEDISPLAY = "TargetingPhaseDisplay"; + public static final String CG_PREMOVEMENTDISPLAY = "PremovementDisplay"; + public static final String CG_MOVEMENTDISPLAY = "MovementDisplay"; + public static final String CG_OFFBOARDDISPLAY = "OffboardDisplay"; + public static final String CG_PREFIRING = "Prefiring"; + public static final String CG_FIRINGDISPLAY = "FiringDisplay"; + public static final String CG_POINTBLANKSHOTDISPLAY = "PointblankShotDisplay"; + public static final String CG_PHYSICALDISPLAY = "PhysicalDisplay"; + public static final String CG_REPORTDISPLAY = "ReportDisplay"; + public static final String CG_DEFAULT = "JLabel-Default"; + + public static final String CG_CHATCOMMANDSAVE = "/save"; + public static final String CG_CHATCOMMANDLOCALSAVE ="/localsave"; + + public static final String CG_FILEURLSTART = "file:///"; + public static final String CG_FILEPAHTUSERDIR = "user.dir"; + public static final String CG_FILEPATHBOARDS = "boards"; + public static final String CG_FILEPATHDATA= "data"; + public static final String CG_FILENAMESALVAGE = "salvage"; + public static final String CG_FILEPATHMUL = "mul"; + public static final String CG_FILEEXTENTIONBOARD = ".board"; + public static final String CG_FILEEXTENTIONMUL = ".mul"; + public static final String CG_FILEEXTENTIONXML = ".xml"; + public static final String CG_FILEEXTENTIONPNG = ".png"; + public static final String CG_FILEFORMATNAMEPNG = "png"; + + private static final String MSG_TITLE = Messages.getString("ClientGUI.title"); + private static final String MSG_FATALERRORTITLE = Messages.getString("ClientGUI.FatalError.title"); + private static final String MSG_FATALERRORMSG = Messages.getString("ClientGUI.FatalError.message"); + private static final String MSG_SKINNINGHELPPATH = Messages.getString("ClientGUI.skinningHelpPath"); + private static final String MSG_SKINNINGHELPPATHTITLE = Messages.getString("ClientGUI.skinningHelpPath.title"); + private static final String MSG_FILESAVESERVERDIALOGMSG = Messages.getString("ClientGUI.FileSaveServerDialog.message"); + private static final String MSG_FILESAVESERVERDIALOGTITTLE = Messages.getString("ClientGUI.FileSaveServerDialog.title"); + private static final String MSG_OPENUNITLISTFILEDIALOGNOREINFORCETITILE = Messages.getString("ClientGUI.openUnitListFileDialog.noReinforceTitle"); + private static final String MSG_OPENUNITLISTFILEDIALOGNOREINFORCEMSG = Messages.getString("ClientGUI.openUnitListFileDialog.noReinforceMessage"); + private static final String MSG_OPNEUNITLISTFILEDIALOGTITLE = Messages.getString("ClientGUI.openUnitListFileDialog.title"); + private static final String MSG_ERRORLOADINGFILE = Messages.getString("ClientGUI.errorLoadingFile"); + private static final String MSG_FILESAVEDIALOGTITLE = Messages.getString("ClientGUI.FileSaveDialog.title"); + private static final String MSG_SAVEUNITLISTFILEDIALOGTITLE = Messages.getString("ClientGUI.saveUnitListFileDialog.title"); + private static final String MSG_ERRORSAVINGFILE = Messages.getString("ClientGUI.errorSavingFile"); + private static final String MSG_STARTINGSCENARIO = Messages.getString("ClientGUI.StartingScenario"); + private static final String MSG_TRANSMITTINGDATA = Messages.getString("ClientGUI.TransmittingData"); + private static final String MSG_WAITINGONTHESERVER = Messages.getString("ClientGUI.waitingOnTheServer"); + private static final String MSG_DISCONNECTEDMSG = Messages.getString("ClientGUI.Disconnected.message"); + private static final String MSG_DISCONNECTEDTITLE = Messages.getString("ClientGUI.Disconnected.title"); + private static final String MSG_SAVEUNITSDIALOGTITLE = Messages.getString("ClientGUI.SaveUnitsDialog.title"); + private static final String MSG_SAVEUNITSDIALOGMSG = Messages.getString("ClientGUI.SaveUnitsDialog.message"); + private static final String MSG_POINTBLANKSHOTMSG = Messages.getString("ClientGUI.PointBlankShot.Message"); + private static final String MSG_POINTBLANKSHOTTITLE = Messages.getString("ClientGUI.PointBlankShot.Title"); + private static final String MSG_CLIENTTITLESUFFIX = Messages.getString("ClientGUI.clientTitleSuffix"); + private static final String MSG_CHATTERBOXMEGAMEK = Messages.getString("ChatterBox.Megamek"); + private static final String MSG_GAMESAVEDIALOGMSG = Messages.getString("ClientGUI.gameSaveDialogMessage"); + private static final String MSG_GAMESAVEFIRST = Messages.getString("ClientGUI.gameSaveFirst"); + private static final String MSG_MECHSELECTORDIALOG = Messages.getString("ClientGUI.mechSelectorDialog"); + private static final String MSG_ERRORSELECTINGPLAYER = Messages.getString("ClientGUI.errorSelectingPlayer"); + private static final String MSG_DESCEMULEFILES = Messages.getString("ClientGUI.descriptionMULFiles"); + private static final String MSG_DIALOGTACTICALGENIUSREPORT = Messages.getString("ClientGUI.dialogTacticalGeniusReport"); + private static final String MSG_DIALOGDIALOGMOVEMENTREPORT = Messages.getString("ClientGUI.dialogMovementReport"); + private static final String MSG_MISSILESFROMANUNKNOWNATTACKER = Messages.getString("ClientGUI.missilesFromAnUnknownAttacker"); + private static final String MSG_ERROROPENINGFILETOSAVE = Messages.getString("ClientGUI.errorOpeningFileToSave"); + private static final String MSG_DISTANCE = Messages.getString("ClientGUI.distance"); + private static final String MSG_NOGHOSTPLAYERSTOREPLACE = Messages.getString("ClientGUI.noGhostPlayersToReplace"); + private static final String MSG_NOGHOSTS = Messages.getString("ClientGUI.noGhosts"); + private static final String MSG_BOARDEDITORWAITDIALOGTITLE = Messages.getString("BoardEditor.waitDialog.title"); + private static final String MSG_BOARDEDITORWAITDIALOGMSG = Messages.getString("BoardEditor.waitDialog.message"); + private static final String MSG_BOARDEDITORSAVEBOARDAS = Messages.getString("BoardEditor.saveBoardAs"); + private static final String MSG_BOARDEDITORSAVEASIMAGE = Messages.getString("BoardEditor.saveAsImage"); + private static final String MSG_CFRDOMINOTITLE = Messages.getString("CFRDomino.Title"); + private static final String MSG_CFRDOMINOMSG = Messages.getString("CFRDomino.Message"); + private static final String MSG_CFRDOMINOFORWARD = Messages.getString("CFRDomino.Forward"); + private static final String MSG_CFRDOMINOFBACKWARD = Messages.getFormattedString("CFRDomino.Backward"); + private static final String MSG_CFRDOMINONOACTION = Messages.getString("CFRDomino.NoAction"); + private static final String MSG_CFRAMASSIGNTITLE = Messages.getString("CFRAMSAssign.Title"); + private static final String MSG_CFRAMASSIGNMSG = Messages.getString("CFRAMSAssign.Message"); + private static final String MSG_CFAPDSASSIGNTITLE = Messages.getString("CFRAPDSAssign.Title"); + private static final String MSG_CFAPDSASSIGNMSG = Messages.getString("CFRAPDSAssign.Message"); + private static final String MSG_ERROR = Messages.getString("ERROR"); + private static final String MSG_FROM = Messages.getString("FROM"); + private static final String MSG_NONE = Messages.getString("NONE"); + private static final String MSG_STATUSBARPHASEDISPLAYPOINTBLANKSHOT = Messages.getString("StatusBarPhaseDisplay.pointblankShot"); + private static final String MSG_TAGTARGETDIALOGMSG = Messages.getString("TAGTargetDialog.message"); + private static final String MSG_TAGTARGETDIALOGTITLE = Messages.getString("TAGTargetDialog.title"); + private static final String MSG_TELEMISSILETARGETDIALOGTARGET = Messages.getString("TeleMissileTargetDialog.target"); + private static final String MSG_TELEMISSILETARGETDIALOGMSG = Messages.getString("TeleMissileTargetDialog.message"); + private static final String MSG_TELEMISSILETARGETDIALOGTITLE = Messages.getString("TeleMissileTargetDialog.title"); // a frame, to show stuff in public JFrame frame; @@ -223,7 +316,7 @@ public class ClientGUI extends JPanel implements BoardViewListener, /** * Cache for the "bing" soundclip. */ - private AudioClip bingClip; + private Clip bingClip; /** * Map each phase to the name of the card for the main display area. @@ -329,16 +422,23 @@ private void loadSoundClip() { if (GUIPreferences.getInstance().getSoundBingFilename() == null) { return; } + final File file = new File(GUIPreferences.getInstance().getSoundBingFilename()); + if (!file.exists()) { + LogManager.getLogger().error("Failed to load audio file named " + GUIPreferences.getInstance().getSoundBingFilename()); + return; + } try { - File file = new File(GUIPreferences.getInstance().getSoundBingFilename()); - if (!file.exists()) { - LogManager.getLogger().error("Failed to load audio file: " + GUIPreferences.getInstance().getSoundBingFilename()); - return; + if (bingClip != null) { + bingClip.close(); + } + bingClip = AudioSystem.getClip(); + try (AudioInputStream ais = AudioSystem.getAudioInputStream(file)) { + bingClip.open(ais); } - bingClip = Applet.newAudioClip(file.toURI().toURL()); } catch (Exception ex) { LogManager.getLogger().error("", ex); + bingClip = null; } } @@ -349,14 +449,14 @@ private void loadSoundClip() { */ public void systemMessage(String message) { cb.systemMessage(message); - cb2.addChatMessage("MegaMek: " + message); + cb2.addChatMessage(MSG_CHATTERBOXMEGAMEK + " " + message); } /** * Initializes a number of things about this frame. */ private void initializeFrame() { - frame = new JFrame(Messages.getString("ClientGUI.title")); + frame = new JFrame(MSG_TITLE); frame.setJMenuBar(menuBar); if (GUIPreferences.getInstance().getWindowSizeHeight() != 0) { @@ -397,7 +497,7 @@ private void initializeFrame() { * frame display area. */ private void layoutFrame() { - frame.setTitle(client.getName() + Messages.getString("ClientGUI.clientTitleSuffix")); + frame.setTitle(client.getName() + MSG_CLIENTTITLESUFFIX); frame.getContentPane().setLayout(new BorderLayout()); frame.getContentPane().add(this, BorderLayout.CENTER); frame.validate(); @@ -421,13 +521,13 @@ public void initialize() { bv = new BoardView(client.getGame(), controller, this); bv.setPreferredSize(getSize()); bvc = bv.getComponent(); - bvc.setName("BoardView"); + bvc.setName(CG_BOARDVIEW); bv.addBoardViewListener(this); client.setBoardView(bv); } catch (Exception ex) { LogManager.getLogger().fatal("", ex); - doAlertDialog(Messages.getString("ClientGUI.FatalError.title"), - Messages.getString("ClientGUI.FatalError.message") + ex); + doAlertDialog(MSG_FATALERRORTITLE, + MSG_FATALERRORMSG + ex); die(); } @@ -440,8 +540,8 @@ public void windowClosing(WindowEvent e) { if (!GUIPreferences.getInstance().getBoolean(GUIPreferences.ADVANCED_NO_SAVE_NAG)) { ignoreHotKeys = true; int savePrompt = JOptionPane.showConfirmDialog(null, - "Do you want to save the game before quitting MegaMek?", - "Save First?", + MSG_GAMESAVEDIALOGMSG, + MSG_GAMESAVEFIRST, JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.WARNING_MESSAGE); ignoreHotKeys = false; @@ -528,7 +628,7 @@ public void windowClosing(WindowEvent evt) { } mechSelectorDialog = new MegaMekUnitSelectorDialog(this, unitLoadingDialog); randomArmyDialog = new RandomArmyDialog(this); - new Thread(mechSelectorDialog, "Mech Selector Dialog").start(); + new Thread(mechSelectorDialog, MSG_MECHSELECTORDIALOG).start(); frame.setVisible(true); GUIP.addPreferenceChangeListener(this); } @@ -572,22 +672,19 @@ private void showHelp() { private void showSkinningHowTo() { try { // Get the correct help file. - StringBuilder helpPath = new StringBuilder("file:///"); - helpPath.append(System.getProperty("user.dir")); + StringBuilder helpPath = new StringBuilder(CG_FILEURLSTART); + helpPath.append(System.getProperty(CG_FILEPAHTUSERDIR)); if (!helpPath.toString().endsWith(File.separator)) { helpPath.append(File.separator); } - helpPath.append(Messages.getString("ClientGUI.skinningHelpPath")); + helpPath.append(MSG_SKINNINGHELPPATH); URL helpUrl = new URL(helpPath.toString()); // Launch the help dialog. - HelpDialog helpDialog = new HelpDialog( - Messages.getString("ClientGUI.skinningHelpPath.title"), - helpUrl); + HelpDialog helpDialog = new HelpDialog(MSG_SKINNINGHELPPATHTITLE, helpUrl); helpDialog.setVisible(true); } catch (MalformedURLException e) { - JOptionPane.showMessageDialog(this, e.getMessage(), "ERROR", - JOptionPane.ERROR_MESSAGE); + doAlertDialog(e.getMessage(), MSG_ERROR, JOptionPane.ERROR_MESSAGE); LogManager.getLogger().error("", e); } } @@ -636,7 +733,7 @@ private void showPlayerList() { private void showRoundReport() { ignoreHotKeys = true; if (miniReportDisplay == null) { - miniReportDisplay = new MiniReportDisplay(frame, client); + miniReportDisplay = new MiniReportDisplay(frame, this); } miniReportDisplay.setVisible(true); @@ -662,12 +759,12 @@ public void actionPerformed(ActionEvent event) { case FILE_GAME_SAVE_SERVER: ignoreHotKeys = true; String filename = (String) JOptionPane.showInputDialog(frame, - Messages.getString("ClientGUI.FileSaveServerDialog.message"), - Messages.getString("ClientGUI.FileSaveServerDialog.title"), + MSG_FILESAVESERVERDIALOGMSG, + MSG_FILESAVESERVERDIALOGTITTLE, JOptionPane.QUESTION_MESSAGE, null, null, MMConstants.DEFAULT_SAVEGAME_NAME); if (filename != null) { - client.sendChat("/save " + filename); + client.sendChat(CG_CHATCOMMANDSAVE + " " + filename); } ignoreHotKeys = false; break; @@ -715,9 +812,7 @@ public void actionPerformed(ActionEvent event) { case FILE_UNITS_REINFORCE_RAT: ignoreHotKeys = true; if (client.getLocalPlayer().getTeam() == Player.TEAM_UNASSIGNED) { - String title = Messages.getString("ClientGUI.openUnitListFileDialog.noReinforceTitle"); - String msg = Messages.getString("ClientGUI.openUnitListFileDialog.noReinforceMessage"); - JOptionPane.showMessageDialog(frame, msg, title, JOptionPane.ERROR_MESSAGE, null); + doAlertDialog(MSG_OPENUNITLISTFILEDIALOGNOREINFORCEMSG, MSG_OPENUNITLISTFILEDIALOGNOREINFORCETITILE, JOptionPane.ERROR_MESSAGE); return; } getRandomArmyDialog().setVisible(true); @@ -725,7 +820,7 @@ public void actionPerformed(ActionEvent event) { break; case FILE_REFRESH_CACHE: MechSummaryCache.refreshUnitData(false); - new Thread(mechSelectorDialog, "Mech Selector Dialog").start(); + new Thread(mechSelectorDialog, MSG_MECHSELECTORDIALOG).start(); break; case VIEW_CLIENT_SETTINGS: showSettings(); @@ -784,10 +879,9 @@ public void actionPerformed(ActionEvent event) { GUIPreferences.getInstance().setIsometricEnabled(bv.toggleIsometric()); break; case VIEW_TOGGLE_FOV_HIGHLIGHT: - GUIPreferences.getInstance().setFovHighlight( - !GUIPreferences.getInstance().getFovHighlight()); + GUIPreferences.getInstance().setFovHighlight(!GUIPreferences.getInstance().getFovHighlight()); bv.refreshDisplayables(); - if (client.getGame().getPhase() == GamePhase.MOVEMENT) { + if (client.getGame().getPhase().isMovement()) { bv.clearHexImageCache(); } break; @@ -799,7 +893,7 @@ public void actionPerformed(ActionEvent event) { case VIEW_TOGGLE_FOV_DARKEN: GUIPreferences.getInstance().setFovDarken(!GUIPreferences.getInstance().getFovDarken()); bv.refreshDisplayables(); - if (client.getGame().getPhase() == GamePhase.MOVEMENT) { + if (client.getGame().getPhase().isMovement()) { bv.clearHexImageCache(); } break; @@ -877,7 +971,7 @@ public void doSaveUnit() { if (!logDir.exists()) { logDir.mkdir(); } - String fileName = "salvage.mul"; // TODO : remove inline filename + String fileName = CG_FILENAMESALVAGE + CG_FILEEXTENTIONMUL; if (PreferenceManager.getClientPreferences().stampFilenames()) { fileName = StringUtil.addDateTimeStamp(fileName); } @@ -887,7 +981,7 @@ public void doSaveUnit() { EntityListFile.saveTo(unitFile, destroyed); } catch (Exception ex) { LogManager.getLogger().error("", ex); - doAlertDialog(Messages.getString("ClientGUI.errorSavingFile"), ex.getMessage()); + doAlertDialog(MSG_ERRORSAVINGFILE, ex.getMessage()); } } } @@ -980,6 +1074,15 @@ void die() { menuBar.die(); menuBar = null; } + + if (curPanel instanceof FiringDisplay) { + ((FiringDisplay) curPanel).stopTimer(); + } + + if (curPanel instanceof MovementDisplay) { + ((MovementDisplay) curPanel).stopTimer(); + } + GUIP.removePreferenceChangeListener(this); } @@ -1032,7 +1135,7 @@ void switchPanel(GamePhase phase) { } ChatLounge cl = (ChatLounge) phaseComponents.get(String.valueOf(GamePhase.LOUNGE)); cb.setDoneButton(cl.butDone); - cl.add(cb.getComponent(), BorderLayout.SOUTH); + cl.setBottom(cb.getComponent()); getBoardView().getTilesetManager().reset(); getUnitDisplayDialog().setVisible(false); setMapVisible(false); @@ -1063,7 +1166,7 @@ void switchPanel(GamePhase phase) { case VICTORY: rD = (ReportDisplay) phaseComponents.get(String.valueOf(GamePhase.INITIATIVE_REPORT)); cb.setDoneButton(rD.butDone); - rD.add(cb.getComponent(), GBC.eol().fill(GridBagConstraints.HORIZONTAL)); + rD.setBottom(cb.getComponent()); setMapVisible(false); setUnitDisplayVisible(false); break; @@ -1117,27 +1220,29 @@ private JComponent initializePanel(GamePhase phase) { case LOUNGE: component = new ChatLounge(this); chatlounge = (ChatLounge) component; - main = "ChatLounge"; + main = CG_CHATLOUNGE; component.setName(main); panMain.add(component, main); break; case STARTING_SCENARIO: - component = new JLabel(Messages.getString("ClientGUI.StartingScenario")); - main = "JLabel-StartingScenario"; + component = new JLabel(MSG_STARTINGSCENARIO); + UIUtil.scaleComp(component, UIUtil.FONT_SCALE1); + main = CG_STARTINGSCENARIO; component.setName(main); panMain.add(component, main); break; case EXCHANGE: chatlounge.killPreviewBV(); - component = new JLabel(Messages.getString("ClientGUI.TransmittingData")); - main = "JLabel-Exchange"; + component = new JLabel(MSG_TRANSMITTINGDATA); + UIUtil.scaleComp(component, UIUtil.FONT_SCALE1); + main = CG_EXCHANGE; component.setName(main); panMain.add(component, main); break; case SET_ARTILLERY_AUTOHIT_HEXES: component = new SelectArtyAutoHitHexDisplay(this); - main = "BoardView"; - secondary = "SelectArtyAutoHitHexDisplay"; + main = CG_BOARDVIEW; + secondary = CG_SELECTARTYAUTOHITHEXDISPLAY; component.setName(secondary); if (!mainNames.containsValue(main)) { panMain.add(bvc, main); @@ -1147,8 +1252,8 @@ private JComponent initializePanel(GamePhase phase) { break; case DEPLOY_MINEFIELDS: component = new DeployMinefieldDisplay(this); - main = "BoardView"; - secondary = "DeployMinefieldDisplay"; + main = CG_BOARDVIEW; + secondary = CG_DEPLOYMINEFIELDDISPLAY; component.setName(secondary); if (!mainNames.containsValue(main)) { panMain.add(bvc, main); @@ -1158,8 +1263,8 @@ private JComponent initializePanel(GamePhase phase) { break; case DEPLOYMENT: component = new DeploymentDisplay(this); - main = "BoardView"; - secondary = "DeploymentDisplay"; + main = CG_BOARDVIEW; + secondary = CG_DEPLOYMENTDISPLAY; component.setName(secondary); if (!mainNames.containsValue(main)) { panMain.add(bvc, main); @@ -1170,8 +1275,8 @@ private JComponent initializePanel(GamePhase phase) { case TARGETING: component = new TargetingPhaseDisplay(this, false); ((TargetingPhaseDisplay) component).initializeListeners(); - main = "BoardView"; - secondary = "TargetingPhaseDisplay"; + main = CG_BOARDVIEW; + secondary = CG_TARGETINGPHASEDISPLAY; component.setName(secondary); if (!mainNames.containsValue(main)) { panMain.add(bvc, main); @@ -1183,8 +1288,8 @@ private JComponent initializePanel(GamePhase phase) { case PREMOVEMENT: component = new PrephaseDisplay(this, GamePhase.PREMOVEMENT); ((PrephaseDisplay) component).initializeListeners(); - main = "BoardView"; - secondary = "PremovementDisplay"; + main = CG_BOARDVIEW; + secondary = CG_PREMOVEMENTDISPLAY; component.setName(secondary); if (!mainNames.containsValue(main)) { panMain.add(bvc, main); @@ -1194,8 +1299,8 @@ private JComponent initializePanel(GamePhase phase) { break; case MOVEMENT: component = new MovementDisplay(this); - main = "BoardView"; - secondary = "MovementDisplay"; + main = CG_BOARDVIEW; + secondary = CG_MOVEMENTDISPLAY; component.setName(secondary); if (!mainNames.containsValue(main)) { panMain.add(bvc, main); @@ -1206,8 +1311,8 @@ private JComponent initializePanel(GamePhase phase) { case OFFBOARD: component = new TargetingPhaseDisplay(this, true); ((TargetingPhaseDisplay) component).initializeListeners(); - main = "BoardView"; - secondary = "OffboardDisplay"; + main = CG_BOARDVIEW; + secondary = CG_OFFBOARDDISPLAY; component.setName(secondary); if (!mainNames.containsValue(main)) { panMain.add(bvc, main); @@ -1218,8 +1323,8 @@ private JComponent initializePanel(GamePhase phase) { case PREFIRING: component = new PrephaseDisplay(this, GamePhase.PREFIRING); ((PrephaseDisplay) component).initializeListeners(); - main = "BoardView"; - secondary = "Prefiring"; + main = CG_BOARDVIEW; + secondary = CG_PREFIRING; component.setName(secondary); if (!mainNames.containsValue(main)) { panMain.add(bvc, main); @@ -1229,8 +1334,8 @@ private JComponent initializePanel(GamePhase phase) { break; case FIRING: component = new FiringDisplay(this); - main = "BoardView"; - secondary = "FiringDisplay"; + main = CG_BOARDVIEW; + secondary = CG_FIRINGDISPLAY; component.setName(secondary); if (!mainNames.containsValue(main)) { panMain.add(bvc, main); @@ -1240,8 +1345,8 @@ private JComponent initializePanel(GamePhase phase) { break; case POINTBLANK_SHOT: component = new PointblankShotDisplay(this); - main = "BoardView"; - secondary = "PointblankShotDisplay"; + main = CG_BOARDVIEW; + secondary = CG_POINTBLANKSHOTDISPLAY; component.setName(secondary); if (!mainNames.containsValue(main)) { panMain.add(bvc, main); @@ -1251,8 +1356,8 @@ private JComponent initializePanel(GamePhase phase) { break; case PHYSICAL: component = new PhysicalDisplay(this); - main = "BoardView"; - secondary = "PhysicalDisplay"; + main = CG_BOARDVIEW; + secondary = CG_PHYSICALDISPLAY; component.setName(secondary); if (!mainNames.containsValue(main)) { panMain.add(bvc, main); @@ -1262,7 +1367,7 @@ private JComponent initializePanel(GamePhase phase) { break; case INITIATIVE_REPORT: component = new ReportDisplay(this); - main = "ReportDisplay"; + main = CG_REPORTDISPLAY; component.setName(main); panMain.add(main, component); break; @@ -1279,11 +1384,11 @@ private JComponent initializePanel(GamePhase phase) { // no ReportDisplay to reuse - get a new one component = initializePanel(GamePhase.INITIATIVE_REPORT); } - main = "ReportDisplay"; + main = CG_REPORTDISPLAY; break; default: - component = new JLabel(Messages.getString("ClientGUI.waitingOnTheServer")); - main = "JLabel-Default"; + component = new JLabel(MSG_WAITINGONTHESERVER); + main = CG_DEFAULT; secondary = main; component.setName(main); panMain.add(main, component); @@ -1294,6 +1399,7 @@ private JComponent initializePanel(GamePhase phase) { if (secondary != null) { secondaryNames.put(name, secondary); } + return component; } @@ -1399,6 +1505,10 @@ private boolean fillPopup(Coords coords) { * Pops up a dialog box showing an alert */ public void doAlertDialog(String title, String message) { + doAlertDialog(title, message, JOptionPane.ERROR_MESSAGE); + } + + public void doAlertDialog(String title, String message, int msgTyoe) { JTextPane textArea = new JTextPane(); ReportDisplay.setupStylesheet(textArea); BASE64ToolKit toolKit = new BASE64ToolKit(); @@ -1407,11 +1517,11 @@ public void doAlertDialog(String title, String message) { JScrollPane scrollPane = new JScrollPane(textArea, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED); + UIUtil.adjustContainer(scrollPane, UIUtil.FONT_SCALE1); textArea.setText("
" + message + "
"); scrollPane.setPreferredSize(new Dimension( (int) (getSize().getWidth() / 1.5), (int) (getSize().getHeight() / 1.5))); - JOptionPane.showMessageDialog(frame, scrollPane, title, - JOptionPane.ERROR_MESSAGE); + JOptionPane.showMessageDialog(frame, scrollPane, title, msgTyoe); } /** @@ -1500,29 +1610,27 @@ protected void loadListFile(Player player, boolean reinforce) { boolean addedUnits = false; if (reinforce && (player.getTeam() == Player.TEAM_UNASSIGNED)) { - String title = Messages.getString("ClientGUI.openUnitListFileDialog.noReinforceTitle"); - String msg = Messages.getString("ClientGUI.openUnitListFileDialog.noReinforceMessage"); - JOptionPane.showMessageDialog(frame, msg, title, JOptionPane.ERROR_MESSAGE, null); + doAlertDialog(MSG_OPENUNITLISTFILEDIALOGNOREINFORCEMSG, MSG_OPENUNITLISTFILEDIALOGNOREINFORCETITILE, JOptionPane.ERROR_MESSAGE); return; } // Build the "load unit" dialog, if necessary. if (dlgLoadList == null) { dlgLoadList = new JFileChooser("."); dlgLoadList.setLocation(frame.getLocation().x + 150, frame.getLocation().y + 100); - dlgLoadList.setDialogTitle(Messages.getString("ClientGUI.openUnitListFileDialog.title")); + dlgLoadList.setDialogTitle(MSG_OPNEUNITLISTFILEDIALOGTITLE); dlgLoadList.setFileFilter(new FileFilter() { @Override public boolean accept(File dir) { - return (dir.getName().endsWith(".mul") || dir.isDirectory()); + return (dir.getName().endsWith(CG_FILEEXTENTIONMUL) || dir.isDirectory()); } @Override public String getDescription() { - return "*.mul"; + return "*" + CG_FILEEXTENTIONMUL; } }); // Default to the player's name. - dlgLoadList.setSelectedFile(new File(player.getName() + ".mul")); + dlgLoadList.setSelectedFile(new File(player.getName() + CG_FILEEXTENTIONMUL)); } int returnVal = dlgLoadList.showOpenDialog(frame); @@ -1560,7 +1668,7 @@ public String getDescription() { } } catch (Exception ex) { LogManager.getLogger().error("", ex); - doAlertDialog(Messages.getString("ClientGUI.errorLoadingFile"), ex.getMessage()); + doAlertDialog(MSG_ERRORLOADINGFILE, ex.getMessage()); } } @@ -1571,7 +1679,7 @@ public String getDescription() { } } else { - doAlertDialog(Messages.getString("ClientGUI.errorLoadingFile"), "Error selecting player"); + doAlertDialog(MSG_ERRORLOADINGFILE, MSG_ERRORSELECTINGPLAYER); } } @@ -1579,7 +1687,7 @@ private boolean saveGame() { ignoreHotKeys = true; JFileChooser fc = new JFileChooser(MMConstants.SAVEGAME_DIR); fc.setLocation(frame.getLocation().x + 150, frame.getLocation().y + 100); - fc.setDialogTitle(Messages.getString("ClientGUI.FileSaveDialog.title")); + fc.setDialogTitle(MSG_FILESAVEDIALOGTITLE); int returnVal = fc.showSaveDialog(frame); ignoreHotKeys = false; @@ -1593,7 +1701,7 @@ private boolean saveGame() { // the name String path = fc.getSelectedFile().getParentFile().getPath(); path = path.replace(" ", "|"); - client.sendChat("/localsave " + file + " " + path); + client.sendChat(CG_CHATCOMMANDLOCALSAVE + " " + file + " " + path); return true; } return false; @@ -1601,7 +1709,7 @@ private boolean saveGame() { /** Developer Utility: Save game to quicksave.sav.gz without any prompts. */ private boolean quickSaveGame() { - client.sendChat("/localsave " + MMConstants.QUICKSAVE_FILE + " " + MMConstants.QUICKSAVE_PATH); + client.sendChat(CG_CHATCOMMANDLOCALSAVE + " " + MMConstants.QUICKSAVE_FILE + " " + MMConstants.QUICKSAVE_PATH); return true; } @@ -1631,12 +1739,12 @@ public void saveListFile(ArrayList unitList, String filename) { if (dlgSaveList == null) { dlgSaveList = new JFileChooser("."); dlgSaveList.setLocation(frame.getLocation().x + 150, frame.getLocation().y + 100); - dlgSaveList.setDialogTitle(Messages.getString("ClientGUI.saveUnitListFileDialog.title")); - FileNameExtensionFilter filter = new FileNameExtensionFilter("Mul Files", "mul"); + dlgSaveList.setDialogTitle(MSG_SAVEUNITLISTFILEDIALOGTITLE); + FileNameExtensionFilter filter = new FileNameExtensionFilter(MSG_DESCEMULEFILES, CG_FILEPATHMUL); dlgSaveList.setFileFilter(filter); } // Default to the player's name. - dlgSaveList.setSelectedFile(new File(filename + ".mul")); + dlgSaveList.setSelectedFile(new File(filename + CG_FILEEXTENTIONMUL)); int returnVal = dlgSaveList.showSaveDialog(frame); if ((returnVal != JFileChooser.APPROVE_OPTION) || (dlgSaveList.getSelectedFile() == null)) { @@ -1647,10 +1755,10 @@ public void saveListFile(ArrayList unitList, String filename) { // Did the player select a file? File unitFile = dlgSaveList.getSelectedFile(); if (unitFile != null) { - if (!(unitFile.getName().toLowerCase().endsWith(".mul") - || unitFile.getName().toLowerCase().endsWith(".xml"))) { + if (!(unitFile.getName().toLowerCase().endsWith(CG_FILEEXTENTIONMUL) + || unitFile.getName().toLowerCase().endsWith(CG_FILEEXTENTIONXML))) { try { - unitFile = new File(unitFile.getCanonicalPath() + ".mul"); + unitFile = new File(unitFile.getCanonicalPath() + CG_FILEEXTENTIONMUL); } catch (Exception ignored) { // nothing needs to be done here return; @@ -1662,7 +1770,7 @@ public void saveListFile(ArrayList unitList, String filename) { EntityListFile.saveTo(unitFile, unitList); } catch (Exception ex) { LogManager.getLogger().error("", ex); - doAlertDialog(Messages.getString("ClientGUI.errorSavingFile"), ex.getMessage()); + doAlertDialog(MSG_ERRORSAVINGFILE, ex.getMessage()); } } } @@ -1674,12 +1782,12 @@ protected void saveVictoryList() { if (dlgSaveList == null) { dlgSaveList = new JFileChooser("."); dlgSaveList.setLocation(frame.getLocation().x + 150, frame.getLocation().y + 100); - dlgSaveList.setDialogTitle(Messages.getString("ClientGUI.saveUnitListFileDialog.title")); - FileNameExtensionFilter filter = new FileNameExtensionFilter("Mul Files", "mul"); + dlgSaveList.setDialogTitle(MSG_SAVEUNITLISTFILEDIALOGTITLE); + FileNameExtensionFilter filter = new FileNameExtensionFilter(MSG_DESCEMULEFILES, CG_FILEPATHMUL); dlgSaveList.setFileFilter(filter); } // Default to the player's name. - dlgSaveList.setSelectedFile(new File(filename + ".mul")); + dlgSaveList.setSelectedFile(new File(filename + CG_FILEEXTENTIONMUL)); int returnVal = dlgSaveList.showSaveDialog(frame); if ((returnVal != JFileChooser.APPROVE_OPTION) || (dlgSaveList.getSelectedFile() == null)) { @@ -1690,10 +1798,10 @@ protected void saveVictoryList() { // Did the player select a file? File unitFile = dlgSaveList.getSelectedFile(); if (unitFile != null) { - if (!(unitFile.getName().toLowerCase().endsWith(".mul") - || unitFile.getName().toLowerCase().endsWith(".xml"))) { + if (!(unitFile.getName().toLowerCase().endsWith(CG_FILEEXTENTIONMUL) + || unitFile.getName().toLowerCase().endsWith(CG_FILEEXTENTIONXML))) { try { - unitFile = new File(unitFile.getCanonicalPath() + ".mul"); + unitFile = new File(unitFile.getCanonicalPath() + CG_FILEEXTENTIONMUL); } catch (Exception ignored) { // nothing needs to be done here return; @@ -1705,7 +1813,7 @@ protected void saveVictoryList() { EntityListFile.saveTo(unitFile, getClient()); } catch (Exception ex) { LogManager.getLogger().error("", ex); - doAlertDialog(Messages.getString("ClientGUI.errorSavingFile"), ex.getMessage()); + doAlertDialog(MSG_ERRORSAVINGFILE, ex.getMessage()); } } } @@ -1754,7 +1862,8 @@ public void loadPreviewImage(JLabel bp, Entity entity, Player player) { */ void bing() { if (!GUIPreferences.getInstance().getSoundMute() && (bingClip != null)) { - bingClip.play(); + bingClip.setFramePosition(0); + bingClip.start(); } } @@ -1772,10 +1881,7 @@ public void gamePlayerChange(GamePlayerChangeEvent evt) { @Override public void gamePlayerDisconnected(GamePlayerDisconnectedEvent evt) { - JOptionPane.showMessageDialog(frame, - Messages.getString("ClientGUI.Disconnected.message"), - Messages.getString("ClientGUI.Disconnected.title"), - JOptionPane.ERROR_MESSAGE); + doAlertDialog(MSG_DISCONNECTEDMSG, MSG_DISCONNECTEDTITLE, JOptionPane.ERROR_MESSAGE); frame.setVisible(false); die(); } @@ -1835,12 +1941,12 @@ public void gameReport(GameReportEvent e) { } // Show a popup to the players so that we know whats up! if (!(getClient() instanceof TestBot)) { - doAlertDialog("Tactical Genius Report", e.getReport()); + doAlertDialog(MSG_DIALOGTACTICALGENIUSREPORT, e.getReport()); } } else { // Continued movement after getting up if (!(getClient() instanceof TestBot)) { - doAlertDialog("Movement Report", e.getReport()); + doAlertDialog(MSG_DIALOGDIALOGMOVEMENTREPORT, e.getReport()); } } } @@ -1867,8 +1973,7 @@ public void gameEnd(GameEndEvent e) { // Allow players to save their living units to a file. // Don't bother asking if none survived. - if (!living.isEmpty() && doYesNoDialog(Messages.getString("ClientGUI.SaveUnitsDialog.title"), - Messages.getString("ClientGUI.SaveUnitsDialog.message"))) { + if (!living.isEmpty() && doYesNoDialog(MSG_SAVEUNITSDIALOGTITLE, MSG_SAVEUNITSDIALOGMSG)) { // Allow the player to save the units to a file. saveVictoryList(); } @@ -1889,7 +1994,7 @@ public void gameEnd(GameEndEvent e) { if (!logDir.exists()) { logDir.mkdir(); } - String fileName = "salvage.mul"; + String fileName = CG_FILENAMESALVAGE + CG_FILEEXTENTIONMUL; if (PreferenceManager.getClientPreferences().stampFilenames()) { fileName = StringUtil.addDateTimeStamp(fileName); } @@ -1899,7 +2004,7 @@ public void gameEnd(GameEndEvent e) { EntityListFile.saveTo(unitFile, destroyed); } catch (IOException ex) { LogManager.getLogger().error("", ex); - doAlertDialog(Messages.getString("ClientGUI.errorSavingFile"), ex.getMessage()); + doAlertDialog(MSG_ERRORSAVINGFILE, ex.getMessage()); } } @@ -1942,8 +2047,8 @@ public void gameClientFeedbackRequest(GameCFREvent evt) { stepForward.compile(client.getGame(), e, false); stepBackward.compile(client.getGame(), e, false); - String title = Messages.getString("CFRDomino.Title"); - String msg = Messages.getString("CFRDomino.Message", e.getDisplayName()); + String title = MSG_CFRDOMINOTITLE; + String msg = Messages.getFormattedString(MSG_CFRDOMINOMSG, e.getDisplayName()); int choice; Object[] options; MovePath[] paths; @@ -1951,9 +2056,9 @@ public void gameClientFeedbackRequest(GameCFREvent evt) { if (stepForward.isMoveLegal() && stepBackward.isMoveLegal()) { options = new Object[3]; paths = new MovePath[3]; - options[0] = Messages.getString("CFRDomino.Forward", stepForward.getMpUsed()); - options[1] = Messages.getString("CFRDomino.Backward", stepForward.getMpUsed()); - options[2] = Messages.getString("CFRDomino.NoAction"); + options[0] = Messages.getFormattedString(MSG_CFRDOMINOFORWARD, stepForward.getMpUsed()); + options[1] = Messages.getFormattedString(MSG_CFRDOMINOFBACKWARD, stepForward.getMpUsed()); + options[2] = MSG_CFRDOMINONOACTION; paths[0] = stepForward; paths[1] = stepBackward; paths[2] = null; @@ -1961,17 +2066,17 @@ public void gameClientFeedbackRequest(GameCFREvent evt) { } else if (stepForward.isMoveLegal()) { options = new Object[2]; paths = new MovePath[2]; - options[0] = Messages.getString("CFRDomino.Forward", stepForward.getMpUsed()); - options[1] = Messages.getString("CFRDomino.NoAction"); + options[0] = Messages.getFormattedString(MSG_CFRDOMINOFORWARD, stepForward.getMpUsed()); + options[1] = MSG_CFRDOMINONOACTION; paths[0] = stepForward; paths[1] = null; optionType = JOptionPane.YES_NO_OPTION; } else { // No request is sent if both moves are illegal options = new Object[2]; paths = new MovePath[2]; - options[0] = Messages.getString("CFRDomino.Backward", + options[0] = Messages.getFormattedString(MSG_CFRDOMINOFBACKWARD, new Object[] { stepForward.getMpUsed() }); - options[1] = Messages.getString("CFRDomino.NoAction"); + options[1] = MSG_CFRDOMINONOACTION; paths[0] = stepBackward; paths[1] = null; optionType = JOptionPane.YES_NO_OPTION; @@ -1987,30 +2092,27 @@ public void gameClientFeedbackRequest(GameCFREvent evt) { break; case CFR_AMS_ASSIGN: ArrayList amsOptions = new ArrayList<>(); - amsOptions.add("None"); + amsOptions.add(MSG_NONE); for (WeaponAttackAction waa : evt.getWAAs()) { Entity ae = waa.getEntity(client.getGame()); String waaMsg; if (ae != null) { Mounted weapon = ae.getEquipment(waa.getWeaponId()); - waaMsg = weapon.getDesc() + " from " - + ae.getDisplayName(); + waaMsg = weapon.getDesc() + " " + MSG_FROM + " " + ae.getDisplayName(); } else { - waaMsg = "Missiles from unknown attacker"; + waaMsg = MSG_MISSILESFROMANUNKNOWNATTACKER; } amsOptions.add(waaMsg); } optionType = JOptionPane.OK_CANCEL_OPTION; - title = Messages.getString("CFRAMSAssign.Title", - new Object[] { e.getDisplayName() }); - msg = Messages.getString("CFRAMSAssign.Message", - new Object[] { e.getDisplayName() }); + title = Messages.getFormattedString(MSG_CFRAMASSIGNTITLE, new Object[] { e.getDisplayName() }); + msg = Messages.getFormattedString(MSG_CFRAMASSIGNMSG, new Object[] { e.getDisplayName() }); result = JOptionPane.showInputDialog(frame, msg, title, JOptionPane.QUESTION_MESSAGE, null, amsOptions.toArray(), null); // If they closed it, assume no action - if ((result == null) || result.equals("None")) { + if ((result == null) || result.equals(MSG_NONE)) { client.sendAMSAssignCFRResponse(null); } else { client.sendAMSAssignCFRResponse( @@ -2019,7 +2121,7 @@ public void gameClientFeedbackRequest(GameCFREvent evt) { break; case CFR_APDS_ASSIGN: ArrayList apdsOptions = new ArrayList<>(); - apdsOptions.add("None"); + apdsOptions.add(MSG_NONE); Iterator distIt = evt.getApdsDists().iterator(); for (WeaponAttackAction waa : evt.getWAAs()) { Entity ae = waa.getEntity(client.getGame()); @@ -2027,25 +2129,23 @@ public void gameClientFeedbackRequest(GameCFREvent evt) { String waaMsg; if (ae != null) { Mounted weapon = ae.getEquipment(waa.getWeaponId()); - waaMsg = weapon.getDesc() + " from " - + ae.getDisplayName() + " (distance: " + waaMsg = weapon.getDesc() + " " + MSG_FROM + " " + + ae.getDisplayName() + " (" + MSG_DISTANCE + " " + dist + ")"; } else { - waaMsg = "Missiles from unknown attacker"; + waaMsg = MSG_MISSILESFROMANUNKNOWNATTACKER; } apdsOptions.add(waaMsg); } optionType = JOptionPane.OK_CANCEL_OPTION; - title = Messages.getString("CFRAPDSAssign.Title", - new Object[] { e.getDisplayName() }); - msg = Messages.getString("CFRAPDSAssign.Message", - new Object[] { e.getDisplayName() }); + title = Messages.getFormattedString(MSG_CFAPDSASSIGNTITLE, new Object[] { e.getDisplayName() }); + msg = Messages.getFormattedString(MSG_CFAPDSASSIGNMSG, new Object[] { e.getDisplayName() }); result = JOptionPane.showInputDialog(frame, msg, title, JOptionPane.QUESTION_MESSAGE, null, apdsOptions.toArray(), null); // If they closed it, assume no action - if ((result == null) || result.equals("None")) { + if ((result == null) || result.equals(MSG_NONE)) { client.sendAPDSAssignCFRResponse(null); } else { client.sendAPDSAssignCFRResponse( @@ -2061,8 +2161,7 @@ public void gameClientFeedbackRequest(GameCFREvent evt) { if ((attacker == null) || (target == null)) { if (curPanel instanceof StatusBarPhaseDisplay) { ((StatusBarPhaseDisplay) curPanel) - .setStatusBarText(Messages - .getString("StatusBarPhaseDisplay.pointblankShot")); + .setStatusBarText(MSG_STATUSBARPHASEDISPLAYPOINTBLANKSHOT); } return; } @@ -2071,9 +2170,9 @@ public void gameClientFeedbackRequest(GameCFREvent evt) { bv.highlight(attacker.getPosition()); bv.select(target.getPosition()); bv.cursor(target.getPosition()); - msg = Messages.getString("ClientGUI.PointBlankShot.Message", + msg = Messages.getFormattedString(MSG_POINTBLANKSHOTMSG, target.getShortName(), attacker.getShortName()); - title = Messages.getString("ClientGUI.PointBlankShot.Title"); + title = MSG_POINTBLANKSHOTTITLE; // Ask whether the player wants to take a PBS or not int pbsChoice = JOptionPane.showConfirmDialog(frame, msg, title, JOptionPane.YES_NO_OPTION, @@ -2107,14 +2206,12 @@ public void gameClientFeedbackRequest(GameCFREvent evt) { int th = toHitValues.get(i); Entity tgt = client.getGame().getEntity(id); if (tgt != null) { - targetDescriptions.add(String.format(Messages.getString("TeleMissileTargetDialog.target"), tgt.getDisplayName(), th)); + targetDescriptions.add(String.format(MSG_TELEMISSILETARGETDIALOGTARGET, tgt.getDisplayName(), th)); } } // Set up the selection pane - String i18nString = "TeleMissileTargetDialog.message"; - msg = Messages.getString(i18nString); - i18nString = "TeleMissileTargetDialog.title"; - title = Messages.getString(i18nString); + msg = MSG_TELEMISSILETARGETDIALOGMSG; + title = MSG_TELEMISSILETARGETDIALOGTITLE; String input = (String) JOptionPane.showInputDialog(frame, msg, title, JOptionPane.QUESTION_MESSAGE, null, targetDescriptions.toArray(), targetDescriptions.get(0)); @@ -2144,10 +2241,8 @@ public void gameClientFeedbackRequest(GameCFREvent evt) { } } // Set up the selection pane - i18nString = "TAGTargetDialog.message"; - msg = Messages.getString(i18nString); - i18nString = "TAGTargetDialog.title"; - title = Messages.getString(i18nString); + msg = MSG_TAGTARGETDIALOGMSG; + title = MSG_TAGTARGETDIALOGTITLE; input = (String) JOptionPane.showInputDialog(frame, msg, title, JOptionPane.QUESTION_MESSAGE, null, TAGTargetDescriptions.toArray(), TAGTargetDescriptions.get(0)); @@ -2215,7 +2310,7 @@ private void boardSave() { try (OutputStream os = new FileOutputStream(curfileBoard)) { client.getGame().getBoard().save(os); } catch (IOException e) { - LogManager.getLogger().error("Error opening file to save!", e); + LogManager.getLogger().error(MSG_ERROROPENINGFILETOSAVE, e); } } @@ -2227,8 +2322,8 @@ private void boardSaveImage(boolean ignoreUnits) { boardSaveAsImage(ignoreUnits); return; } - JDialog waitD = new JDialog(frame, Messages.getString("BoardEditor.waitDialog.title")); - waitD.add(new JLabel(Messages.getString("BoardEditor.waitDialog.message"))); + JDialog waitD = new JDialog(frame, MSG_BOARDEDITORWAITDIALOGTITLE); + waitD.add(new JLabel(MSG_BOARDEDITORWAITDIALOGMSG)); waitD.setSize(250, 130); // move to middle of screen waitD.setLocation( @@ -2240,7 +2335,7 @@ private void boardSaveImage(boolean ignoreUnits) { waitD.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); // save! try { - ImageIO.write(bv.getEntireBoardImage(ignoreUnits, false), "png", curfileBoardImage); + ImageIO.write(bv.getEntireBoardImage(ignoreUnits, false), CG_FILEFORMATNAMEPNG, curfileBoardImage); } catch (IOException e) { LogManager.getLogger().error("", e); } @@ -2253,9 +2348,9 @@ private void boardSaveImage(boolean ignoreUnits) { * the file. */ private void boardSaveAs() { - JFileChooser fc = new JFileChooser("data" + File.separator + "boards"); + JFileChooser fc = new JFileChooser(CG_FILEPATHDATA + File.separator + CG_FILEPATHBOARDS); fc.setLocation(frame.getLocation().x + 150, frame.getLocation().y + 100); - fc.setDialogTitle(Messages.getString("BoardEditor.saveBoardAs")); + fc.setDialogTitle(MSG_BOARDEDITORSAVEBOARDAS); fc.setFileFilter(new BoardFileFilter()); int returnVal = fc.showSaveDialog(frame); if ((returnVal != JFileChooser.APPROVE_OPTION) || (fc.getSelectedFile() == null)) { @@ -2265,9 +2360,9 @@ private void boardSaveAs() { curfileBoard = fc.getSelectedFile(); // make sure the file ends in board - if (!curfileBoard.getName().toLowerCase(Locale.ENGLISH).endsWith(".board")) { + if (!curfileBoard.getName().toLowerCase(Locale.ENGLISH).endsWith(CG_FILEEXTENTIONBOARD)) { try { - curfileBoard = new File(curfileBoard.getCanonicalPath() + ".board"); + curfileBoard = new File(curfileBoard.getCanonicalPath() +CG_FILEEXTENTIONBOARD); } catch (IOException ie) { // failure! return; @@ -2283,16 +2378,16 @@ private void boardSaveAs() { private void boardSaveAsImage(boolean ignoreUnits) { JFileChooser fc = new JFileChooser("."); fc.setLocation(frame.getLocation().x + 150, frame.getLocation().y + 100); - fc.setDialogTitle(Messages.getString("BoardEditor.saveAsImage")); + fc.setDialogTitle(MSG_BOARDEDITORSAVEASIMAGE); fc.setFileFilter(new FileFilter() { @Override public boolean accept(File dir) { - return (dir.getName().endsWith(".png") || dir.isDirectory()); + return (dir.getName().endsWith(CG_FILEEXTENTIONPNG) || dir.isDirectory()); } @Override public String getDescription() { - return ".png"; + return CG_FILEEXTENTIONPNG; } }); int returnVal = fc.showSaveDialog(frame); @@ -2303,9 +2398,9 @@ public String getDescription() { curfileBoardImage = fc.getSelectedFile(); // make sure the file ends in png - if (!curfileBoardImage.getName().toLowerCase(Locale.ENGLISH).endsWith(".png")) { + if (!curfileBoardImage.getName().toLowerCase(Locale.ENGLISH).endsWith(CG_FILEEXTENTIONPNG)) { try { - curfileBoardImage = new File(curfileBoardImage.getCanonicalPath() + ".png"); + curfileBoardImage = new File(curfileBoardImage.getCanonicalPath() + CG_FILEEXTENTIONPNG); } catch (IOException ie) { // failure! return; @@ -2395,8 +2490,7 @@ void replacePlayer() { Set ghostPlayers = client.getGame().getPlayersVector().stream() .filter(Player::isGhost).collect(Collectors.toSet()); if (ghostPlayers.isEmpty()) { - JOptionPane.showMessageDialog(this, "No ghost players to replace.", "No Ghosts", - JOptionPane.INFORMATION_MESSAGE); + doAlertDialog( MSG_NOGHOSTPLAYERSTOREPLACE, MSG_NOGHOSTS, JOptionPane.INFORMATION_MESSAGE); return; } @@ -2415,7 +2509,7 @@ void replacePlayer() { systemMessage(message.toString()); // Make this princess a locally owned bot if in the lobby. This way it // can be configured, and it will faithfully press Done when the local player does. - if ((princess != null) && client.getGame().getPhase() == GamePhase.LOUNGE) { + if ((princess != null) && client.getGame().getPhase().isLounge()) { getBots().put(player, princess); } } @@ -2443,12 +2537,19 @@ public int getPointblankEID() { return pointblankEID; } + /** Adapts the menu (the font size) to the current GUI scale. */ + private void adaptToGUIScale() { + + } + @Override public void preferenceChange(PreferenceChangeEvent e) { if (e.getName().equals(GUIPreferences.MINIMAP_ENABLED)) { maybeShowMinimap(); } else if (e.getName().equals(GUIPreferences.SHOW_UNIT_DISPLAY)) { maybeShowUnitDisplay(); + } else if (e.getName().equals(GUIPreferences.GUI_SCALE)) { + adaptToGUIScale(); } } diff --git a/megamek/src/megamek/client/ui/swing/CommonAboutDialog.java b/megamek/src/megamek/client/ui/swing/CommonAboutDialog.java index 09e6f68b9dc..9512bd54151 100644 --- a/megamek/src/megamek/client/ui/swing/CommonAboutDialog.java +++ b/megamek/src/megamek/client/ui/swing/CommonAboutDialog.java @@ -18,6 +18,7 @@ import megamek.MMConstants; import megamek.MegaMek; import megamek.client.ui.Messages; +import megamek.client.ui.swing.util.UIUtil; import megamek.common.Configuration; import megamek.common.util.fileUtils.MegaMekFile; import org.apache.logging.log4j.LogManager; @@ -93,6 +94,7 @@ public CommonAboutDialog(JFrame parentFrame) { JButton butClose = new ButtonEsc(new CloseAction(this)); // Assemble all + setLayout(new BorderLayout()); JPanel middlePanel = new JPanel(); middlePanel.setLayout(new BoxLayout(middlePanel, BoxLayout.Y_AXIS)); add(panTitle, BorderLayout.PAGE_START); @@ -102,9 +104,15 @@ public CommonAboutDialog(JFrame parentFrame) { add(middlePanel, BorderLayout.CENTER); add(butClose, BorderLayout.PAGE_END); + adaptToGUIScale(); + // Place in the middle of the screen pack(); setLocationRelativeTo(parentFrame); setResizable(false); } + + private void adaptToGUIScale() { + UIUtil.adjustDialog(this, UIUtil.FONT_SCALE1); + } } diff --git a/megamek/src/megamek/client/ui/swing/CommonMenuBar.java b/megamek/src/megamek/client/ui/swing/CommonMenuBar.java index a9d7deddf9a..1b748f3a1c8 100644 --- a/megamek/src/megamek/client/ui/swing/CommonMenuBar.java +++ b/megamek/src/megamek/client/ui/swing/CommonMenuBar.java @@ -103,6 +103,7 @@ public class CommonMenuBar extends JMenuBar implements ActionListener, IPreferen private JCheckBoxMenuItem viewMekDisplay = new JCheckBoxMenuItem(getString("CommonMenuBar.viewMekDisplay")); private JMenuItem viewAccessibilityWindow = new JMenuItem(getString("CommonMenuBar.viewAccessibilityWindow")); private JCheckBoxMenuItem viewKeybindsOverlay = new JCheckBoxMenuItem(getString("CommonMenuBar.viewKeyboardShortcuts")); + private JCheckBoxMenuItem viewPlanetaryConditionsOverlay = new JCheckBoxMenuItem(getString("CommonMenuBar.viewPlanetaryConditions")); private JMenuItem viewZoomIn = new JMenuItem(getString("CommonMenuBar.viewZoomIn")); private JMenuItem viewZoomOut = new JMenuItem(getString("CommonMenuBar.viewZoomOut")); private JMenuItem viewLabels = new JMenuItem(getString("CommonMenuBar.viewLabels")); @@ -249,6 +250,10 @@ public CommonMenuBar() { initMenuItem(viewKeybindsOverlay, menu, VIEW_KEYBINDS_OVERLAY); viewKeybindsOverlay.setSelected(GUIP.getBoolean(GUIPreferences.SHOW_KEYBINDS_OVERLAY)); + + initMenuItem(viewPlanetaryConditionsOverlay, menu, VIEW_PLANETARYCONDITIONS_OVERLAY); + viewPlanetaryConditionsOverlay.setSelected(GUIP.getBoolean(GUIPreferences.SHOW_PLANETARYCONDITIONS_OVERLAY)); + initMenuItem(viewUnitOverview, menu, VIEW_UNIT_OVERVIEW); viewUnitOverview.setSelected(GUIP.getShowUnitOverview()); initMenuItem(viewZoomIn, menu, VIEW_ZOOM_IN); @@ -310,6 +315,7 @@ private void setKeyBinds() { toggleHexCoords.setAccelerator(KeyCommandBind.keyStroke(KeyCommandBind.HEX_COORDS)); viewMovModEnvelope.setAccelerator(KeyCommandBind.keyStroke(KeyCommandBind.MOD_ENVELOPE)); viewKeybindsOverlay.setAccelerator(KeyCommandBind.keyStroke(KeyCommandBind.KEY_BINDS)); + viewPlanetaryConditionsOverlay.setAccelerator(KeyCommandBind.keyStroke(KeyCommandBind.PLANETARY_CONDITIONS)); viewMekDisplay.setAccelerator(KeyCommandBind.keyStroke(KeyCommandBind.UNIT_DISPLAY)); viewUnitOverview.setAccelerator(KeyCommandBind.keyStroke(KeyCommandBind.UNIT_OVERVIEW)); viewLOSSetting.setAccelerator(KeyCommandBind.keyStroke(KeyCommandBind.LOS_SETTING)); @@ -351,7 +357,10 @@ public void actionPerformed(ActionEvent event) { } else if (event.getActionCommand().equals(ClientGUI.VIEW_KEYBINDS_OVERLAY)) { GUIP.toggleKeybindsOverlay(); - + + } else if (event.getActionCommand().equals(ClientGUI.VIEW_PLANETARYCONDITIONS_OVERLAY)) { + GUIP.togglePlanetaryConditionsOverlay(); + } else if (event.getActionCommand().equals(ClientGUI.VIEW_TOGGLE_HEXCOORDS)) { boolean coordsShown = GUIP.getBoolean(GUIPreferences.SHOW_COORDS); GUIP.setValue(GUIPreferences.SHOW_COORDS, !coordsShown); @@ -388,15 +397,14 @@ public synchronized void removeActionListener(ActionListener listener) { actionListeners.remove(listener); } - /** Manages the enabled states of the menu items depending on where the menu is empoyed. */ + /** Manages the enabled states of the menu items depending on where the menu is employed. */ private synchronized void updateEnabledStates() { - boolean isLobby = isGame && (phase == GamePhase.LOUNGE); + boolean isLobby = isGame && phase.isLounge(); boolean isInGame = isGame && phase.isDuringOrAfter(GamePhase.DEPLOYMENT); boolean isInGameBoardView = isInGame && phase.isOnMap(); boolean isBoardView = isInGameBoardView || isBoardEditor; - boolean canSave = (phase != GamePhase.UNKNOWN) && (phase != GamePhase.SELECTION) - && (phase != GamePhase.EXCHANGE) && (phase != GamePhase.VICTORY) - && (phase != GamePhase.STARTING_SCENARIO); + boolean canSave = !phase.isUnknown() && !phase.isSelection() && !phase.isExchange() + && !phase.isVictory() && !phase.isStartingScenario(); viewAccessibilityWindow.setEnabled(false); @@ -445,6 +453,7 @@ private synchronized void updateEnabledStates() { viewZoomOut.setEnabled(isBoardView); toggleIsometric.setEnabled(isBoardView); viewKeybindsOverlay.setEnabled(isBoardView); + viewPlanetaryConditionsOverlay.setEnabled(isBoardView); toggleHexCoords.setEnabled(isBoardView); viewLOSSetting.setEnabled(isInGameBoardView); @@ -487,6 +496,8 @@ public void preferenceChange(PreferenceChangeEvent e) { toggleFieldOfFire.setSelected((Boolean) e.getNewValue()); } else if (e.getName().equals(GUIPreferences.SHOW_KEYBINDS_OVERLAY)) { viewKeybindsOverlay.setSelected((Boolean) e.getNewValue()); + } else if (e.getName().equals(GUIPreferences.SHOW_PLANETARYCONDITIONS_OVERLAY)) { + viewPlanetaryConditionsOverlay.setSelected((Boolean) e.getNewValue()); } else if (e.getName().equals(GUIPreferences.SHOW_UNIT_OVERVIEW)) { viewUnitOverview.setSelected((Boolean) e.getNewValue()); } else if (e.getName().equals(GUIPreferences.GUI_SCALE)) { diff --git a/megamek/src/megamek/client/ui/swing/CommonSettingsDialog.java b/megamek/src/megamek/client/ui/swing/CommonSettingsDialog.java index 4e578b94cb0..354aa1f156a 100644 --- a/megamek/src/megamek/client/ui/swing/CommonSettingsDialog.java +++ b/megamek/src/megamek/client/ui/swing/CommonSettingsDialog.java @@ -20,12 +20,14 @@ */ package megamek.client.ui.swing; +import megamek.MMConstants; import megamek.client.ui.Messages; import megamek.client.ui.baseComponents.AbstractButtonDialog; import megamek.client.ui.baseComponents.MMComboBox; import megamek.client.ui.swing.StatusBarPhaseDisplay.PhaseCommand; import megamek.client.ui.swing.unitDisplay.UnitDisplay; import megamek.client.ui.swing.util.KeyCommandBind; +import megamek.client.ui.swing.util.UIUtil; import megamek.client.ui.swing.widget.SkinXMLHandler; import megamek.common.Configuration; import megamek.common.KeyBindParser; @@ -158,7 +160,7 @@ private void moveElement(DefaultListModel srcModel, int srcIndex, int trg private final JCheckBox showUnitId = new JCheckBox(Messages.getString("CommonSettingsDialog.showUnitId")); private JComboBox displayLocale; private final JCheckBox showIPAddressesInChat = new JCheckBox(Messages.getString("CommonSettingsDialog.showIPAddressesInChat")); - + private JTextPane reportKeywordsTextPane; private final JCheckBox showDamageLevel = new JCheckBox(Messages.getString("CommonSettingsDialog.showDamageLevel")); private final JCheckBox showDamageDecal = new JCheckBox(Messages.getString("CommonSettingsDialog.showDamageDecal")); private final JCheckBox showMapsheets = new JCheckBox(Messages.getString("CommonSettingsDialog.showMapsheets")); @@ -258,6 +260,8 @@ private void moveElement(DefaultListModel srcModel, int srcIndex, int trg private int savedFovHighlightAlpha; private int savedFovDarkenAlpha; private int savedNumStripesSlider; + + private static final String MSG_REPORTKEYWORDS = Messages.getString("CommonSettingsDialog.ReportKeywords"); HashMap savedAdvancedOpt = new HashMap<>(); /** Constructs the Client Settings Dialog with a clientgui (used within the client, i.e. in lobby and game). */ @@ -301,6 +305,8 @@ public void windowClosing(WindowEvent e) { panTabs.add("Advanced", advancedSettingsPane); panTabs.add("Unit Display Order", unitDisplayPane); + adaptToGUIScale(); + return panTabs; } @@ -493,6 +499,16 @@ private JPanel getSettingsPanel() { comps.add(row); addLineSpacer(comps); + + JLabel reportKeywordsLabel = new JLabel(MSG_REPORTKEYWORDS + ": "); + reportKeywordsTextPane = new JTextPane(); + row = new ArrayList<>(); + row.add(reportKeywordsLabel); + row.add(reportKeywordsTextPane); + comps.add(row); + + addLineSpacer(comps); + comps.add(checkboxEntry(showIPAddressesInChat, Messages.getString("CommonSettingsDialog.showIPAddressesInChat.tooltip"))); return createSettingsPanel(comps); } @@ -577,6 +593,7 @@ public void setVisible(boolean visible) { stampFilenames.setSelected(cs.stampFilenames()); stampFormat.setEnabled(stampFilenames.isSelected()); stampFormat.setText(cs.getStampFormat()); + reportKeywordsTextPane.setText(cs.getReportKeywords()); showIPAddressesInChat.setSelected(cs.getShowIPAddressesInChat()); defaultAutoejectDisabled.setSelected(cs.defaultAutoejectDisabled()); @@ -698,8 +715,10 @@ public void setVisible(boolean visible) { cmdKeyMap.get(kcb.cmd).setText(KeyEvent.getKeyText(kcb.key)); } markDuplicateBinds(); - - } + + adaptToGUIScale(); + } + super.setVisible(visible); } @@ -783,6 +802,7 @@ protected void okAction() { // cs.setGameLogMaxSize(Integer.parseInt(gameLogMaxSize.getText())); cs.setStampFilenames(stampFilenames.isSelected()); cs.setStampFormat(stampFormat.getText()); + cs.setReportKeywords(reportKeywordsTextPane.getText()); cs.setShowIPAddressesInChat(showIPAddressesInChat.isSelected()); cs.setDefaultAutoejectDisabled(defaultAutoejectDisabled.isSelected()); @@ -1121,7 +1141,7 @@ private JPanel getGraphicsPanel() { fovHighlightAlpha.setMinorTickSpacing(5); fovHighlightAlpha.setPaintTicks(true); fovHighlightAlpha.setPaintLabels(true); - fovHighlightAlpha.setMaximumSize(new Dimension(400, 100)); + fovHighlightAlpha.setMaximumSize(new Dimension(800, 100)); fovHighlightAlpha.addChangeListener(this); fovHighlightAlpha.setToolTipText(Messages.getString("TacticalOverlaySettingsDialog.AlphaTooltip")); // Label @@ -1141,7 +1161,7 @@ private JPanel getGraphicsPanel() { addSpacer(comps, 3); row = new ArrayList<>(); - fovHighlightRingsRadiiLabel = new JLabel(Messages.getString("TacticalOverlaySettingsDialog.FovHighlightRingsRadii")); + fovHighlightRingsRadiiLabel = new JLabel(Messages.getString("TacticalOverlaySettingsDialog.FovHighlightRingsRadii")); row.add(Box.createRigidArea(DEPENDENT_INSET)); row.add(fovHighlightRingsRadiiLabel); comps.add(row); @@ -1151,7 +1171,7 @@ private JPanel getGraphicsPanel() { row = new ArrayList<>(); fovHighlightRingsRadii= new JTextField((2+1)*7); fovHighlightRingsRadii.addFocusListener(this); - fovHighlightRingsRadii.setMaximumSize(new Dimension(100, fovHighlightRingsRadii.getPreferredSize().height) ); + fovHighlightRingsRadii.setMaximumSize(new Dimension(240, 40)); row.add(Box.createRigidArea(DEPENDENT_INSET)); row.add(fovHighlightRingsRadii); comps.add(row); @@ -1169,7 +1189,7 @@ private JPanel getGraphicsPanel() { row = new ArrayList<>(); fovHighlightRingsColors= new JTextField(50);// ((3+1)*3+1)*7); fovHighlightRingsColors.addFocusListener(this); - fovHighlightRingsColors.setMaximumSize(new Dimension(200, fovHighlightRingsColors.getPreferredSize().height) ); + fovHighlightRingsColors.setMaximumSize(new Dimension(200, 40 )); row.add(Box.createRigidArea(DEPENDENT_INSET)); row.add(fovHighlightRingsColors); row.add(Box.createHorizontalGlue()); @@ -1187,7 +1207,7 @@ private JPanel getGraphicsPanel() { fovDarkenAlpha.setMinorTickSpacing(5); fovDarkenAlpha.setPaintTicks(true); fovDarkenAlpha.setPaintLabels(true); - fovDarkenAlpha.setMaximumSize(new Dimension(400, 100)); + fovDarkenAlpha.setMaximumSize(new Dimension(800, 100)); fovDarkenAlpha.addChangeListener(this); fovDarkenAlpha.setToolTipText(Messages.getString("TacticalOverlaySettingsDialog.AlphaTooltip")); darkenAlphaLabel = new JLabel(Messages.getString("TacticalOverlaySettingsDialog.FovDarkenAlpha")); @@ -1212,7 +1232,7 @@ private JPanel getGraphicsPanel() { numStripesSlider.setMinorTickSpacing(5); numStripesSlider.setPaintTicks(true); numStripesSlider.setPaintLabels(true); - numStripesSlider.setMaximumSize(new Dimension(250, 100)); + numStripesSlider.setMaximumSize(new Dimension(450, 100)); numStripesSlider.addChangeListener(this); numStripesSlider.setToolTipText(Messages.getString("TacticalOverlaySettingsDialog.FovStripesTooltip")); numStripesLabel = new JLabel( @@ -1580,7 +1600,7 @@ public void mouseMoved(MouseEvent e) { p.add(advancedKeys); advancedValue = new JTextField(10); - advancedValue.setFont(new Font(Font.SANS_SERIF, Font.PLAIN, 16)); + advancedValue.setFont(new Font(MMConstants.FONT_SANS_SERIF, Font.PLAIN, 16)); advancedValue.addFocusListener(this); p.add(advancedValue); @@ -1625,4 +1645,8 @@ public static List userDataFiles(File relativePath, String fileEnding) { } return result; } + + private void adaptToGUIScale() { + UIUtil.adjustDialog(this, UIUtil.FONT_SCALE1); + } } diff --git a/megamek/src/megamek/client/ui/swing/ConfirmDialog.java b/megamek/src/megamek/client/ui/swing/ConfirmDialog.java index 8ba065ea270..ba55c5c0c5d 100644 --- a/megamek/src/megamek/client/ui/swing/ConfirmDialog.java +++ b/megamek/src/megamek/client/ui/swing/ConfirmDialog.java @@ -37,6 +37,7 @@ import javax.swing.KeyStroke; import megamek.client.ui.Messages; +import megamek.client.ui.swing.util.UIUtil; /** * A simple yes/no confirmation dialog. @@ -125,6 +126,8 @@ private ConfirmDialog(JFrame p, String title, String question, } else { defaultButton = butYes; } + + adaptToGUIScale(); finishSetup(p); } @@ -175,7 +178,7 @@ private void addQuestion(String question) { c.gridheight = 2; c.insets = new Insets(5, 5, 5, 5); gridbag.setConstraints(questionLabel, c); - getContentPane().add(questionLabel); + add(questionLabel); } private void addInputs() { @@ -188,7 +191,7 @@ private void addInputs() { c.gridy = y++; gridbag.setConstraints(botherCheckbox, c); - getContentPane().add(botherCheckbox); + add(botherCheckbox); } GridBagLayout buttonGridbag = new GridBagLayout(); @@ -205,7 +208,7 @@ private void addInputs() { c.gridy = y; gridbag.setConstraints(panButtons, c); - getContentPane().add(panButtons); + add(panButtons); } private void finishSetup(JFrame p) { @@ -260,4 +263,8 @@ public boolean getShowAgain() { } return !botherCheckbox.isSelected(); } + + private void adaptToGUIScale() { + UIUtil.adjustDialog(this, UIUtil.FONT_SCALE1); + } } diff --git a/megamek/src/megamek/client/ui/swing/CustomMechDialog.java b/megamek/src/megamek/client/ui/swing/CustomMechDialog.java index b641ed05654..a60a4e6fbc3 100644 --- a/megamek/src/megamek/client/ui/swing/CustomMechDialog.java +++ b/megamek/src/megamek/client/ui/swing/CustomMechDialog.java @@ -16,6 +16,7 @@ import megamek.client.Client; import megamek.client.ui.GBC; import megamek.client.ui.Messages; +import megamek.client.ui.swing.util.UIUtil; import megamek.common.*; import megamek.common.enums.Gender; import megamek.common.options.*; @@ -514,6 +515,8 @@ public void windowClosing(WindowEvent e) { } }); + adaptToGUIScale(); + pack(); mainPanel.setSize(mainPanel.getSize().width, Math.min(mainPanel.getSize().height, 400)); @@ -641,6 +644,7 @@ public void refreshOptions() { } } + adaptToGUIScale(); validate(); } @@ -1411,5 +1415,8 @@ private void setupEquip() { m_equip = new EquipChoicePanel(entity, clientgui, client); panEquip.add(m_equip, GBC.std()); } - + + private void adaptToGUIScale() { + UIUtil.adjustDialog(this, UIUtil.FONT_SCALE1); + } } diff --git a/megamek/src/megamek/client/ui/swing/DeployMinefieldDisplay.java b/megamek/src/megamek/client/ui/swing/DeployMinefieldDisplay.java index 65074c20dd8..c82a78d2ef8 100644 --- a/megamek/src/megamek/client/ui/swing/DeployMinefieldDisplay.java +++ b/megamek/src/megamek/client/ui/swing/DeployMinefieldDisplay.java @@ -18,7 +18,6 @@ import megamek.client.ui.swing.widget.MegamekButton; import megamek.client.ui.swing.widget.SkinSpecification; import megamek.common.*; -import megamek.common.enums.GamePhase; import megamek.common.event.GamePhaseChangeEvent; import megamek.common.event.GameTurnChangeEvent; @@ -383,12 +382,12 @@ public void gamePhaseChange(GamePhaseChangeEvent e) { } if (clientgui.getClient().isMyTurn() - && (clientgui.getClient().getGame().getPhase() != GamePhase.DEPLOY_MINEFIELDS)) { + && !clientgui.getClient().getGame().getPhase().isDeployMinefields()) { endMyTurn(); } - if (clientgui.getClient().getGame().getPhase() == GamePhase.DEPLOY_MINEFIELDS) { - setStatusBarText(Messages - .getString("DeployMinefieldDisplay.waitingForDeploymentPhase")); + + if (clientgui.getClient().getGame().getPhase().isDeployMinefields()) { + setStatusBarText(Messages.getString("DeployMinefieldDisplay.waitingForDeploymentPhase")); } } diff --git a/megamek/src/megamek/client/ui/swing/DeploymentDisplay.java b/megamek/src/megamek/client/ui/swing/DeploymentDisplay.java index dc7ae1e579f..af28a50f2cd 100644 --- a/megamek/src/megamek/client/ui/swing/DeploymentDisplay.java +++ b/megamek/src/megamek/client/ui/swing/DeploymentDisplay.java @@ -26,7 +26,6 @@ import megamek.client.ui.swing.widget.MegamekButton; import megamek.client.ui.swing.widget.SkinSpecification; import megamek.common.*; -import megamek.common.enums.GamePhase; import megamek.common.event.GamePhaseChangeEvent; import megamek.common.event.GameTurnChangeEvent; import megamek.common.options.OptionsConstants; @@ -225,9 +224,7 @@ private void beginMyTurn() { private void endMyTurn() { final Game game = clientgui.getClient().getGame(); Entity next = game.getNextEntity(game.getTurnIndex()); - if ((GamePhase.DEPLOYMENT == game.getPhase()) - && (null != next) - && (null != ce()) + if (game.getPhase().isDeployment() && (null != next) && (null != ce()) && (next.getOwnerId() != ce().getOwnerId())) { clientgui.setUnitDisplayVisible(false); } @@ -370,7 +367,8 @@ public void gameTurnChange(GameTurnChangeEvent e) { && (game.getTurnIndex() != 0)) { return; } - if (game.getPhase() != GamePhase.DEPLOYMENT) { + + if (!game.getPhase().isDeployment()) { // ignore return; } @@ -398,14 +396,15 @@ public void gamePhaseChange(GamePhaseChangeEvent e) { clientgui.getBoardView().markDeploymentHexesFor(null); // In case of a /reset command, ensure the state gets reset - if (clientgui.getClient().getGame().getPhase() == GamePhase.LOUNGE) { + if (clientgui.getClient().getGame().getPhase().isLounge()) { endMyTurn(); } // Are we ignoring events? if (isIgnoringEvents()) { return; } - if (clientgui.getClient().getGame().getPhase() == GamePhase.DEPLOYMENT) { + + if (clientgui.getClient().getGame().getPhase().isDeployment()) { setStatusBarText(Messages.getString("DeploymentDisplay.waitingForDeploymentPhase")); } } diff --git a/megamek/src/megamek/client/ui/swing/DialogOptionComponent.java b/megamek/src/megamek/client/ui/swing/DialogOptionComponent.java index 10b2aef3647..1fe7f7ec585 100644 --- a/megamek/src/megamek/client/ui/swing/DialogOptionComponent.java +++ b/megamek/src/megamek/client/ui/swing/DialogOptionComponent.java @@ -120,13 +120,13 @@ public void mouseClicked(MouseEvent evt) { public static String convertToHtml(String source) { StringBuilder result = new StringBuilder(); - result.append(""); + result.append("
"); StringTokenizer tok = new StringTokenizer(source, "\n"); while (tok.hasMoreTokens()) { result.append(tok.nextToken()); result.append("
"); } - result.append(""); + result.append("
"); return result.toString(); } diff --git a/megamek/src/megamek/client/ui/swing/EquipChoicePanel.java b/megamek/src/megamek/client/ui/swing/EquipChoicePanel.java index 984c193c65e..cfbbb97ea29 100644 --- a/megamek/src/megamek/client/ui/swing/EquipChoicePanel.java +++ b/megamek/src/megamek/client/ui/swing/EquipChoicePanel.java @@ -278,7 +278,8 @@ public EquipChoicePanel(Entity entity, ClientGUI clientgui, Client client) { } // Set up searchlight - if (clientgui.getClient().getGame().getPlanetaryConditions().getLight() > PlanetaryConditions.L_DUSK) { + if (!entity.getsAutoExternalSearchlight() + && (client.getGame().getPlanetaryConditions().getLight() > PlanetaryConditions.L_DUSK)) { add(labSearchlight, GBC.std()); add(chSearchlight, GBC.eol()); chSearchlight.setSelected(entity.hasSearchlight() @@ -376,8 +377,10 @@ public void applyChoices() { } // update searchlight setting - entity.setExternalSearchlight(chSearchlight.isSelected()); - entity.setSearchlightState(chSearchlight.isSelected()); + if (!entity.getsAutoExternalSearchlight()) { + entity.setExternalSearchlight(chSearchlight.isSelected()); + entity.setSearchlightState(chSearchlight.isSelected()); + } if (entity.hasC3() && (choC3.getSelectedIndex() > -1)) { Entity chosen = client.getEntity(entityCorrespondance[choC3.getSelectedIndex()]); diff --git a/megamek/src/megamek/client/ui/swing/FiringDisplay.java b/megamek/src/megamek/client/ui/swing/FiringDisplay.java index dae43310e68..4e0c5b85765 100644 --- a/megamek/src/megamek/client/ui/swing/FiringDisplay.java +++ b/megamek/src/megamek/client/ui/swing/FiringDisplay.java @@ -21,13 +21,11 @@ import megamek.client.ui.swing.util.CommandAction; import megamek.client.ui.swing.util.KeyCommandBind; import megamek.client.ui.swing.util.MegaMekController; -import megamek.client.ui.swing.util.TurnTimer; import megamek.client.ui.swing.widget.MegamekButton; import megamek.client.ui.swing.widget.SkinSpecification; import megamek.common.*; import megamek.common.actions.*; import megamek.common.enums.AimingMode; -import megamek.common.enums.GamePhase; import megamek.common.event.GamePhaseChangeEvent; import megamek.common.event.GameTurnChangeEvent; import megamek.common.options.OptionsConstants; @@ -35,7 +33,6 @@ import megamek.common.weapons.Weapon; import megamek.common.weapons.capitalweapons.CapitalMissileWeapon; import megamek.common.weapons.mortars.VehicularGrenadeLauncherWeapon; - import org.apache.logging.log4j.LogManager; import javax.swing.*; @@ -47,11 +44,6 @@ public class FiringDisplay extends StatusBarPhaseDisplay implements ItemListener, ListSelectionListener { private static final long serialVersionUID = -5586388490027013723L; - /** - * timer that ends turn if time limit set in options is over - */ - private TurnTimer tt; - /** * This enumeration lists all of the possible ActionCommands that can be * carried out during the firing phase. Each command has a string for the @@ -877,25 +869,21 @@ protected void beginMyTurn() { .booleanOption(OptionsConstants.ADVCOMBAT_TACOPS_CALLED_SHOTS)); clientgui.getBoardView().select(null); } - // check if there should be a turn timer running - tt = TurnTimer.init(this, clientgui.getClient()); + + startTimer(); } /** * Does end turn stuff. */ protected void endMyTurn() { - //get rid of still running timer, if turn is concluded before time is up - if (tt != null) { - tt.stopTimer(); - tt = null; - } + stopTimer(); + // end my turn, then. Game game = clientgui.getClient().getGame(); Entity next = game.getNextEntity(game.getTurnIndex()); - if ((game.getPhase() == GamePhase.FIRING) - && (next != null) && (ce() != null) - && (next.getOwnerId() != ce().getOwnerId())) { + if (game.getPhase().isFiring() && (next != null) && (ce() != null) + && (next.getOwnerId() != ce().getOwnerId())) { clientgui.setUnitDisplayVisible(false); } cen = Entity.NONE; diff --git a/megamek/src/megamek/client/ui/swing/ForceGenerationOptionsPanel.java b/megamek/src/megamek/client/ui/swing/ForceGenerationOptionsPanel.java index f81c97df1e5..e0cfdf888e0 100644 --- a/megamek/src/megamek/client/ui/swing/ForceGenerationOptionsPanel.java +++ b/megamek/src/megamek/client/ui/swing/ForceGenerationOptionsPanel.java @@ -14,17 +14,13 @@ */ package megamek.client.ui.swing; -import java.awt.BorderLayout; -import java.awt.CardLayout; -import java.awt.Component; -import java.awt.GridBagConstraints; -import java.awt.GridBagLayout; -import java.awt.Insets; +import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.FocusEvent; import java.awt.event.FocusListener; import java.util.*; +import java.util.List; import java.util.stream.Collectors; import java.util.stream.IntStream; @@ -51,6 +47,7 @@ import megamek.client.ratgenerator.UnitTable; import megamek.client.ratgenerator.UnitTable.Parameters; import megamek.client.ui.Messages; +import megamek.client.ui.swing.util.UIUtil; import megamek.common.EntityMovementMode; import megamek.common.EntityWeightClass; import megamek.common.MechSummary; @@ -263,6 +260,8 @@ public ForceGenerationOptionsPanel(Use use) { c.weighty = 0.5; add(panUnitTypeOptions, c); + adaptToGUIScale(); + if (!RATGenerator.getInstance().isInitialized()) { RATGenerator.getInstance().registerListener(this); } @@ -1223,6 +1222,10 @@ public void setGeneratedUnits(List list) { generatedUnits = list; txtNoFormation.setVisible(list == null || list.isEmpty()); } - } + } + + private void adaptToGUIScale() { + UIUtil.adjustContainer(this, UIUtil.FONT_SCALE1); + } } diff --git a/megamek/src/megamek/client/ui/swing/ForceGeneratorViewUi.java b/megamek/src/megamek/client/ui/swing/ForceGeneratorViewUi.java index 129e9584204..a6ff2df7445 100644 --- a/megamek/src/megamek/client/ui/swing/ForceGeneratorViewUi.java +++ b/megamek/src/megamek/client/ui/swing/ForceGeneratorViewUi.java @@ -18,10 +18,10 @@ import megamek.client.ratgenerator.RATGenerator; import megamek.client.ratgenerator.Ruleset; import megamek.client.ui.Messages; +import megamek.client.ui.swing.util.UIUtil; import megamek.common.Entity; import megamek.common.UnitType; import megamek.common.annotations.Nullable; -import megamek.common.enums.GamePhase; import megamek.common.enums.SkillLevel; import org.apache.logging.log4j.LogManager; @@ -117,7 +117,8 @@ private void initUi() { forceTree = new JTree(new ForceTreeModel(null)); forceTree.setCellRenderer(new UnitRenderer()); - forceTree.setRowHeight(80); + // JTree setRowHeight(0) the height for each row is determined by the renderer + forceTree.setRowHeight(0); forceTree.setVisibleRowCount(12); forceTree.addTreeExpansionListener(new TreeExpansionListener() { @Override @@ -190,6 +191,8 @@ public void treeExpanded(TreeExpansionEvent evt) { leftPanel.setLayout(new BoxLayout(leftPanel, BoxLayout.Y_AXIS)); leftPanel.add(panControls); leftPanel.add(scroll); + + adaptToGUIScale(); } public Component getLeftPanel() { @@ -223,7 +226,7 @@ public void addChosenUnits(String playerName) { } for (Entity e : modelChosen.allEntities()) { e.setOwner(c.getLocalPlayer()); - if (c.getGame().getPhase() != GamePhase.LOUNGE) { + if (!c.getGame().getPhase().isLounge()) { e.setDeployRound(c.getGame().getRoundCount() + 1); e.setGame(c.getGame()); // Set these to true, otherwise units reinforced in @@ -334,6 +337,7 @@ private void showPopup(MouseEvent evt) { item = new JMenuItem("Export as MUL"); item.addActionListener(ev -> panControls.exportMUL(fd)); menu.add(item); + UIUtil.scaleMenu(menu); menu.show(evt.getComponent(), evt.getX(), evt.getY()); } } @@ -359,7 +363,7 @@ private void showPopup(MouseEvent evt) { JMenuItem item = new JMenuItem("Remove"); item.addActionListener(ev -> modelChosen.removeEntities(tblChosen.getSelectedRows())); menu.add(item); - + UIUtil.scaleMenu(menu); menu.show(evt.getComponent(), evt.getX(), evt.getY()); } } @@ -601,4 +605,9 @@ public String getColumnName(int column) { } } } + + private void adaptToGUIScale() { + UIUtil.adjustContainer(leftPanel, UIUtil.FONT_SCALE1); + UIUtil.adjustContainer(rightPanel, UIUtil.FONT_SCALE1); + } } diff --git a/megamek/src/megamek/client/ui/swing/GUIPreferences.java b/megamek/src/megamek/client/ui/swing/GUIPreferences.java index 154794035f1..1cb915b2f85 100644 --- a/megamek/src/megamek/client/ui/swing/GUIPreferences.java +++ b/megamek/src/megamek/client/ui/swing/GUIPreferences.java @@ -42,8 +42,6 @@ public class GUIPreferences extends PreferenceStoreProxy { * separated in the settings dialog shields new users from unnecessary * complication. */ - public static final String ADVANCED_CHATBOX_SIZE = "AdvancedChatboxSize"; - public static final String ADVANCED_CHAT_LOUNGE_TAB_FONT_SIZE = "AdvancedChatLoungeTabFontSize"; public static final String ADVANCED_MECH_DISPLAY_ARMOR_LARGE_FONT_SIZE = "AdvancedMechDisplayArmorLargeFontSize"; public static final String ADVANCED_MECH_DISPLAY_ARMOR_MEDIUM_FONT_SIZE = "AdvancedMechDisplayArmorMediumFontSize"; public static final String ADVANCED_MECH_DISPLAY_ARMOR_SMALL_FONT_SIZE = "AdvancedMechDisplayArmorSmallFontSize"; @@ -68,7 +66,6 @@ public class GUIPreferences extends PreferenceStoreProxy { public static final String ADVANCED_TRANSLUCENT_HIDDEN_UNITS = "AdvancedTranslucentHiddenUnits"; public static final String ADVANCED_ATTACK_ARROW_TRANSPARENCY = "AdvancedAttackArrowTransparency"; public static final String ADVANCED_BUILDING_TEXT_COLOR = "AdvancedBuildingTextColor"; - public static final String ADVANCED_CHATBOX2_FONTSIZE = "AdvancedChatbox2Fontsize"; public static final String ADVANCED_CHATBOX2_BACKCOLOR = "AdvancedChatbox2BackColor"; public static final String ADVANCED_CHATBOX2_TRANSPARANCY = "AdvancedChatbox2Transparancy"; public static final String ADVANCED_CHATBOX2_AUTOSLIDEDOWN = "AdvancedChatbox2AutoSlidedown"; @@ -103,6 +100,17 @@ public class GUIPreferences extends PreferenceStoreProxy { public static final String ADVANCED_HEAT_COLOR_30 = "AdvancedHeatColor30"; public static final String ADVANCED_HEAT_COLOR_OVERHEAT = "AdvancedHeatColorOverheat"; public static final String ADVANCED_REPORT_COLOR_LINK = "AdvancedReportColorLink"; + + public static final String ADVANCED_PLANETARY_CONDITIONS_COLOR_TITLE = "AdvancedPlanetaryConditionsColorTitle"; + public static final String ADVANCED_PLANETARY_CONDITIONS_COLOR_TEXT = "AdvancedPlanetaryConditionsColorText"; + public static final String ADVANCED_PLANETARY_CONDITIONS_COLOR_COLD = "AdvancedPlanetaryConditionsColorCold"; + public static final String ADVANCED_PLANETARY_CONDITIONS_COLOR_HOT = "AdvancedPlanetaryConditionsColorHot"; + public static final String ADVANCED_PLANETARY_CONDITIONS_COLOR_BACKGROUND = "AdvancedPlanetaryConditionsColorBackground"; + public static final String ADVANCED_PLANETARY_CONDITIONS_SHOW_DEFAULTS = "AdvancedPlanetaryConditionsShowDefaults"; + public static final String ADVANCED_PLANETARY_CONDITIONS_SHOW_HEADER = "AdvancedPlanetaryConditionsShowHeader"; + public static final String ADVANCED_PLANETARY_CONDITIONS_SHOW_LABELS = "AdvancedPlanetaryConditionsShowLabels"; + public static final String ADVANCED_PLANETARY_CONDITIONS_SHOW_VALUES = "AdvancedPlanetaryConditionsShowValues"; + public static final String ADVANCED_PLANETARY_CONDITIONS_SHOW_INDICATORS = "AdvancedPlanetaryConditionsShowIndicators"; public static final String ADVANCED_UNITTOOLTIP_SEENBYRESOLUTION = "AdvancedUnitToolTipSeenByResolution"; /* --End advanced settings-- */ @@ -254,6 +262,7 @@ public class GUIPreferences extends PreferenceStoreProxy { public static final String MY_UNIT_COLOR = "MyUnitColor"; public static final String ENEMY_UNIT_COLOR = "EnemyUnitColor"; public static final String SHOW_KEYBINDS_OVERLAY = "ShowKeybindsOverlay"; + public static final String SHOW_PLANETARYCONDITIONS_OVERLAY = "ShowPlanetaryConditionsOverlay"; public static final String UNIT_LABEL_STYLE = "UnitLabelStyle"; public static final String AS_CARD_FONT = "AsCardFont"; public static final String AS_CARD_SIZE = "AsCardSize"; @@ -299,6 +308,11 @@ public class GUIPreferences extends PreferenceStoreProxy { private static final Color DEFAULT_HEAT_30_COLOR = new Color(248, 64, 64); private static final Color DEFAULT_HEAT_OVERHEAT_COLOR = new Color(248, 12, 12); + private static final Color DEFAULT_PLANETARY_CONDITIONS_TEXT_COLOR = new Color(200, 250, 200); + private static final Color DEFAULT_PLANETARY_CONDITIONS_COLD_COLOR = new Color(173, 216, 230); + private static final Color DEFAULT_PLANETARY_CONDITIONS_HOT_COLOR = new Color(255, 204, 203); + private static final Color DEFAULT_PLANETARY_CONDITIONS_BACKGROUND_COLOR = new Color(80, 80, 80); + // Report Color private static final Color DEFAULT_REPORT_LINK_COLOR = new Color(73, 102, 230); @@ -318,8 +332,6 @@ public static GUIPreferences getInstance() { protected GUIPreferences() { store = PreferenceManager.getInstance().getPreferenceStore(getClass().getName()); - store.setDefault(ADVANCED_CHATBOX_SIZE, 5); - store.setDefault(ADVANCED_CHAT_LOUNGE_TAB_FONT_SIZE, 16); store.setDefault(ADVANCED_MECH_DISPLAY_ARMOR_LARGE_FONT_SIZE, 12); store.setDefault(ADVANCED_MECH_DISPLAY_ARMOR_MEDIUM_FONT_SIZE, 10); store.setDefault(ADVANCED_MECH_DISPLAY_ARMOR_SMALL_FONT_SIZE, 9); @@ -364,7 +376,6 @@ protected GUIPreferences() { store.setDefault(ADVANCED_ATTACK_ARROW_TRANSPARENCY, 0x80); setDefault(ADVANCED_BUILDING_TEXT_COLOR, DEFAULT_BLUE); setDefault(ADVANCED_CHATBOX2_BACKCOLOR, DEFAULT_WHITE); - store.setDefault(ADVANCED_CHATBOX2_FONTSIZE, 12); store.setDefault(ADVANCED_CHATBOX2_TRANSPARANCY, 50); store.setDefault(ADVANCED_CHATBOX2_AUTOSLIDEDOWN, true); store.setDefault(ADVANCED_ECM_TRANSPARENCY, 0x80); @@ -383,6 +394,17 @@ protected GUIPreferences() { setDefault(ADVANCED_HEAT_COLOR_20, DEFAULT_HEAT_30_COLOR); setDefault(ADVANCED_HEAT_COLOR_OVERHEAT, DEFAULT_HEAT_OVERHEAT_COLOR); + setDefault(ADVANCED_PLANETARY_CONDITIONS_COLOR_TITLE, Color.WHITE); + setDefault(ADVANCED_PLANETARY_CONDITIONS_COLOR_TEXT, DEFAULT_PLANETARY_CONDITIONS_TEXT_COLOR); + setDefault(ADVANCED_PLANETARY_CONDITIONS_COLOR_COLD, DEFAULT_PLANETARY_CONDITIONS_COLD_COLOR); + setDefault(ADVANCED_PLANETARY_CONDITIONS_COLOR_HOT, DEFAULT_PLANETARY_CONDITIONS_HOT_COLOR); + setDefault(ADVANCED_PLANETARY_CONDITIONS_COLOR_BACKGROUND, DEFAULT_PLANETARY_CONDITIONS_BACKGROUND_COLOR); + setDefault(ADVANCED_PLANETARY_CONDITIONS_SHOW_DEFAULTS, true); + setDefault(ADVANCED_PLANETARY_CONDITIONS_SHOW_HEADER, true); + setDefault(ADVANCED_PLANETARY_CONDITIONS_SHOW_LABELS, true); + setDefault(ADVANCED_PLANETARY_CONDITIONS_SHOW_VALUES, true); + setDefault(ADVANCED_PLANETARY_CONDITIONS_SHOW_INDICATORS, true); + setDefault(ADVANCED_REPORT_COLOR_LINK, DEFAULT_REPORT_LINK_COLOR); setDefault(ADVANCED_UNITTOOLTIP_SEENBYRESOLUTION, 3); @@ -544,6 +566,7 @@ protected GUIPreferences() { setDefault(TEAM_COLORING, true); setDefault(SHOW_KEYBINDS_OVERLAY, true); + setDefault(SHOW_PLANETARYCONDITIONS_OVERLAY, true); setDefault(AS_CARD_FONT, ""); setDefault(AS_CARD_SIZE, 0.75f); @@ -1724,6 +1747,86 @@ public void setReportLinkColor(Color color) { store.setValue(ADVANCED_REPORT_COLOR_LINK, getColorString(color)); } + public Color getPlanetaryConditionsColorTitle() { + return getColor(ADVANCED_PLANETARY_CONDITIONS_COLOR_TITLE); + } + + public Color getPlanetaryConditionsColorText() { + return getColor(ADVANCED_PLANETARY_CONDITIONS_COLOR_TEXT); + } + + public Color getPlanetaryConditionsColorCold() { + return getColor(ADVANCED_PLANETARY_CONDITIONS_COLOR_COLD); + } + + public Color getPlanetaryConditionsColorHot() { + return getColor(ADVANCED_PLANETARY_CONDITIONS_COLOR_HOT); + } + + public Color getPlanetaryConditionsColorBackground() { + return getColor(ADVANCED_PLANETARY_CONDITIONS_COLOR_BACKGROUND); + } + + public Boolean getAdvancedPlanetaryConditionsShowDefaults() { + return getBoolean(ADVANCED_PLANETARY_CONDITIONS_SHOW_DEFAULTS); + } + + public Boolean getAdvancedPlanetaryConditionsShowHeader() { + return getBoolean(ADVANCED_PLANETARY_CONDITIONS_SHOW_HEADER); + } + + public Boolean getAdvancedPlanetaryConditionsShowLabels() { + return getBoolean(ADVANCED_PLANETARY_CONDITIONS_SHOW_LABELS); + } + + public Boolean getAdvancedPlanetaryConditionsShowValues() { + return getBoolean(ADVANCED_PLANETARY_CONDITIONS_SHOW_VALUES); + } + + public Boolean getAdvancedPlanetaryConditionsShowIndicators() { + return getBoolean(ADVANCED_PLANETARY_CONDITIONS_SHOW_INDICATORS); + } + + public void setPlanetaryConditionsColorTitle(Color color) { + store.setValue(ADVANCED_PLANETARY_CONDITIONS_COLOR_TITLE, getColorString(color)); + } + + public void setPlanetaryConditionsColorText(Color color) { + store.setValue(ADVANCED_PLANETARY_CONDITIONS_COLOR_TEXT, getColorString(color)); + } + + public void setPlanetaryConditionsColorCold(Color color) { + store.setValue(ADVANCED_PLANETARY_CONDITIONS_COLOR_COLD, getColorString(color)); + } + + public void setPlanetaryConditionsColorHot(Color color) { + store.setValue(ADVANCED_PLANETARY_CONDITIONS_COLOR_HOT, getColorString(color)); + } + + public void setPlanetaryConditionsColorBackground(Color color) { + store.setValue(ADVANCED_PLANETARY_CONDITIONS_COLOR_BACKGROUND, getColorString(color)); + } + + public void setAdvancedPlanetaryConditionsHideDefaults(Boolean state) { + store.setValue(ADVANCED_PLANETARY_CONDITIONS_SHOW_DEFAULTS, state); + } + + public void setAdvancedPlanetaryConditionsHideHeader(Boolean state) { + store.setValue(ADVANCED_PLANETARY_CONDITIONS_SHOW_HEADER, state); + } + + public void setAdvancedPlanetaryConditionsHideLabels(Boolean state) { + store.setValue(ADVANCED_PLANETARY_CONDITIONS_SHOW_LABELS, state); + } + + public void setAdvancedPlanetaryConditionsHideValues(Boolean state) { + store.setValue(ADVANCED_PLANETARY_CONDITIONS_SHOW_VALUES, state); + } + + public void setAdvancedPlanetaryConditionsHideIndicators(Boolean state) { + store.setValue(ADVANCED_PLANETARY_CONDITIONS_SHOW_INDICATORS, state); + } + public void setAdvancedUnitToolTipSeenByResolution(int i) { store.setValue(ADVANCED_UNITTOOLTIP_SEENBYRESOLUTION, i); } @@ -1756,6 +1859,10 @@ public void toggleKeybindsOverlay() { store.setValue(SHOW_KEYBINDS_OVERLAY, !getBoolean(SHOW_KEYBINDS_OVERLAY)); } + public void togglePlanetaryConditionsOverlay() { + store.setValue(SHOW_PLANETARYCONDITIONS_OVERLAY, !getBoolean(SHOW_PLANETARYCONDITIONS_OVERLAY)); + } + public LabelDisplayStyle getUnitLabelStyle() { try { return LabelDisplayStyle.valueOf(store.getString(UNIT_LABEL_STYLE)); diff --git a/megamek/src/megamek/client/ui/swing/GameOptionsDialog.java b/megamek/src/megamek/client/ui/swing/GameOptionsDialog.java index 5a4dea6c2cb..a8613ae613c 100644 --- a/megamek/src/megamek/client/ui/swing/GameOptionsDialog.java +++ b/megamek/src/megamek/client/ui/swing/GameOptionsDialog.java @@ -32,6 +32,9 @@ import javax.xml.parsers.DocumentBuilder; import megamek.client.ui.baseComponents.AbstractButtonDialog; +import megamek.client.ui.swing.util.UIUtil; +import megamek.common.preference.IPreferenceChangeListener; +import megamek.common.preference.PreferenceChangeEvent; import org.w3c.dom.Document; import org.w3c.dom.NodeList; @@ -45,7 +48,7 @@ import static megamek.client.ui.Messages.*; /** Responsible for displaying the current game options and allowing the user to change them. */ -public class GameOptionsDialog extends AbstractButtonDialog implements ActionListener, DialogOptionListener { +public class GameOptionsDialog extends AbstractButtonDialog implements ActionListener, DialogOptionListener, IPreferenceChangeListener { private ClientGUI clientGui; private JFrame frame; @@ -137,6 +140,10 @@ protected Container createCenterPane() { mainPanel.add(panPassword); mainPanel.add(Box.createVerticalStrut(5)); mainPanel.add(panButtons); + + adaptToGUIScale(); + GUIPreferences.getInstance().addPreferenceChangeListener(this); + return mainPanel; } @@ -158,6 +165,9 @@ protected JPanel createButtonPanel() { panButtons.add(butDefaults); panButtons.add(butSave); panButtons.add(butLoad); + + adaptToGUIScale(); + return panButtons; } @@ -525,6 +535,8 @@ private void addOption(JPanel groupPanel, IOption option) { } List comps = optionComps.computeIfAbsent(option.getName(), k -> new ArrayList<>()); comps.add(optionComp); + + UIUtil.adjustContainer(optionComp, UIUtil.FONT_SCALE1); } // Gets called when one of the option checkboxes is clicked. @@ -902,5 +914,15 @@ public boolean isEditable() { return editable; } + private void adaptToGUIScale() { + UIUtil.adjustDialog(this, UIUtil.FONT_SCALE1); + } + @Override + public void preferenceChange(PreferenceChangeEvent e) { + // Update the text size when the GUI scaling changes + if (e.getName().equals(GUIPreferences.GUI_SCALE)) { + adaptToGUIScale(); + } + } } diff --git a/megamek/src/megamek/client/ui/swing/HelpDialog.java b/megamek/src/megamek/client/ui/swing/HelpDialog.java index 926f17d005d..2f1689f2577 100644 --- a/megamek/src/megamek/client/ui/swing/HelpDialog.java +++ b/megamek/src/megamek/client/ui/swing/HelpDialog.java @@ -13,6 +13,7 @@ */ package megamek.client.ui.swing; +import megamek.client.ui.swing.util.UIUtil; import org.apache.logging.log4j.LogManager; import javax.swing.*; @@ -32,14 +33,13 @@ public class HelpDialog extends JDialog { private static final int HEIGHT = 400; private URL helpUrl; - private JEditorPane mainView; public HelpDialog(String title, URL helpURL) { setTitle(title); getContentPane().setLayout(new BorderLayout()); this.helpUrl = helpURL; - mainView = new JEditorPane(); + JEditorPane mainView = new JEditorPane(); mainView.setEditable(false); try { mainView.setPage(helpUrl); @@ -60,11 +60,16 @@ public HelpDialog(String title, URL helpURL) { } }); - getContentPane().add(new JScrollPane(mainView)); + add(new JScrollPane(mainView)); setModalExclusionType(ModalExclusionType.TOOLKIT_EXCLUDE); + adaptToGUIScale(); setDefaultCloseOperation(DISPOSE_ON_CLOSE); setSize(WIDTH, HEIGHT); setLocationRelativeTo(null); } + + private void adaptToGUIScale() { + UIUtil.adjustDialog(this, UIUtil.FONT_SCALE1); + } } diff --git a/megamek/src/megamek/client/ui/swing/MMToggleButton.java b/megamek/src/megamek/client/ui/swing/MMToggleButton.java index ed7afc85274..5bb7437bd1f 100644 --- a/megamek/src/megamek/client/ui/swing/MMToggleButton.java +++ b/megamek/src/megamek/client/ui/swing/MMToggleButton.java @@ -18,8 +18,10 @@ */ package megamek.client.ui.swing; -import java.awt.Font; -import javax.swing.JToggleButton; +import megamek.MMConstants; + +import javax.swing.*; +import java.awt.*; /** * A JToggleButton that shows a check mark and cross mark to make its @@ -41,7 +43,7 @@ public MMToggleButton(String text) { super(); setText(text); // The standard UI font doesn't show unicode characters (on Win10) - setFont(new Font("Dialog", Font.PLAIN, getFont().getSize())); + setFont(new Font(MMConstants.FONT_DIALOG, Font.PLAIN, getFont().getSize())); addActionListener(event -> setText(getText())); } diff --git a/megamek/src/megamek/client/ui/swing/MapDimensionsDialog.java b/megamek/src/megamek/client/ui/swing/MapDimensionsDialog.java index d1f6170c91c..173f8349024 100644 --- a/megamek/src/megamek/client/ui/swing/MapDimensionsDialog.java +++ b/megamek/src/megamek/client/ui/swing/MapDimensionsDialog.java @@ -297,9 +297,13 @@ public void actionPerformed(ActionEvent e) { @Override public void setVisible(boolean b) { if (b) { - UIUtil.adjustDialog(getContentPane()); + adaptToGUIScale();; pack(); } super.setVisible(b); } + + private void adaptToGUIScale() { + UIUtil.adjustDialog(this, UIUtil.FONT_SCALE1); + } } \ No newline at end of file diff --git a/megamek/src/megamek/client/ui/swing/MapMenu.java b/megamek/src/megamek/client/ui/swing/MapMenu.java index 104c4ad2b9e..0a0f7f2f04d 100644 --- a/megamek/src/megamek/client/ui/swing/MapMenu.java +++ b/megamek/src/megamek/client/ui/swing/MapMenu.java @@ -29,7 +29,6 @@ import megamek.common.actions.GrappleAttackAction; import megamek.common.actions.WeaponAttackAction; import megamek.common.annotations.Nullable; -import megamek.common.enums.GamePhase; import megamek.common.options.OptionsConstants; import megamek.common.weapons.other.CLFireExtinguisher; import megamek.common.weapons.other.ISFireExtinguisher; @@ -209,7 +208,7 @@ private boolean createMenu() { } }); - if (game.getPhase() == GamePhase.MOVEMENT) { + if (game.getPhase().isMovement()) { add(item); } } diff --git a/megamek/src/megamek/client/ui/swing/MechViewPanel.java b/megamek/src/megamek/client/ui/swing/MechViewPanel.java index 1ddd2e3c9b6..46cc3057b71 100644 --- a/megamek/src/megamek/client/ui/swing/MechViewPanel.java +++ b/megamek/src/megamek/client/ui/swing/MechViewPanel.java @@ -56,6 +56,7 @@ public MechViewPanel(int width, int height, boolean noBorder) { ReportDisplay.setupStylesheet(txtMek); txtMek.setEditable(false); txtMek.setBorder(new EmptyBorder(5, 10, 0, 0)); + txtMek.setMinimumSize(new Dimension(width, height)); txtMek.setPreferredSize(new Dimension(width, height)); txtMek.addHyperlinkListener(e -> { try { @@ -74,19 +75,25 @@ public MechViewPanel(int width, int height, boolean noBorder) { scrMek.setBorder(null); } scrMek.setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT); - scrMek.setPreferredSize(new Dimension(width, height)); - scrMek.setMinimumSize(new Dimension(width, height)); - var textPanel = new FixedXPanel(new GridLayout(1, 1)); + var textPanel = new JPanel(new GridLayout(1, 1)); + textPanel.setMinimumSize(new Dimension(width, height)); + textPanel.setPreferredSize(new Dimension(width, height)); textPanel.add(scrMek); var fluffPanel = new FixedXPanel(); + fluffPanel.setMinimumSize(new Dimension(width, height)); + fluffPanel.setPreferredSize(new Dimension(width, height)); fluffPanel.add(lblMek); - setLayout(new BoxLayout(this, BoxLayout.LINE_AXIS)); - add(textPanel); - add(fluffPanel); - add(Box.createHorizontalGlue()); + JPanel p = new JPanel(); + p.setLayout(new BoxLayout(p, BoxLayout.LINE_AXIS)); + p.add(textPanel); + p.add(fluffPanel); + p.add(Box.createHorizontalGlue()); + JScrollPane sp = new JScrollPane(p); + setLayout(new BorderLayout()); + add(sp); addMouseWheelListener(wheelForwarder); } diff --git a/megamek/src/megamek/client/ui/swing/MegaMekGUI.java b/megamek/src/megamek/client/ui/swing/MegaMekGUI.java index e655767c093..8f6e1e2759b 100644 --- a/megamek/src/megamek/client/ui/swing/MegaMekGUI.java +++ b/megamek/src/megamek/client/ui/swing/MegaMekGUI.java @@ -16,9 +16,9 @@ */ package megamek.client.ui.swing; -import com.thoughtworks.xstream.XStream; -import megamek.MegaMek; import megamek.MMConstants; +import megamek.MegaMek; +import megamek.Version; import megamek.client.Client; import megamek.client.bot.BotClient; import megamek.client.bot.TestBot; @@ -38,6 +38,7 @@ import megamek.client.ui.swing.widget.SkinSpecification; import megamek.client.ui.swing.widget.SkinSpecification.UIComponents; import megamek.client.ui.swing.widget.SkinXMLHandler; +import megamek.codeUtilities.StringUtility; import megamek.common.*; import megamek.common.annotations.Nullable; import megamek.common.enums.GamePhase; @@ -48,21 +49,26 @@ import megamek.common.preference.PreferenceManager; import megamek.common.util.EmailService; import megamek.common.util.ImageUtil; -import megamek.common.util.SerializationHelper; import megamek.common.util.fileUtils.MegaMekFile; import megamek.server.GameManager; import megamek.server.ScenarioLoader; import megamek.server.Server; +import megamek.utilities.xml.MMXMLUtility; import org.apache.logging.log4j.LogManager; +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; import javax.swing.*; import javax.swing.filechooser.FileFilter; +import javax.xml.parsers.DocumentBuilder; import java.awt.*; import java.awt.event.ActionListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; -import java.awt.image.BufferedImage; import java.awt.image.BaseMultiResolutionImage; +import java.awt.image.BufferedImage; import java.io.*; import java.net.MalformedURLException; import java.net.URL; @@ -79,8 +85,6 @@ public class MegaMekGUI implements IPreferenceChangeListener { private static final String FILENAME_ICON_48X48 = "megamek-icon-48x48.png"; private static final String FILENAME_ICON_256X256 = "megamek-icon-256x256.png"; - private static final int DEFAULT_DISPLAY_DPI = 96; - private JFrame frame; private Client client; private Server server; @@ -400,28 +404,30 @@ void host() { hd.getPlayerName()); } - public void startHost(String serverPassword, int port, boolean isRegister, String metaServer, - String mailPropertiesFileName, File savegame, String playerName) { - startServer(serverPassword, port, isRegister, metaServer, mailPropertiesFileName, savegame); + public void startHost(@Nullable String serverPassword, int port, boolean isRegister, + @Nullable String metaServer, @Nullable String mailPropertiesFileName, + @Nullable File savegame, String playerName) { + if (!startServer(serverPassword, port, isRegister, metaServer, mailPropertiesFileName, savegame)) { + return; + } + startClient(playerName, MMConstants.LOCALHOST, server.getPort()); } - - - public void startServer(String serverPassword, int port, boolean isRegister, String metaServer, - String mailPropertiesFileName, File saveGameFile) { - + public boolean startServer(@Nullable String serverPassword, int port, boolean isRegister, + @Nullable String metaServer, @Nullable String mailPropertiesFileName, + @Nullable File saveGameFile) { try { serverPassword = Server.validatePassword(serverPassword); port = Server.validatePort(port); } catch (Exception ex) { LogManager.getLogger().error("Failed to start Server", ex); frame.setVisible(true); - return; + return false; } EmailService mailer = null; - if ( (mailPropertiesFileName != null) && (!mailPropertiesFileName.isBlank())) { + if (!StringUtility.isNullOrBlank(mailPropertiesFileName)) { File propsFile = new File(mailPropertiesFileName); try (var propsReader = new FileReader(propsFile)) { var mailProperties = new Properties(); @@ -435,31 +441,33 @@ public void startServer(String serverPassword, int port, boolean isRegister, Str Messages.getFormattedString("MegaMek.StartServerError", port, ex.getMessage()), Messages.getString("MegaMek.LoadGameAlert.title"), JOptionPane.ERROR_MESSAGE); frame.setVisible(true); - return; + return false; } } // kick off a RNG check d6(); + // start server try { gameManager = new GameManager(); server = new Server(serverPassword, port, gameManager, isRegister, metaServer, mailer, false); - MegaMek.printToOut(Messages.getFormattedString("MegaMek.ServerStarted", server.getHost(), server.getPort(), server.isPassworded() ? "enabled" : "disabled") + "\n"); + MegaMek.printToOut(Messages.getFormattedString("MegaMek.ServerStarted", + server.getHost(), server.getPort(), server.isPassworded() ? "enabled" : "disabled") + "\n"); } catch (IOException ex) { LogManager.getLogger().error("Could not create server socket on port " + port, ex); JOptionPane.showMessageDialog(frame, Messages.getFormattedString("MegaMek.StartServerError", port, ex.getMessage()), Messages.getString("MegaMek.LoadGameAlert.title"), JOptionPane.ERROR_MESSAGE); frame.setVisible(true); - return; + return false; } catch (Exception ex) { LogManager.getLogger().error("Could not create server", ex); JOptionPane.showMessageDialog(frame, Messages.getFormattedString("MegaMek.StartServerError", port, ex.getMessage()), Messages.getString("MegaMek.LoadGameAlert.title"), JOptionPane.ERROR_MESSAGE); frame.setVisible(true); - return; + return false; } if (saveGameFile != null) { @@ -470,9 +478,11 @@ public void startServer(String serverPassword, int port, boolean isRegister, Str server.die(); server = null; frame.setVisible(true); - return; + return false; } } + + return true; } public void startClient(String playerName, String serverAddress, int port) { @@ -525,7 +535,8 @@ void loadGame() { fc.setFileFilter(new FileFilter() { @Override public boolean accept(File dir) { - return ((dir.getName().endsWith(MMConstants.SAVE_FILE_EXT) || dir.getName().endsWith(MMConstants.SAVE_FILE_GZ_EXT) || dir.isDirectory())); + return dir.getName().endsWith(MMConstants.SAVE_FILE_EXT) + || dir.getName().endsWith(MMConstants.SAVE_FILE_GZ_EXT) || dir.isDirectory(); } @Override @@ -539,32 +550,50 @@ public String getDescription() { return; } - // extract game data before starting to check and get player names - Game newGame; - try (InputStream is = new FileInputStream(fc.getSelectedFile()); InputStream gzi = new GZIPInputStream(is)) { - XStream xstream = SerializationHelper.getXStream(); - newGame = (Game) xstream.fromXML(gzi); - } catch (Exception e) { - LogManager.getLogger().error("Unable to load file: " + fc.getSelectedFile().getAbsolutePath(), e); - JOptionPane.showMessageDialog(frame, Messages.getFormattedString("MegaMek.LoadGameAlert.message", fc.getSelectedFile().getAbsolutePath()), - Messages.getString("MegaMek.LoadGameAlert.title"), JOptionPane.ERROR_MESSAGE); - return; - } + final Vector playerNames = new Vector<>(); + + // Handrolled extraction, as we require Server initialization to use XStream and don't need + // the additional overhead of initializing everything twice + try (InputStream is = new FileInputStream(fc.getSelectedFile()); + InputStream gzi = new GZIPInputStream(is)) { + // Using factory get an instance of document builder + final DocumentBuilder documentBuilder = MMXMLUtility.newSafeDocumentBuilder(); + // Parse using builder to get DOM representation of the XML file + final Document xmlDocument = documentBuilder.parse(gzi); + + final Element gameElement = xmlDocument.getDocumentElement(); + gameElement.normalize(); + + final NodeList nl = gameElement.getChildNodes(); + for (int i = 0; i < nl.getLength(); i++) { + final Node n = nl.item(i); + if (n.getNodeType() != Node.ELEMENT_NODE) { + continue; + } - if (!MMConstants.VERSION.is(newGame.getVersion())) { - final String message = String.format(Messages.getString("MegaMek.LoadGameIncorrectVersion.message"), - newGame.getVersion(), MMConstants.VERSION); - JOptionPane.showMessageDialog(frame, message, - Messages.getString("MegaMek.LoadGameAlert.title"), JOptionPane.ERROR_MESSAGE); - LogManager.getLogger().error(message); + switch (n.getNodeName()) { + case "version": + if (!validateSaveVersion(n)) { + return; + } + break; + case "players": + parsePlayerNames(n, playerNames); + break; + default: + break; + } + } + } catch (Exception ex) { + LogManager.getLogger().error("Unable to load file: " + fc.getSelectedFile().getAbsolutePath(), ex); + JOptionPane.showMessageDialog(frame, + Messages.getFormattedString("MegaMek.LoadGameAlert.message", + fc.getSelectedFile().getAbsolutePath()), + Messages.getString("MegaMek.LoadGameAlert.title"), + JOptionPane.ERROR_MESSAGE); return; } - Vector playerNames = new Vector<>(); - for (Player player : newGame.getPlayersVector()) { - playerNames.add(player.getName()); - } - HostDialog hd = new HostDialog(frame, playerNames); hd.setVisible(true); @@ -576,6 +605,88 @@ public String getDescription() { hd.isRegister(), hd.isRegister() ? hd.getMetaserver() : "", null, fc.getSelectedFile(), hd.getPlayerName()); } + + private boolean validateSaveVersion(final Node n) { + if (!n.hasChildNodes()) { + final String message = String.format( + Messages.getString("MegaMek.LoadGameMissingVersion.message"), + MMConstants.VERSION); + JOptionPane.showMessageDialog(frame, message, + Messages.getString("MegaMek.LoadGameAlert.title"), + JOptionPane.ERROR_MESSAGE); + LogManager.getLogger().error(message); + return false; + } + + final NodeList nl = n.getChildNodes(); + String release = null; + String major = null; + String minor = null; + String snapshot = null; + for (int i = 0; i < nl.getLength(); i++) { + final Node n2 = nl.item(i); + if (n2.getNodeType() != Node.ELEMENT_NODE) { + continue; + } + + switch (n2.getNodeName()) { + case "release": + release = n2.getTextContent(); + break; + case "major": + major = n2.getTextContent(); + break; + case "minor": + minor = n2.getTextContent(); + break; + case "snapshot": + snapshot = n2.getTextContent(); + break; + default: + break; + } + } + + final Version version = new Version(release, major, minor, snapshot); + if (MMConstants.VERSION.is(version)) { + return true; + } else { + final String message = String.format( + Messages.getString("MegaMek.LoadGameIncorrectVersion.message"), + version, MMConstants.VERSION); + JOptionPane.showMessageDialog(frame, message, + Messages.getString("MegaMek.LoadGameAlert.title"), JOptionPane.ERROR_MESSAGE); + LogManager.getLogger().error(message); + return false; + } + } + + private void parsePlayerNames(final Node n, final Vector playerNames) { + if (!n.hasChildNodes()) { + return; + } + + final NodeList nl = n.getChildNodes(); + for (int i = 0; i < nl.getLength(); i++) { + final Node n2 = nl.item(i); + if ((n2.getNodeType() != Node.ELEMENT_NODE) || !n2.hasChildNodes() + || !Player.class.getName().equals(n2.getNodeName())) { + continue; + } + + final NodeList nl2 = n2.getChildNodes(); + for (int j = 0; j < nl2.getLength(); j++) { + final Node n3 = nl2.item(j); + if (n3.getNodeType() != Node.ELEMENT_NODE) { + continue; + } + + if ("name".equals(n3.getNodeName())) { + playerNames.add(n3.getTextContent()); + } + } + } + } /** Developer Utility: Loads "quicksave.sav.gz" with the last used connection settings. */ public void quickLoadGame() { @@ -589,8 +700,8 @@ public void quickLoadGame() { return; } - startHost("", 0, false, "", null, - file, PreferenceManager.getClientPreferences().getLastPlayerName()); + startHost("", 0, false, "", null, file, + PreferenceManager.getClientPreferences().getLastPlayerName()); } /** @@ -722,7 +833,9 @@ public String getDescription() { Compute.d6(); // start server - startServer(serverPW, port, false, null, null, null); + if (!startServer(serverPW, port, false, null, null, null)) { + return; + } server.setGame(g); // apply any scenario damage diff --git a/megamek/src/megamek/client/ui/swing/MiniReportDisplay.java b/megamek/src/megamek/client/ui/swing/MiniReportDisplay.java index f8bb6d791a9..eeed62cf150 100644 --- a/megamek/src/megamek/client/ui/swing/MiniReportDisplay.java +++ b/megamek/src/megamek/client/ui/swing/MiniReportDisplay.java @@ -16,47 +16,97 @@ import megamek.client.Client; import megamek.client.ui.Messages; import megamek.client.ui.swing.util.BASE64ToolKit; +import megamek.client.ui.swing.util.UIUtil; +import megamek.common.preference.ClientPreferences; +import megamek.common.preference.IPreferenceChangeListener; +import megamek.common.preference.PreferenceChangeEvent; +import megamek.common.Player; +import megamek.common.Entity; +import megamek.common.Report; import megamek.common.event.GameListener; import megamek.common.event.GameListenerAdapter; import megamek.common.event.GamePhaseChangeEvent; +import megamek.common.preference.PreferenceManager; import javax.swing.*; -import javax.swing.text.html.HTMLEditorKit; +import javax.swing.event.HyperlinkEvent; +import javax.swing.event.HyperlinkListener; +import javax.swing.text.Document; import java.awt.*; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.awt.event.WindowAdapter; -import java.awt.event.WindowEvent; +import java.awt.event.*; +import java.util.Iterator; /** * Shows reports, with an Okay JButton */ -public class MiniReportDisplay extends JDialog implements ActionListener { +public class MiniReportDisplay extends JDialog implements ActionListener, HyperlinkListener, IPreferenceChangeListener { private JButton butOkay; + private JTabbedPane tabs; + private JButton butPlayerSearchUp; + private JButton butPlayerSearchDown; + private JButton butEntitySearchUp; + private JButton butEntitySearchDown; + private JButton butQuickSearchUp; + private JButton butQuickSearchDown; + private JComboBox comboPlayer = new JComboBox<>(); + private JComboBox comboEntity = new JComboBox<>(); + private JComboBox comboQuick = new JComboBox<>(); + private ClientGUI currentClientgui; private Client currentClient; - private JTabbedPane tabs; - private static final String MRD_TITLE = Messages.getString("MiniReportDisplay.title"); - private static final String MRD_ROUND = Messages.getString("MiniReportDisplay.Round"); - private static final String MRD_PHASE = Messages.getString("MiniReportDisplay.Phase"); - private static final String MRD_OKAY= Messages.getString("Okay"); + private static final String MSG_TITLE = Messages.getString("MiniReportDisplay.title"); + private static final String MSG_ROUND = Messages.getString("MiniReportDisplay.Round"); + private static final String MSG_PHASE = Messages.getString("MiniReportDisplay.Phase"); + private static final String MSG_DAMAGE = Messages.getString("MiniReportDisplay.Damage"); + private static final String MSG_ARROWUP = Messages.getString("MiniReportDisplay.ArrowUp"); + private static final String MSG_ARROWDOWN = Messages.getString("MiniReportDisplay.ArrowDown"); + private static final String MSG_DETAILS = Messages.getString("MiniReportDisplay.Details"); + private static final String MSG_OKAY= Messages.getString("Okay"); - public MiniReportDisplay(JFrame parent, Client client) { - super(parent, MRD_TITLE, false); + private static final int MRD_MAXNAMELENGHT = 60; - if (client == null) { + public MiniReportDisplay(JFrame parent, ClientGUI clientgui) { + super(parent, MSG_TITLE, false); + + if (clientgui == null) { return; } - currentClient = client; + currentClientgui = clientgui; + currentClient = clientgui.getClient(); currentClient.getGame().addGameListener(gameListener); - butOkay = new JButton(MRD_OKAY); + butOkay = new JButton(MSG_OKAY); butOkay.addActionListener(this); - - getContentPane().setLayout(new BorderLayout()); + butPlayerSearchUp = new JButton(MSG_ARROWUP); + butPlayerSearchUp.addActionListener(this); + butPlayerSearchDown = new JButton(MSG_ARROWDOWN); + butPlayerSearchDown.addActionListener(this); + butEntitySearchUp = new JButton(MSG_ARROWUP); + butEntitySearchUp.addActionListener(this); + butEntitySearchDown = new JButton(MSG_ARROWDOWN); + butEntitySearchDown.addActionListener(this); + butQuickSearchUp = new JButton(MSG_ARROWUP); + butQuickSearchUp.addActionListener(this); + butQuickSearchDown = new JButton(MSG_ARROWDOWN); + butQuickSearchDown.addActionListener(this); + + setLayout(new BorderLayout()); - getContentPane().add(BorderLayout.SOUTH, butOkay); + JPanel p = new JPanel(); + p.add(BorderLayout.EAST, comboPlayer); + p.add(BorderLayout.EAST, butPlayerSearchUp); + p.add(BorderLayout.EAST, butPlayerSearchDown); + p.add(BorderLayout.EAST, comboEntity); + p.add(BorderLayout.EAST, butEntitySearchUp); + p.add(BorderLayout.EAST, butEntitySearchDown); + p.add(BorderLayout.EAST, comboQuick); + p.add(BorderLayout.EAST, butQuickSearchUp); + p.add(BorderLayout.EAST, butQuickSearchDown); + + p.add(BorderLayout.WEST, butOkay); + JScrollPane sp = new JScrollPane(p); + add(BorderLayout.SOUTH, sp); setupReportTabs(); @@ -75,38 +125,198 @@ public void windowClosing(WindowEvent e) { } }); + adaptToGUIScale(); + GUIPreferences.getInstance().addPreferenceChangeListener(this); + PreferenceManager.getClientPreferences().addPreferenceChangeListener(this); butOkay.requestFocus(); } + private void searchTextPane(String searchPattern, Boolean searchDown) { + Component selCom = tabs.getSelectedComponent(); + searchPattern = searchPattern.toUpperCase(); + + if (selCom instanceof JScrollPane + && ((JScrollPane) selCom).getViewport().getView() instanceof JComponent) { + JViewport v = ((JScrollPane) selCom).getViewport(); + for (Component comp : v.getComponents()) { + if (comp instanceof JTextPane) { + try { + JTextPane textPane = (JTextPane) comp; + Document doc = textPane.getDocument(); + String text = doc.getText(0, doc.getLength()).toUpperCase(); + int currentPos = textPane.getCaretPosition(); + + if (currentPos > text.length() - searchPattern.length()) { + textPane.setCaretPosition(0); + currentPos = 0; + } + + int newPos = -1; + + if (searchDown){ + newPos = text.indexOf(searchPattern, currentPos); + + if (newPos == -1) { + newPos = text.indexOf(searchPattern, 0); + } + + } + else { + newPos = text.lastIndexOf(searchPattern, currentPos-searchPattern.length()-1); + + if (newPos == -1) { + newPos = text.lastIndexOf(searchPattern, text.length()-searchPattern.length()-1); + } + } + + if (newPos != -1) { + Rectangle r = (Rectangle) textPane.modelToView2D(newPos); + int y = UIUtil.calculateCenter(v.getExtentSize().height, v.getViewSize().height, r.height, r.y); + v.setViewPosition(new Point(0,y)); + textPane.setCaretPosition(newPos); + textPane.moveCaretPosition(newPos + searchPattern.length()); + textPane.getCaret().setSelectionVisible(true); + } + } catch (Exception e) { + } + + break; + } + } + } + } + + private void updatePlayerChoice() { + String name = String.format("%-12s", currentClient.getName()); + String lastChoice = (String) comboPlayer.getSelectedItem(); + lastChoice = (lastChoice != null ? lastChoice : name); + comboPlayer.removeAllItems(); + comboPlayer.setEnabled(true); + for (Player player : currentClient.getGame().getPlayersVectorSorted()) { + String playerDisplay = String.format("%-12s", player.getName()); + comboPlayer.addItem(playerDisplay); + } + if (comboPlayer.getItemCount() == 1) { + comboPlayer.setEnabled(false); + } + comboPlayer.setSelectedItem(lastChoice); + if (comboPlayer.getSelectedIndex() < 0) { + comboPlayer.setSelectedIndex(0); + } + } + + private String addEntity(JComboBox comboBox, String name) { + boolean found = false; + int len = (name.length() < MRD_MAXNAMELENGHT ? name.length() : MRD_MAXNAMELENGHT); + String displayNane = String.format("%-12s", name).substring(0, len); + found = false; + for (int i = 0; i < comboBox.getItemCount(); i++) { + if (comboBox.getItemAt(i).equals(displayNane)) { + found = true; + break; + } + } + if (!found) { + comboBox.addItem(displayNane); + } + return displayNane; + } + + private void updateEntityChoice() { + String lastChoice = (String) comboEntity.getSelectedItem(); + comboEntity.removeAllItems(); + comboEntity.setEnabled(true); + String displayNane = ""; + for (Iterator ents = currentClient.getGame().getEntities(); ents.hasNext();) { + Entity entity = ents.next(); + if (entity.getOwner().equals(currentClient.getLocalPlayer())) { + displayNane = addEntity(comboEntity, entity.getShortName()); + } + } + lastChoice = (lastChoice != null ? lastChoice : displayNane); + comboEntity.setSelectedItem(lastChoice); + if (comboEntity.getItemCount() <= 1) { + comboEntity.setEnabled(false); + } else if (comboEntity.getSelectedIndex() < 0) { + comboEntity.setSelectedIndex(0); + } + } + + private void updateQuickChoice() { + String lastChoice = (String) comboQuick.getSelectedItem(); + lastChoice = (lastChoice != null ? lastChoice : MSG_DAMAGE); + comboQuick.removeAllItems(); + comboQuick.setEnabled(true); + String[] keywords = PreferenceManager.getClientPreferences().getReportKeywords().split("\n"); + for (String keyword : keywords) { + comboQuick.addItem(keyword); + } + comboQuick.setSelectedItem(lastChoice); + if (comboQuick.getItemCount() <= 1) { + comboQuick.setEnabled(false); + } else if (comboQuick.getSelectedIndex() < 0) { + comboQuick.setSelectedIndex(0); + } + } + + @Override + public void setVisible(boolean visible) { + if (visible) { + updatePlayerChoice(); + updateEntityChoice(); + updateQuickChoice(); + } + super.setVisible(visible); + } + @Override public void actionPerformed(ActionEvent ae) { if (ae.getSource().equals(butOkay)) { - savePrefHide(); + savePref(); + setVisible(false); + } else if (ae.getSource().equals(butPlayerSearchDown)) { + String searchPattern = comboPlayer.getSelectedItem().toString().trim(); + searchTextPane(searchPattern, true); + } else if (ae.getSource().equals(butPlayerSearchUp)) { + String searchPattern = comboPlayer.getSelectedItem().toString().trim(); + searchTextPane(searchPattern, false); + } else if (ae.getSource().equals(butEntitySearchDown)) { + String searchPattern = comboEntity.getSelectedItem().toString().trim(); + searchTextPane(searchPattern, true); + } else if (ae.getSource().equals(butEntitySearchUp)) { + String searchPattern = comboEntity.getSelectedItem().toString().trim(); + searchTextPane(searchPattern,false); + } else if (ae.getSource().equals(butQuickSearchDown)) { + String searchPattern = comboQuick.getSelectedItem().toString().trim(); + searchTextPane(searchPattern, true); + } else if (ae.getSource().equals(butQuickSearchUp)) { + String searchPattern = comboQuick.getSelectedItem().toString().trim(); + searchTextPane(searchPattern,false); } } + @Override + protected void processWindowEvent(WindowEvent e) { + super.processWindowEvent(e); + if ((e.getID() == WindowEvent.WINDOW_DEACTIVATED) || (e.getID() == WindowEvent.WINDOW_CLOSING)) { + savePref(); + } + } + + private void setupReportTabs() { tabs = new JTabbedPane(); addReportPages(); - getContentPane().add(BorderLayout.CENTER, tabs); + add(BorderLayout.CENTER, tabs); } - public static void setupStylesheet(JTextPane pane) { - pane.setContentType("text/html"); - Font font = UIManager.getFont("Label.font"); - ((HTMLEditorKit) pane.getEditorKit()).getStyleSheet().addRule( - "pre { font-family: " + font.getFamily() - + "; font-size: 12pt; font-style:normal;}"); - } - - private void savePrefHide() { + private void savePref() { GUIPreferences.getInstance().setMiniReportSizeWidth(getSize().width); GUIPreferences.getInstance().setMiniReportSizeHeight(getSize().height); GUIPreferences.getInstance().setMiniReportPosX(getLocation().x); GUIPreferences.getInstance().setMiniReportPosY(getLocation().y); - setVisible(false); } public void addReportPages() { @@ -116,42 +326,113 @@ public void addReportPages() { for (int round = 1; round <= numRounds; round++) { String text = currentClient.receiveReport(currentClient.getGame().getReports(round)); JTextPane ta = new JTextPane(); - setupStylesheet(ta); + ReportDisplay.setupStylesheet(ta); + ta.addHyperlinkListener(this); BASE64ToolKit toolKit = new BASE64ToolKit(); ta.setEditorKit(toolKit); ta.setText("
" + text + "
"); ta.setEditable(false); ta.setOpaque(false); - tabs.add(MRD_ROUND + " " + round, new JScrollPane(ta)); + ta.setCaretPosition(0); + JScrollPane sp = new JScrollPane(ta); + tabs.add(MSG_ROUND + " " + round, sp); } // add the new current phase tab JTextPane ta = new JTextPane(); - setupStylesheet(ta); + ReportDisplay.setupStylesheet(ta); + ta.addHyperlinkListener(this); + BASE64ToolKit toolKit = new BASE64ToolKit(); ta.setEditorKit(toolKit); ta.setText("
" + currentClient.phaseReport + "
"); ta.setEditable(false); ta.setOpaque(false); + ta.setCaretPosition(0); JScrollPane sp = new JScrollPane(ta); - tabs.add(MRD_PHASE, sp); + tabs.add(MSG_PHASE, sp); tabs.setSelectedIndex(tabs.getTabCount() - 1); } + private JComponent activePane() { + return (JComponent) ((JScrollPane) tabs.getSelectedComponent()).getViewport().getView(); + } + + @Override + public void hyperlinkUpdate(HyperlinkEvent evt) { + String evtDesc = evt.getDescription(); + if (evt.getEventType() == HyperlinkEvent.EventType.ACTIVATED) { + if (evtDesc.startsWith(Report.ENTITY_LINK)) { + String idString = evtDesc.substring(Report.ENTITY_LINK.length()); + int id; + try { + id = Integer.parseInt(idString); + } catch (Exception ex) { + id = -1; + } + Entity ent = currentClientgui.getClient().getGame().getEntity(id); + if (ent != null) { + currentClientgui.getUnitDisplay().displayEntity(ent); + currentClientgui.setUnitDisplayVisible(true); + } + } else if (evtDesc.startsWith(Report.TOOLTIP_LINK)) { + String desc = evtDesc.substring(Report.TOOLTIP_LINK.length()); + JOptionPane.showMessageDialog(currentClientgui, desc, MSG_DETAILS, + JOptionPane.PLAIN_MESSAGE); + } + } else if (evt.getEventType() == HyperlinkEvent.EventType.ENTERED) { + if (evtDesc.startsWith(Report.TOOLTIP_LINK)) { + String desc = evtDesc.substring(Report.TOOLTIP_LINK.length()); + activePane().setToolTipText(desc); + } + } else if (evt.getEventType() == HyperlinkEvent.EventType.EXITED) { + activePane().setToolTipText(null); + } + } + private GameListener gameListener = new GameListenerAdapter() { @Override public void gamePhaseChange(GamePhaseChangeEvent e) { switch (e.getOldPhase()) { case VICTORY: - savePrefHide(); + savePref(); + setVisible(false); break; default: if (!e.getNewPhase().equals((e.getOldPhase()))) { addReportPages(); + updatePlayerChoice(); + updateEntityChoice(); } } } }; + + private void adaptToGUIScale() { + UIUtil.adjustDialog(this, UIUtil.FONT_SCALE1); + + for (int i = 0; i < tabs.getTabCount(); i++) { + Component cp = tabs.getComponentAt(i); + if (cp instanceof JScrollPane) { + Component pane = ((JScrollPane) cp).getViewport().getView(); + if (pane instanceof JTextPane) { + JTextPane tp = (JTextPane) pane; + ReportDisplay.setupStylesheet(tp); + tp.setText(tp.getText()); + } + } + } + } + + @Override + public void preferenceChange(PreferenceChangeEvent e) { + // Update the text size when the GUI scaling changes + if (e.getName().equals(GUIPreferences.GUI_SCALE)) { + adaptToGUIScale(); + } else if (e.getName().equals(ClientPreferences.REPORT_KEYWORDS)) { + updateQuickChoice(); + } + } } diff --git a/megamek/src/megamek/client/ui/swing/MovementDisplay.java b/megamek/src/megamek/client/ui/swing/MovementDisplay.java index 0a3af94c790..edf989aab76 100644 --- a/megamek/src/megamek/client/ui/swing/MovementDisplay.java +++ b/megamek/src/megamek/client/ui/swing/MovementDisplay.java @@ -25,7 +25,6 @@ import megamek.client.ui.swing.util.CommandAction; import megamek.client.ui.swing.util.KeyCommandBind; import megamek.client.ui.swing.util.MegaMekController; -import megamek.client.ui.swing.util.TurnTimer; import megamek.client.ui.swing.widget.MegamekButton; import megamek.client.ui.swing.widget.SkinSpecification.UIComponents; import megamek.common.*; @@ -36,7 +35,6 @@ import megamek.common.actions.DfaAttackAction; import megamek.common.actions.RamAttackAction; import megamek.common.annotations.Nullable; -import megamek.common.enums.GamePhase; import megamek.common.event.GamePhaseChangeEvent; import megamek.common.event.GameTurnChangeEvent; import megamek.common.options.AbstractOptions; @@ -79,7 +77,6 @@ public class MovementDisplay extends StatusBarPhaseDisplay { public static final int CMD_NON_VECTORED = CMD_MECH | CMD_TANK | CMD_VTOL | CMD_INF | CMD_AERO; public static final int CMD_ALL = CMD_MECH | CMD_TANK | CMD_VTOL | CMD_INF | CMD_AERO | CMD_AERO_VECTORED; public static final int CMD_NON_INF = CMD_MECH | CMD_TANK | CMD_VTOL | CMD_AERO | CMD_AERO_VECTORED; - private TurnTimer tt; /** * This enumeration lists all of the possible ActionCommands that can be carried out during the @@ -940,8 +937,8 @@ private void beginMyTurn() { clientgui.maybeShowUnitDisplay(); } selectEntity(clientgui.getClient().getFirstEntityNum()); - // check if there should be a turn timer running - tt = TurnTimer.init(this, clientgui.getClient()); + + startTimer(); } /** @@ -950,11 +947,7 @@ private void beginMyTurn() { private synchronized void endMyTurn() { final Entity ce = ce(); - // get rid of still running timer, if turn is concluded before time is up - if (tt != null) { - tt.stopTimer(); - tt = null; - } + stopTimer(); // end my turn, then. disableButtons(); @@ -4075,6 +4068,11 @@ private boolean addManeuver(int type) { } } + private void setStatusBarTextOthersTurn(@Nullable Player player) { + String playerName = (player != null) ? player.getName() : "Unknown"; + setStatusBarText(Messages.getString("MovementDisplay.its_others_turn", playerName)); + } + // // GameListener // @@ -4096,10 +4094,11 @@ public void gameTurnChange(GameTurnChangeEvent e) { // if all our entities are actually done, don't start up the turn. if (clientgui.getClient().getGame().getPlayerEntities(clientgui.getClient().getLocalPlayer(), false) .stream().allMatch(Entity::isDone)) { + setStatusBarTextOthersTurn(e.getPlayer()); return; } - if (clientgui.getClient().getGame().getPhase() != GamePhase.MOVEMENT) { + if (!clientgui.getClient().getGame().getPhase().isMovement()) { // ignore return; } @@ -4117,13 +4116,7 @@ public void gameTurnChange(GameTurnChangeEvent e) { && (clientgui.getClient().getGame().getTurn() instanceof UnloadStrandedTurn)) { setStatusBarText(Messages.getString("MovementDisplay.waitForAnother")); } else { - String playerName; - if (e.getPlayer() != null) { - playerName = e.getPlayer().getName(); - } else { - playerName = "Unknown"; - } - setStatusBarText(Messages.getString("MovementDisplay.its_others_turn", playerName)); + setStatusBarTextOthersTurn(e.getPlayer()); } } } diff --git a/megamek/src/megamek/client/ui/swing/OffBoardTargetOverlay.java b/megamek/src/megamek/client/ui/swing/OffBoardTargetOverlay.java index 981d16dd1ac..2f817f410f2 100644 --- a/megamek/src/megamek/client/ui/swing/OffBoardTargetOverlay.java +++ b/megamek/src/megamek/client/ui/swing/OffBoardTargetOverlay.java @@ -19,7 +19,6 @@ import megamek.common.*; import megamek.common.actions.ArtilleryAttackAction; import megamek.common.actions.WeaponAttackAction; -import megamek.common.enums.GamePhase; import megamek.common.util.ImageUtil; import megamek.common.util.fileUtils.MegaMekFile; @@ -75,8 +74,7 @@ public OffBoardTargetOverlay(ClientGUI clientgui) { */ private boolean shouldBeVisible() { // only relevant if it's our turn in the targeting phase - boolean visible = clientgui.getClient().isMyTurn() && - (getCurrentGame().getPhase() == GamePhase.TARGETING); + boolean visible = clientgui.getClient().isMyTurn() && getCurrentGame().getPhase().isTargeting(); if (!visible) { return false; diff --git a/megamek/src/megamek/client/ui/swing/PhysicalDisplay.java b/megamek/src/megamek/client/ui/swing/PhysicalDisplay.java index 55f7d8c644e..7c58c5312ce 100644 --- a/megamek/src/megamek/client/ui/swing/PhysicalDisplay.java +++ b/megamek/src/megamek/client/ui/swing/PhysicalDisplay.java @@ -22,7 +22,6 @@ import megamek.common.*; import megamek.common.actions.*; import megamek.common.enums.AimingMode; -import megamek.common.enums.GamePhase; import megamek.common.event.GamePhaseChangeEvent; import megamek.common.event.GameTurnChangeEvent; import megamek.common.options.OptionsConstants; @@ -1438,9 +1437,8 @@ public void gameTurnChange(GameTurnChangeEvent e) { @Override public void gamePhaseChange(GamePhaseChangeEvent e) { - // In case of a /reset command, ensure the state gets reset - if (clientgui.getClient().getGame().getPhase() == GamePhase.LOUNGE) { + if (clientgui.getClient().getGame().getPhase().isLounge()) { endMyTurn(); } @@ -1450,11 +1448,11 @@ public void gamePhaseChange(GamePhaseChangeEvent e) { } if (clientgui.getClient().isMyTurn() - && (clientgui.getClient().getGame().getPhase() != GamePhase.PHYSICAL)) { + && !clientgui.getClient().getGame().getPhase().isPhysical()) { endMyTurn(); } // if we're ending the firing phase, unregister stuff. - if (clientgui.getClient().getGame().getPhase() == GamePhase.PHYSICAL) { + if (clientgui.getClient().getGame().getPhase().isPhysical()) { setStatusBarText(Messages.getString("PhysicalDisplay.waitingForPhysicalAttackPhase")); } } diff --git a/megamek/src/megamek/client/ui/swing/PlayerListDialog.java b/megamek/src/megamek/client/ui/swing/PlayerListDialog.java index 44779ccd3be..763b5a25c94 100644 --- a/megamek/src/megamek/client/ui/swing/PlayerListDialog.java +++ b/megamek/src/megamek/client/ui/swing/PlayerListDialog.java @@ -16,16 +16,19 @@ import megamek.client.Client; import megamek.client.ui.Messages; +import megamek.client.ui.swing.util.UIUtil; import megamek.common.IGame; import megamek.common.Player; import megamek.common.Team; +import megamek.common.preference.IPreferenceChangeListener; +import megamek.common.preference.PreferenceChangeEvent; import javax.swing.*; import java.awt.*; import java.util.Comparator; import java.util.List; -public class PlayerListDialog extends JDialog { +public class PlayerListDialog extends JDialog implements IPreferenceChangeListener { private static final long serialVersionUID = 7270469195373150106L; @@ -36,7 +39,7 @@ public class PlayerListDialog extends JDialog { public PlayerListDialog(JFrame parent, Client client) { super(parent, Messages.getString("PlayerListDialog.title"), false); this.client = client; - + add(playerList, BorderLayout.CENTER); add(Box.createHorizontalStrut(20), BorderLayout.LINE_START); add(Box.createHorizontalStrut(20), BorderLayout.LINE_END); @@ -44,6 +47,10 @@ public PlayerListDialog(JFrame parent, Client client) { refreshPlayerList(); setMinimumSize(new Dimension(300, 260)); + + adaptToGUIScale(); + GUIPreferences.getInstance().addPreferenceChangeListener(this); + pack(); setResizable(false); setLocation(parent.getLocation().x + (parent.getSize().width / 2) @@ -139,4 +146,17 @@ public Player getSelected() { return null; } + + private void adaptToGUIScale() { + UIUtil.adjustDialog(this, UIUtil.FONT_SCALE1); + setMinimumSize(new Dimension(UIUtil.scaleForGUI(300), UIUtil.scaleForGUI(260))); + } + + @Override + public void preferenceChange(PreferenceChangeEvent e) { + // Update the text size when the GUI scaling changes + if (e.getName().equals(GUIPreferences.GUI_SCALE)) { + adaptToGUIScale(); + } + } } diff --git a/megamek/src/megamek/client/ui/swing/PointblankShotDisplay.java b/megamek/src/megamek/client/ui/swing/PointblankShotDisplay.java index 833454b4e7a..35fd44eeaa6 100644 --- a/megamek/src/megamek/client/ui/swing/PointblankShotDisplay.java +++ b/megamek/src/megamek/client/ui/swing/PointblankShotDisplay.java @@ -479,9 +479,8 @@ protected void endMyTurn() { // end my turn, then. Game game = clientgui.getClient().getGame(); Entity next = game.getNextEntity(game.getTurnIndex()); - if ((game.getPhase() == GamePhase.FIRING) - && (next != null) && (ce() != null) - && (next.getOwnerId() != ce().getOwnerId())) { + if (game.getPhase().isFiring() && (next != null) && (ce() != null) + && (next.getOwnerId() != ce().getOwnerId())) { clientgui.setUnitDisplayVisible(false); } cen = Entity.NONE; diff --git a/megamek/src/megamek/client/ui/swing/PrephaseDisplay.java b/megamek/src/megamek/client/ui/swing/PrephaseDisplay.java index 757482ebb19..79fc0f89621 100644 --- a/megamek/src/megamek/client/ui/swing/PrephaseDisplay.java +++ b/megamek/src/megamek/client/ui/swing/PrephaseDisplay.java @@ -290,7 +290,7 @@ private void refreshButtons() { setStatusBarText(Messages.getFormattedString("PrephaseDisplay.its_your_turn", phase.toString(), ce.getDisplayName())); - boolean isRevealing = ce.getHiddenActivationPhase() != GamePhase.UNKNOWN; + boolean isRevealing = !ce.getHiddenActivationPhase().isUnknown(); setRevealEnabled(!isRevealing); setCancelRevealEnabled(isRevealing); butDone.setEnabled(true); @@ -375,7 +375,7 @@ private void disableButtons() { } private GamePhase revealInPhase() { - return phase == GamePhase.PREMOVEMENT ? GamePhase.MOVEMENT : GamePhase.FIRING; + return phase.isPremovement() ? GamePhase.MOVEMENT : GamePhase.FIRING; } private void reveal() { @@ -438,9 +438,8 @@ public void hexMoused(BoardViewEvent b) { // GameListener @Override public void gameTurnChange(GameTurnChangeEvent e) { - // In case of a /reset command, ensure the state gets reset - if (clientgui.getClient().getGame().getPhase() == GamePhase.LOUNGE) { + if (clientgui.getClient().getGame().getPhase().isLounge()) { endMyTurn(); } // On simultaneous phases, each player ending their turn will generate a turn change diff --git a/megamek/src/megamek/client/ui/swing/RandomArmyDialog.java b/megamek/src/megamek/client/ui/swing/RandomArmyDialog.java index bd096dd02ad..be49bd47b36 100644 --- a/megamek/src/megamek/client/ui/swing/RandomArmyDialog.java +++ b/megamek/src/megamek/client/ui/swing/RandomArmyDialog.java @@ -22,8 +22,8 @@ import megamek.client.ratgenerator.*; import megamek.client.ratgenerator.UnitTable.Parameters; import megamek.client.ui.Messages; +import megamek.client.ui.swing.util.UIUtil; import megamek.common.*; -import megamek.common.enums.GamePhase; import megamek.common.enums.Gender; import megamek.common.event.GameListener; import megamek.common.event.GameListenerAdapter; @@ -267,6 +267,7 @@ public RandomArmyDialog(ClientGUI cl) { constraints.weighty = 1.0; layout.setConstraints(m_pAdvSearch, constraints); m_pParameters.add(m_pAdvSearch); + JScrollPane m_spParameters = new JScrollPane(m_pParameters); // construct the RAT panel m_pRAT.setLayout(new GridBagLayout()); @@ -471,8 +472,10 @@ public RandomArmyDialog(ClientGUI cl) { c.weightx = 1.0; c.weighty = 1.0; m_pPreview.add(scroll, c); + m_pPreview.setMinimumSize(new Dimension(0,0)); - m_pMain.addTab(Messages.getString("RandomArmyDialog.BVtab"), m_pParameters); + + m_pMain.addTab(Messages.getString("RandomArmyDialog.BVtab"), m_spParameters); m_pMain.addTab(Messages.getString("RandomArmyDialog.RATtab"), m_pRAT); m_pMain.addTab(Messages.getString("RandomArmyDialog.RATGentab"), m_pRATGen); m_pMain.addTab(Messages.getString("RandomArmyDialog.Formationtab"), m_pFormations); @@ -489,7 +492,8 @@ public RandomArmyDialog(ClientGUI cl) { m_pRightPane.add(m_pPreview, CARD_PREVIEW); m_pRightPane.add(m_pForceGen.getRightPanel(), CARD_FORCE_TREE); - + m_pRightPane.setMinimumSize(new Dimension(0,0)); + m_pSplit = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, m_pMain, m_pRightPane); m_pSplit.setOneTouchExpandable(false); m_pSplit.setResizeWeight(0.5); @@ -504,6 +508,8 @@ public RandomArmyDialog(ClientGUI cl) { m_pSplit.setDividerLocation(guip.getRndArmySplitPos()); setSize(guip.getRndArmySizeWidth(), guip.getRndArmySizeHeight()); setLocation(guip.getRndArmyPosX(), guip.getRndArmyPosY()); + + adaptToGUIScale(); m_client.getGame().addGameListener(gameListener); addWindowListener(windowListener); @@ -548,7 +554,7 @@ public void actionPerformed(ActionEvent ev) { autoSetSkillsAndName(e); e.setOwner(c.getLocalPlayer()); - if (c.getGame().getPhase() != GamePhase.LOUNGE) { + if (!c.getGame().getPhase().isLounge()) { e.setDeployRound(c.getGame().getRoundCount() + 1); e.setGame(c.getGame()); // Set these to true, otherwise units reinforced in @@ -899,6 +905,8 @@ public void setVisible(boolean show) { updateTechChoice(); updateRATs(); } + + adaptToGUIScale(); super.setVisible(show); } @@ -1106,4 +1114,8 @@ public Object getValueAt(int row, int col) { return ""; } } + + private void adaptToGUIScale() { + UIUtil.adjustDialog(this, UIUtil.FONT_SCALE1); + } } diff --git a/megamek/src/megamek/client/ui/swing/RandomMapDialog.java b/megamek/src/megamek/client/ui/swing/RandomMapDialog.java index 1c3562be2c7..9f61b1569f7 100644 --- a/megamek/src/megamek/client/ui/swing/RandomMapDialog.java +++ b/megamek/src/megamek/client/ui/swing/RandomMapDialog.java @@ -471,7 +471,7 @@ public void actionPerformed(ActionEvent e) { @Override public void setVisible(boolean b) { if (b) { - UIUtil.adjustDialog(getContentPane()); + adaptToGUIScale(); loadWindowSettings(); } else { saveWindowSettings(); @@ -504,5 +504,8 @@ private void loadWindowSettings() { basicButton.setSelected(true); } } - + + private void adaptToGUIScale() { + UIUtil.adjustDialog(this, UIUtil.FONT_SCALE1); + } } diff --git a/megamek/src/megamek/client/ui/swing/RandomNameDialog.java b/megamek/src/megamek/client/ui/swing/RandomNameDialog.java index ce396e90ac0..ee652abc08f 100644 --- a/megamek/src/megamek/client/ui/swing/RandomNameDialog.java +++ b/megamek/src/megamek/client/ui/swing/RandomNameDialog.java @@ -28,6 +28,7 @@ import megamek.client.generator.RandomGenderGenerator; import megamek.client.generator.RandomNameGenerator; import megamek.client.ui.Messages; +import megamek.client.ui.swing.util.UIUtil; import megamek.common.Entity; import megamek.common.enums.Gender; @@ -243,6 +244,12 @@ private void initComponents() { getContentPane().add(panMain, java.awt.BorderLayout.PAGE_START); + adaptToGUIScale(); + pack(); } + + private void adaptToGUIScale() { + UIUtil.adjustDialog(this, UIUtil.FONT_SCALE1); + } } diff --git a/megamek/src/megamek/client/ui/swing/ReplacePlayersDialog.java b/megamek/src/megamek/client/ui/swing/ReplacePlayersDialog.java index 104735af730..2ffb2fa218b 100644 --- a/megamek/src/megamek/client/ui/swing/ReplacePlayersDialog.java +++ b/megamek/src/megamek/client/ui/swing/ReplacePlayersDialog.java @@ -74,7 +74,7 @@ protected ReplacePlayersDialog(JFrame frame, ClientGUI cg) { @Override protected void initialize() { super.initialize(); - UIUtil.adjustDialog(this.getContentPane()); + adaptToGUIScale(); try { finalizeInitialization(); } catch (Exception ex) { @@ -180,4 +180,8 @@ public Map getNewBots() { } return result; } + + private void adaptToGUIScale() { + UIUtil.adjustDialog(this, UIUtil.FONT_SCALE1); + } } \ No newline at end of file diff --git a/megamek/src/megamek/client/ui/swing/ReportDisplay.java b/megamek/src/megamek/client/ui/swing/ReportDisplay.java index 0a7cab01820..12c58afa408 100644 --- a/megamek/src/megamek/client/ui/swing/ReportDisplay.java +++ b/megamek/src/megamek/client/ui/swing/ReportDisplay.java @@ -22,7 +22,6 @@ import megamek.client.ui.swing.widget.SkinSpecification; import megamek.common.Entity; import megamek.common.Report; -import megamek.common.enums.GamePhase; import megamek.common.event.GamePhaseChangeEvent; import megamek.common.preference.IPreferenceChangeListener; import megamek.common.preference.PreferenceChangeEvent; @@ -45,6 +44,17 @@ public class ReportDisplay extends AbstractPhaseDisplay implements // buttons private JButton rerollInitiativeB; + private JSplitPane splitPaneMain; + JPanel panelTop; + + private static final String RD_ACTIONCOMMAND_DONEBUTTON = "doneButton"; + private static final String RD_ACTIONCOMMAND_REROLLINITIATIVE = "reroll_initiative"; + + private static final String MSG_DONE = Messages.getString("ReportDisplay.Done"); + private static final String MSG_REROLL = Messages.getString("ReportDisplay.Reroll"); + private static final String MSG_ROUND = Messages.getString("ReportDisplay.Round"); + private static final String MSG_PHASE = Messages.getString("ReportDisplay.Phase"); + private static final String MSG_DETAILS =Messages.getString("ReportDisplay.Details"); private boolean rerolled; // have we rerolled an init? @@ -56,13 +66,13 @@ public ReportDisplay(ClientGUI clientgui) { super(clientgui); butDone = new MegamekButton("", SkinSpecification.UIComponents.PhaseDisplayDoneButton.getComp()); - butDone.setActionCommand("doneButton"); + butDone.setActionCommand(RD_ACTIONCOMMAND_DONEBUTTON); butDone.addActionListener(new AbstractAction() { private static final long serialVersionUID = -5034474968902280850L; @Override public void actionPerformed(ActionEvent e) { - if (e.getActionCommand().equals("doneButton")) { + if (e.getActionCommand().equals(RD_ACTIONCOMMAND_DONEBUTTON)) { ready(); } } @@ -72,31 +82,41 @@ public void actionPerformed(ActionEvent e) { // Create a tabbed panel to hold our reports. tabs = new JTabbedPane(); - Font tabPanelFont = new Font("Dialog", Font.BOLD, - GUIPreferences.getInstance().getInt("AdvancedChatLoungeTabFontSize")); - tabs.setFont(tabPanelFont); - resetTabs(); - butDone.setText(Messages.getString("ReportDisplay.Done")); + butDone.setText(MSG_DONE); - rerollInitiativeB = new JButton(Messages.getString("ReportDisplay.Reroll")); - rerollInitiativeB.setActionCommand("reroll_initiative"); + rerollInitiativeB = new JButton(MSG_REROLL); + rerollInitiativeB.setActionCommand(RD_ACTIONCOMMAND_REROLLINITIATIVE); rerollInitiativeB.addActionListener(this); // layout screen - setLayout(new GridBagLayout()); - add(tabs, GBC.eol().fill(GridBagConstraints.BOTH)); + setLayout(new BorderLayout()); + splitPaneMain = new JSplitPane(JSplitPane.VERTICAL_SPLIT); + splitPaneMain.setDividerSize(15); + splitPaneMain.setResizeWeight(0.95); + panelTop = new JPanel(new GridBagLayout()); + panelTop.add(tabs, GBC.eol().fill(GridBagConstraints.BOTH)); + JPanel panButtons = new JPanel(); panButtons.setLayout(new GridLayout(1, 8)); panButtons.add(rerollInitiativeB); for (int padding = 0; padding < 6; padding++) { panButtons.add(new JLabel("")); } - add(panButtons, GBC.eol().fill(GridBagConstraints.HORIZONTAL)); + panelTop.add(panButtons, GBC.eol().fill(GridBagConstraints.HORIZONTAL)); + panelTop.setMinimumSize(new Dimension(0, 0)); + splitPaneMain.setTopComponent(panelTop); + add(splitPaneMain); + + adaptToGUIScale(); GUIPreferences.getInstance().addPreferenceChangeListener(this); } + public void setBottom(JComponent comp) { + splitPaneMain.setBottomComponent(comp); + } + /** * Show or hide the "reroll inititiative" button in this report display. * @@ -137,7 +157,8 @@ public boolean hasRerolled() { public void resetButtons() { resetReadyButton(); - if ((clientgui.getClient().getGame().getPhase() == GamePhase.INITIATIVE_REPORT) && clientgui.getClient().getGame().hasTacticalGenius(clientgui.getClient().getLocalPlayer())) { + if (clientgui.getClient().getGame().getPhase().isInitiativeReport() + && clientgui.getClient().getGame().hasTacticalGenius(clientgui.getClient().getLocalPlayer())) { showRerollButton(true); } else { showRerollButton(false); @@ -159,11 +180,11 @@ public void setReportTab(int round, String roundText, String phaseText) { // report. round = 1; } - if (tabs.indexOfTab("Round " + round) == -1) { + if (tabs.indexOfTab(MSG_ROUND + " " + round) == -1) { // Need a new tab for the new round. // get rid of phase tab - int phaseTab = tabs.indexOfTab("Phase"); + int phaseTab = tabs.indexOfTab(MSG_PHASE); if (phaseTab >= 0) { tabs.removeTabAt(phaseTab); } @@ -176,9 +197,9 @@ public void setReportTab(int round, String roundText, String phaseText) { // TODO: we should remove the use of client final Client client = clientgui.getClient(); for (int catchup = phaseTab + 1; catchup <= round; catchup++) { - if (tabs.indexOfTab("Round " + catchup) != -1) { + if (tabs.indexOfTab(MSG_ROUND + " " + catchup) != -1) { ((JTextPane) ((JScrollPane) tabs.getComponentAt(tabs - .indexOfTab("Round " + catchup))).getViewport() + .indexOfTab(MSG_ROUND + " " + catchup))).getViewport() .getView()).setText("
"
                             + client.receiveReport(client.getGame().getReports(
                                     catchup)) + "
"); @@ -196,7 +217,7 @@ public void setReportTab(int round, String roundText, String phaseText) { ta.setText("
" + text + "
"); ta.setEditable(false); ta.setOpaque(false); - tabs.add("Round " + catchup, new JScrollPane(ta)); + tabs.add(MSG_ROUND + " " + catchup, new JScrollPane(ta)); } // add the new current phase tab @@ -211,12 +232,12 @@ public void setReportTab(int round, String roundText, String phaseText) { JScrollPane sp = new JScrollPane(ta); - tabs.add("Phase", sp); + tabs.add(MSG_PHASE, sp); tabs.setSelectedComponent(sp); } else { // Update the existing round tab and the phase tab. - ((JTextPane) ((JScrollPane) tabs.getComponentAt(tabs.indexOfTab("Round " + round))).getViewport().getView()).setText("
" + roundText + "
"); - ((JTextPane) ((JScrollPane) tabs.getComponentAt(tabs.indexOfTab("Phase"))).getViewport().getView()).setText("
" + phaseText + "
"); + ((JTextPane) ((JScrollPane) tabs.getComponentAt(tabs.indexOfTab(MSG_ROUND + " " + round))).getViewport().getView()).setText("
" + roundText + "
"); + ((JTextPane) ((JScrollPane) tabs.getComponentAt(tabs.indexOfTab(MSG_PHASE))).getViewport().getView()).setText("
" + phaseText + "
"); } } @@ -227,7 +248,7 @@ public static void setupStylesheet(JTextPane pane) { } public void appendReportTab(String additionalText) { - int phaseTab = tabs.indexOfTab("Phase"); + int phaseTab = tabs.indexOfTab(MSG_PHASE); if (phaseTab > 0) { JTextPane pane = ((JTextPane) ((JScrollPane) tabs.getComponentAt(phaseTab - 1)).getViewport().getView()); BASE64ToolKit toolKit = new BASE64ToolKit(); @@ -249,7 +270,7 @@ public void resetTabs() { // @Override public void actionPerformed(ActionEvent ev) { - if (ev.getActionCommand().equalsIgnoreCase("reroll_initiative")) { + if (ev.getActionCommand().equalsIgnoreCase(RD_ACTIONCOMMAND_REROLLINITIATIVE)) { rerollInitiative(); } } @@ -267,7 +288,7 @@ public void gamePhaseChange(GamePhaseChangeEvent e) { rerolled = false; SwingUtilities.invokeLater(() -> { - int phaseTab = tabs.indexOfTab("Phase"); + int phaseTab = tabs.indexOfTab(MSG_PHASE); if (phaseTab > 0) { JViewport vp = ((JScrollPane) tabs.getComponentAt(phaseTab - 1)).getViewport(); vp.setViewPosition(new Point()); @@ -313,7 +334,7 @@ public void hyperlinkUpdate(HyperlinkEvent evt) { } } else if (evtDesc.startsWith(Report.TOOLTIP_LINK)) { String desc = evtDesc.substring(Report.TOOLTIP_LINK.length()); - JOptionPane.showMessageDialog(clientgui, desc, Messages.getString("ReportDisplay.Details"), + JOptionPane.showMessageDialog(clientgui, desc, Messages.getString(MSG_DETAILS), JOptionPane.PLAIN_MESSAGE); } } else if (evt.getEventType() == HyperlinkEvent.EventType.ENTERED) { @@ -325,22 +346,28 @@ public void hyperlinkUpdate(HyperlinkEvent evt) { activePane().setToolTipText(null); } } + private void adaptToGUIScale() { + UIUtil.adjustContainer(panelTop, UIUtil.FONT_SCALE1); + UIUtil.scaleComp(butDone, UIUtil.FONT_SCALE2); + + for (int i = 0; i < tabs.getTabCount(); i++) { + Component cp = tabs.getComponentAt(i); + if (cp instanceof JScrollPane) { + Component pane = ((JScrollPane) cp).getViewport().getView(); + if (pane instanceof JTextPane) { + JTextPane tp = (JTextPane) pane; + setupStylesheet(tp); + tp.setText(tp.getText()); + } + } + } + } @Override public void preferenceChange(PreferenceChangeEvent e) { // Update the text size when the GUI scaling changes if (e.getName().equals(GUIPreferences.GUI_SCALE)) { - for (int i = 0; i < tabs.getTabCount(); i++) { - Component cp = tabs.getComponentAt(i); - if (cp instanceof JScrollPane) { - Component pane = ((JScrollPane) cp).getViewport().getView(); - if (pane instanceof JTextPane) { - JTextPane tp = (JTextPane) pane; - setupStylesheet(tp); - tp.setText(tp.getText()); - } - } - } + adaptToGUIScale(); } } diff --git a/megamek/src/megamek/client/ui/swing/Ruler.java b/megamek/src/megamek/client/ui/swing/Ruler.java index 8752ceda85a..b9a81e7b02f 100644 --- a/megamek/src/megamek/client/ui/swing/Ruler.java +++ b/megamek/src/megamek/client/ui/swing/Ruler.java @@ -18,7 +18,10 @@ import megamek.client.event.BoardViewListener; import megamek.client.ui.Messages; import megamek.client.ui.swing.boardview.BoardView; +import megamek.client.ui.swing.util.UIUtil; import megamek.common.*; +import megamek.common.preference.IPreferenceChangeListener; +import megamek.common.preference.PreferenceChangeEvent; import org.apache.logging.log4j.LogManager; import javax.swing.*; @@ -28,7 +31,7 @@ /** * @author Ken Nguyen (kenn) */ -public class Ruler extends JDialog implements BoardViewListener { +public class Ruler extends JDialog implements BoardViewListener, IPreferenceChangeListener { private static final long serialVersionUID = -4820402626782115601L; public static Color color1 = Color.cyan; public static Color color2 = Color.magenta; @@ -92,7 +95,7 @@ private void jbInit() { buttonPanel = new JPanel(); butFlip.setText(Messages.getString("Ruler.flip")); butFlip.addActionListener(e -> butFlip_actionPerformed()); - getContentPane().setLayout(gridBagLayout1); + JPanel panelMain = new JPanel(gridBagLayout1); jLabel1 = new JLabel(Messages.getString("Ruler.Start"), SwingConstants.RIGHT); tf_start.setEditable(false); tf_start.setColumns(16); @@ -136,16 +139,6 @@ public void keyReleased(KeyEvent e) { height2.setColumns(5); cboIsMech2.addItemListener(e -> checkBoxSelectionChanged()); - //need to set all the minimum sizes to prevent jtextfield going to zero size - //on dialog resize.setColumns(16); - tf_start.setMinimumSize(tf_start.getPreferredSize()); - tf_end.setMinimumSize(tf_end.getPreferredSize()); - height1.setMinimumSize(height1.getPreferredSize()); - height2.setMinimumSize(height2.getPreferredSize()); - tf_distance.setMinimumSize(tf_distance.getPreferredSize()); - tf_los1.setMinimumSize(tf_los1.getPreferredSize()); - tf_los2.setMinimumSize(tf_los2.getPreferredSize()); - GridBagConstraints c = new GridBagConstraints(); c.anchor = GridBagConstraints.EAST; @@ -153,88 +146,88 @@ public void keyReleased(KeyEvent e) { c.gridx = 0; c.gridy = 0; gridBagLayout1.setConstraints(heightLabel1, c); - getContentPane().add(heightLabel1); + panelMain.add(heightLabel1); c.anchor = GridBagConstraints.WEST; c.gridx = 1; gridBagLayout1.setConstraints(height1, c); - getContentPane().add(height1); + panelMain.add(height1); c.gridx = 2; gridBagLayout1.setConstraints(cboIsMech1, c); - getContentPane().add(cboIsMech1); + panelMain.add(cboIsMech1); c.gridx = 0; c.gridy = 1; c.anchor = GridBagConstraints.EAST; gridBagLayout1.setConstraints(heightLabel2, c); - getContentPane().add(heightLabel2); + panelMain.add(heightLabel2); c.anchor = GridBagConstraints.WEST; c.gridx = 1; gridBagLayout1.setConstraints(height2, c); - getContentPane().add(height2); + panelMain.add(height2); c.gridx = 2; gridBagLayout1.setConstraints(cboIsMech2, c); - getContentPane().add(cboIsMech2); + panelMain.add(cboIsMech2); c.gridx = 0; c.gridy = 2; c.anchor = GridBagConstraints.EAST; gridBagLayout1.setConstraints(jLabel1, c); - getContentPane().add(jLabel1); + panelMain.add(jLabel1); c.anchor = GridBagConstraints.WEST; c.gridx = 1; c.gridwidth = 2; gridBagLayout1.setConstraints(tf_start, c); c.gridwidth = 1; - getContentPane().add(tf_start); + panelMain.add(tf_start); c.gridx = 0; c.gridy = 3; c.anchor = GridBagConstraints.EAST; gridBagLayout1.setConstraints(jLabel2, c); - getContentPane().add(jLabel2); + panelMain.add(jLabel2); c.anchor = GridBagConstraints.WEST; c.gridwidth = 2; c.gridx = 1; gridBagLayout1.setConstraints(tf_end, c); c.gridwidth = 1; - getContentPane().add(tf_end); + panelMain.add(tf_end); c.gridx = 0; c.gridy = 4; c.anchor = GridBagConstraints.EAST; gridBagLayout1.setConstraints(jLabel3, c); - getContentPane().add(jLabel3); + panelMain.add(jLabel3); c.anchor = GridBagConstraints.WEST; c.gridx = 1; gridBagLayout1.setConstraints(tf_distance, c); - getContentPane().add(tf_distance); + panelMain.add(tf_distance); c.gridx = 0; c.gridy = 5; c.anchor = GridBagConstraints.EAST; gridBagLayout1.setConstraints(jLabel4, c); - getContentPane().add(jLabel4); + panelMain.add(jLabel4); c.anchor = GridBagConstraints.WEST; c.gridx = 1; c.fill = GridBagConstraints.HORIZONTAL; c.gridwidth = 2; gridBagLayout1.setConstraints(tf_los1, c); c.gridwidth = 1; - getContentPane().add(tf_los1); + panelMain.add(tf_los1); c.gridx = 0; c.gridy = 6; c.fill = GridBagConstraints.NONE; c.anchor = GridBagConstraints.EAST; gridBagLayout1.setConstraints(jLabel5, c); - getContentPane().add(jLabel5); + panelMain.add(jLabel5); c.anchor = GridBagConstraints.WEST; c.gridx = 1; c.fill = GridBagConstraints.HORIZONTAL; c.gridwidth = 2; gridBagLayout1.setConstraints(tf_los2, c); c.gridwidth = 1; - getContentPane().add(tf_los2); + panelMain.add(tf_los2); buttonPanel.add(butFlip); buttonPanel.add(butClose); @@ -244,10 +237,17 @@ public void keyReleased(KeyEvent e) { c.fill = GridBagConstraints.NONE; c.anchor = GridBagConstraints.CENTER; gridBagLayout1.setConstraints(buttonPanel, c); - getContentPane().add(buttonPanel); + panelMain.add(buttonPanel); + + JScrollPane sp = new JScrollPane(panelMain); + setLayout(new BorderLayout()); + add(sp); validate(); + adaptToGUIScale(); + GUIPreferences.getInstance().addPreferenceChangeListener(this); + setVisible(false); } @@ -469,4 +469,15 @@ public void finishedMovingUnits(BoardViewEvent b) { public void unitSelected(BoardViewEvent b) { //ignored } + + private void adaptToGUIScale() { + UIUtil.adjustDialog(this, UIUtil.FONT_SCALE1); + } + + @Override + public void preferenceChange(PreferenceChangeEvent e) { + if (e.getName().equals(GUIPreferences.GUI_SCALE)) { + adaptToGUIScale(); + } + } } diff --git a/megamek/src/megamek/client/ui/swing/SelectArtyAutoHitHexDisplay.java b/megamek/src/megamek/client/ui/swing/SelectArtyAutoHitHexDisplay.java index 9dc8ef8933d..a2bb75f4369 100644 --- a/megamek/src/megamek/client/ui/swing/SelectArtyAutoHitHexDisplay.java +++ b/megamek/src/megamek/client/ui/swing/SelectArtyAutoHitHexDisplay.java @@ -22,7 +22,6 @@ import megamek.client.ui.swing.widget.SkinSpecification; import megamek.common.*; import megamek.common.containers.PlayerIDandList; -import megamek.common.enums.GamePhase; import megamek.common.event.GamePhaseChangeEvent; import megamek.common.event.GameTurnChangeEvent; import megamek.common.options.OptionsConstants; @@ -277,10 +276,11 @@ public void gamePhaseChange(final GamePhaseChangeEvent e) { } if (clientgui.getClient().isMyTurn() - && (clientgui.getClient().getGame().getPhase() != GamePhase.SET_ARTILLERY_AUTOHIT_HEXES)) { + && !clientgui.getClient().getGame().getPhase().isSetArtilleryAutohitHexes()) { endMyTurn(); } - if (clientgui.getClient().getGame().getPhase() == GamePhase.SET_ARTILLERY_AUTOHIT_HEXES) { + + if (clientgui.getClient().getGame().getPhase().isSetArtilleryAutohitHexes()) { setStatusBarText(Messages.getString("SelectArtyAutoHitHexDisplay.waitingMinefieldPhase")); } } diff --git a/megamek/src/megamek/client/ui/swing/SkillGenerationDialog.java b/megamek/src/megamek/client/ui/swing/SkillGenerationDialog.java index a0ed85672e7..977a609f064 100644 --- a/megamek/src/megamek/client/ui/swing/SkillGenerationDialog.java +++ b/megamek/src/megamek/client/ui/swing/SkillGenerationDialog.java @@ -24,6 +24,7 @@ import megamek.client.ui.baseComponents.MMComboBox; import megamek.client.ui.enums.DialogResult; import megamek.client.ui.panels.SkillGenerationOptionsPanel; +import megamek.client.ui.swing.util.UIUtil; import megamek.common.Entity; import javax.swing.*; @@ -119,11 +120,16 @@ protected JPanel createButtonPanel() { ? getClientGUI().getBots().get(comboClients.getSelectedItem()) : getClientGUI().getClient())); panel.add(comboClients); - return panel; } //endregion Initialization + @Override + protected void finalizeInitialization() throws Exception { + super.finalizeInitialization(); + adaptToGUIScale(); + } + //region Button Actions @Override protected void okAction() { @@ -131,4 +137,8 @@ protected void okAction() { getSkillGenerationOptionsPanel().updateClient(); } //endregion Button Actions + + private void adaptToGUIScale() { + UIUtil.adjustDialog(this, UIUtil.FONT_SCALE1); + } } diff --git a/megamek/src/megamek/client/ui/swing/StatusBarPhaseDisplay.java b/megamek/src/megamek/client/ui/swing/StatusBarPhaseDisplay.java index 0035591b078..eb0b35ddf80 100644 --- a/megamek/src/megamek/client/ui/swing/StatusBarPhaseDisplay.java +++ b/megamek/src/megamek/client/ui/swing/StatusBarPhaseDisplay.java @@ -26,6 +26,7 @@ import javax.swing.*; +import megamek.client.ui.swing.util.TurnTimer; import megamek.client.ui.swing.util.UIUtil; import megamek.client.ui.swing.widget.*; import megamek.common.preference.*; @@ -43,6 +44,12 @@ public abstract class StatusBarPhaseDisplay extends AbstractPhaseDisplay protected static final Dimension MIN_BUTTON_SIZE = new Dimension(32, 32); protected static final GUIPreferences GUIP = GUIPreferences.getInstance(); private static final int BUTTON_ROWS = 2; + private static final String SBPD_KEY_CLEARBUTTON = "clearButton"; + + /** + * timer that ends turn if time limit set in options is over + */ + private TurnTimer tt; /** * Interface that defines what a command for a phase is. @@ -79,12 +86,11 @@ public int compare(PhaseCommand c1, PhaseCommand c2) { protected int buttonsPerRow = GUIP.getInt(GUIPreferences.ADVANCED_BUTTONS_PER_ROW); protected int buttonsPerGroup = BUTTON_ROWS * buttonsPerRow; - protected StatusBarPhaseDisplay(ClientGUI cg) { super(cg); - getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0), "clearButton"); - getActionMap().put("clearButton", new AbstractAction() { + getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0), SBPD_KEY_CLEARBUTTON); + getActionMap().put(SBPD_KEY_CLEARBUTTON, new AbstractAction() { @Override public void actionPerformed(ActionEvent e) { if (isIgnoringEvents()) { @@ -170,6 +176,7 @@ public void setupButtonPanel() { panButtons.add(buttonsPanel); panButtons.add(donePanel); + adaptToGUIScale(); panButtons.validate(); panButtons.repaint(); } @@ -188,13 +195,20 @@ protected void setupStatusBar(String statusInfo) { protected void setStatusBarText(String text) { labStatus.setText(text); } - + + private void adaptToGUIScale() { + UIUtil.adjustContainer(panButtons, UIUtil.FONT_SCALE1); + UIUtil.adjustContainer(panStatus, UIUtil.FONT_SCALE2); + } + @Override public void preferenceChange(PreferenceChangeEvent e) { if (e.getName().equals(GUIPreferences.ADVANCED_BUTTONS_PER_ROW)) { buttonsPerRow = GUIP.getInt(GUIPreferences.ADVANCED_BUTTONS_PER_ROW); buttonsPerGroup = 2 * buttonsPerRow; setupButtonPanel(); + } else if (e.getName().equals(GUIPreferences.GUI_SCALE)) { + adaptToGUIScale(); } } @@ -224,4 +238,17 @@ public void mouseEntered(MouseEvent e) { } @Override public void mouseExited(MouseEvent e) { } + + public void startTimer() { + // check if there should be a turn timer running + tt = TurnTimer.init(this, clientgui.getClient()); + } + + public void stopTimer() { + //get rid of still running timer, if turn is concluded before time is up + if (tt != null) { + tt.stopTimer(); + tt = null; + } + } } \ No newline at end of file diff --git a/megamek/src/megamek/client/ui/swing/TargetingPhaseDisplay.java b/megamek/src/megamek/client/ui/swing/TargetingPhaseDisplay.java index 5735e6b592f..df079720077 100644 --- a/megamek/src/megamek/client/ui/swing/TargetingPhaseDisplay.java +++ b/megamek/src/megamek/client/ui/swing/TargetingPhaseDisplay.java @@ -1176,7 +1176,7 @@ public void hexSelected(BoardViewEvent b) { && (ce() != null) && !b.getCoords().equals(ce().getPosition())) { if (shiftheld) { updateFlipArms(false); - } else if (phase == GamePhase.TARGETING) { + } else if (phase.isTargeting()) { target(new HexTarget(b.getCoords(), Targetable.TYPE_HEX_ARTILLERY)); } else { target(chooseTarget(b.getCoords())); @@ -1261,7 +1261,7 @@ else if (targets.size() > 1) { @Override public void gameTurnChange(GameTurnChangeEvent e) { // In case of a /reset command, ensure the state gets reset - if (clientgui.getClient().getGame().getPhase() == GamePhase.LOUNGE) { + if (clientgui.getClient().getGame().getPhase().isLounge()) { endMyTurn(); } // On simultaneous phases, each player ending their turn will generate a turn change @@ -1479,7 +1479,8 @@ public void valueChanged(ListSelectionEvent event) { return; } - if (event.getSource().equals(clientgui.getUnitDisplay().wPan.weaponList)) { + if ((clientgui.getClient().getGame().getPhase().isTargeting()) && + (event.getSource().equals(clientgui.getUnitDisplay().wPan.weaponList))) { // update target data in weapon display updateTarget(); } diff --git a/megamek/src/megamek/client/ui/swing/UnitEditorDialog.java b/megamek/src/megamek/client/ui/swing/UnitEditorDialog.java index 7342f8d21e2..6a499ca2d22 100644 --- a/megamek/src/megamek/client/ui/swing/UnitEditorDialog.java +++ b/megamek/src/megamek/client/ui/swing/UnitEditorDialog.java @@ -14,6 +14,7 @@ package megamek.client.ui.swing; import megamek.client.ui.Messages; +import megamek.client.ui.swing.util.UIUtil; import megamek.common.*; import megamek.common.options.OptionsConstants; @@ -141,6 +142,7 @@ private void initComponents() { // TODO: size right + adaptToGUIScale(); pack(); } @@ -1527,4 +1529,7 @@ private void checkBoxes(ActionEvent evt) { } } + private void adaptToGUIScale() { + UIUtil.adjustDialog(this, UIUtil.FONT_SCALE1); + } } diff --git a/megamek/src/megamek/client/ui/swing/UnitFailureDialog.java b/megamek/src/megamek/client/ui/swing/UnitFailureDialog.java index a8b81d0ceff..5b0c88a87af 100644 --- a/megamek/src/megamek/client/ui/swing/UnitFailureDialog.java +++ b/megamek/src/megamek/client/ui/swing/UnitFailureDialog.java @@ -13,27 +13,16 @@ */ package megamek.client.ui.swing; -import java.awt.BorderLayout; -import java.awt.Font; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.awt.event.KeyEvent; -import java.awt.event.KeyListener; -import java.awt.event.WindowAdapter; -import java.awt.event.WindowEvent; -import java.util.Iterator; -import java.util.Map; +import megamek.MMConstants; +import megamek.client.ui.Messages; -import javax.swing.JButton; -import javax.swing.JDialog; -import javax.swing.JFrame; -import javax.swing.JList; -import javax.swing.JScrollPane; -import javax.swing.JTextArea; +import javax.swing.*; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; - -import megamek.client.ui.Messages; +import java.awt.*; +import java.awt.event.*; +import java.util.Iterator; +import java.util.Map; /** * @author Ryan McConnell @@ -62,7 +51,7 @@ public UnitFailureDialog(JFrame frame, Map hff) { reasonTextArea.setEditable(false); reasonTextArea.setOpaque(false); - reasonTextArea.setFont(new Font("SansSerif", Font.PLAIN, 12)); + reasonTextArea.setFont(new Font(MMConstants.FONT_SANS_SERIF, Font.PLAIN, 12)); failedList.addListSelectionListener(this); getContentPane().setLayout(new BorderLayout()); diff --git a/megamek/src/megamek/client/ui/swing/UnitOverview.java b/megamek/src/megamek/client/ui/swing/UnitOverview.java index 4a3455b8b76..68e8929c6b4 100644 --- a/megamek/src/megamek/client/ui/swing/UnitOverview.java +++ b/megamek/src/megamek/client/ui/swing/UnitOverview.java @@ -14,6 +14,7 @@ */ package megamek.client.ui.swing; +import megamek.MMConstants; import megamek.client.event.BoardViewEvent; import megamek.client.ui.IDisplayable; import megamek.client.ui.Messages; @@ -35,7 +36,7 @@ public class UnitOverview implements IDisplayable { */ public static final int ICON_NAME_MAX_LENGTH = 52; - private static final Font FONT = new Font("SansSerif", Font.PLAIN, 10); + private static final Font FONT = new Font(MMConstants.FONT_SANS_SERIF, Font.PLAIN, 10); private static final int DIST_TOP = 5; private static final int DIST_SIDE = 5; private static final int ICON_WIDTH = 56; diff --git a/megamek/src/megamek/client/ui/swing/alphaStrike/ConfigurableASCardPanel.java b/megamek/src/megamek/client/ui/swing/alphaStrike/ConfigurableASCardPanel.java index 6f075f52c9d..2b0ee9fb79b 100644 --- a/megamek/src/megamek/client/ui/swing/alphaStrike/ConfigurableASCardPanel.java +++ b/megamek/src/megamek/client/ui/swing/alphaStrike/ConfigurableASCardPanel.java @@ -132,7 +132,7 @@ public void setASElement(@Nullable ASCardDisplayable element) { private void updateFont() { String selectedItem = (String) fontChooser.getSelectedItem(); if ((selectedItem == null) || selectedItem.isBlank()) { - cardPanel.setCardFont(new Font(Font.SANS_SERIF, Font.PLAIN, 14)); + cardPanel.setCardFont(new Font(MMConstants.FONT_SANS_SERIF, Font.PLAIN, 14)); } else { cardPanel.setCardFont(Font.decode(selectedItem)); GUIPreferences.getInstance().setAsCardFont(selectedItem); diff --git a/megamek/src/megamek/client/ui/swing/boardview/BoardView.java b/megamek/src/megamek/client/ui/swing/boardview/BoardView.java index f6053638bf3..b4855242b5e 100644 --- a/megamek/src/megamek/client/ui/swing/boardview/BoardView.java +++ b/megamek/src/megamek/client/ui/swing/boardview/BoardView.java @@ -46,7 +46,6 @@ import megamek.common.actions.*; import megamek.common.annotations.Nullable; import megamek.common.enums.BasementType; -import megamek.common.enums.GamePhase; import megamek.common.enums.IlluminationLevel; import megamek.common.event.*; import megamek.common.options.GameOptions; @@ -79,8 +78,8 @@ import java.util.*; import java.util.stream.Collectors; -import static megamek.client.ui.swing.util.UIUtil.guiScaledFontHTML; import static megamek.client.ui.swing.tooltip.TipUtil.*; +import static megamek.client.ui.swing.util.UIUtil.guiScaledFontHTML; /** * Displays the board; lets the user scroll around and select points on it. @@ -132,13 +131,11 @@ public class BoardView extends JPanel implements Scrollable, BoardListener, Mous // line width of the fly over lines static final int FLY_OVER_LINE_WIDTH = 3; - - // FIXME : Fonts shouldn't ever be handled like this for accessibility reasons - private static Font FONT_7 = new Font("SansSerif", Font.PLAIN, 7); - private static Font FONT_8 = new Font("SansSerif", Font.PLAIN, 8); - private static Font FONT_9 = new Font("SansSerif", Font.PLAIN, 9); - private static Font FONT_10 = new Font("SansSerif", Font.PLAIN, 10); - private static Font FONT_12 = new Font("SansSerif", Font.PLAIN, 12); + private static Font FONT_7 = new Font(MMConstants.FONT_SANS_SERIF, Font.PLAIN, 7); + private static Font FONT_8 = new Font(MMConstants.FONT_SANS_SERIF, Font.PLAIN, 8); + private static Font FONT_9 = new Font(MMConstants.FONT_SANS_SERIF, Font.PLAIN, 9); + private static Font FONT_10 = new Font(MMConstants.FONT_SANS_SERIF, Font.PLAIN, 10); + private static Font FONT_12 = new Font(MMConstants.FONT_SANS_SERIF, Font.PLAIN, 12); Dimension hex_size; @@ -340,7 +337,7 @@ public class BoardView extends JPanel implements Scrollable, BoardListener, Mous private long totalTime; private long averageTime; private int frameCount; - private Font fpsFont = new Font("SansSerif", Font.PLAIN, 20); + private Font fpsFont = new Font(MMConstants.FONT_SANS_SERIF, Font.PLAIN, 20); /** * Keeps track of whether we have an active ChatterBox2 @@ -408,6 +405,8 @@ public class BoardView extends JPanel implements Scrollable, BoardListener, Mous /** A map overlay showing some important keybinds. */ KeyBindingsOverlay keybindOverlay; + + PlanetaryConditionsOverlay planetaryConditionsOverlay; /** The coords where the mouse was last. */ Coords lastCoords; @@ -433,6 +432,13 @@ public BoardView(final Game game, final MegaMekController controller, ClientGUI if (controller != null) { addDisplayable(keybindOverlay); } + + planetaryConditionsOverlay = new PlanetaryConditionsOverlay(game, clientgui); + // Avoid showing the planetary Conditions when they can't be used (in the lobby map preview) + if (controller != null) { + addDisplayable(planetaryConditionsOverlay); + } + ourTask = scheduleRedrawTimer(); // call only once clearSprites(); addMouseListener(this); @@ -817,14 +823,14 @@ public boolean hasReleaseAction() { private boolean shouldIgnoreKeyCommands() { return getChatterBoxActive() || !isVisible() - || (game.getPhase() == GamePhase.LOUNGE) - || (game.getPhase() == GamePhase.END_REPORT) - || (game.getPhase() == GamePhase.MOVEMENT_REPORT) - || (game.getPhase() == GamePhase.TARGETING_REPORT) - || (game.getPhase() == GamePhase.FIRING_REPORT) - || (game.getPhase() == GamePhase.PHYSICAL_REPORT) - || (game.getPhase() == GamePhase.OFFBOARD_REPORT) - || (game.getPhase() == GamePhase.INITIATIVE_REPORT) + || game.getPhase().isLounge() + || game.getPhase().isEndReport() + || game.getPhase().isMovementReport() + || game.getPhase().isTargetingReport() + || game.getPhase().isFiringReport() + || game.getPhase().isPhysicalReport() + || game.getPhase().isOffboardReport() + || game.getPhase().isInitiativeReport() || shouldIgnoreKeys; } @@ -887,6 +893,10 @@ public void preferenceChange(PreferenceChangeEvent e) { keybindOverlay.setVisible((boolean) e.getNewValue()); repaint(); break; + case GUIPreferences.SHOW_PLANETARYCONDITIONS_OVERLAY: + planetaryConditionsOverlay.setVisible((boolean) e.getNewValue()); + repaint(); + break; case GUIPreferences.AOHEXSHADOWS: case GUIPreferences.FLOATINGISO: @@ -1099,7 +1109,7 @@ public synchronized void paintComponent(Graphics g) { drawSprites(g, fieldofFireSprites); } - if ((game.getPhase() == GamePhase.MOVEMENT) && !useIsometric()) { + if (game.getPhase().isMovement() && !useIsometric()) { drawSprites(g, moveEnvSprites); drawSprites(g, moveModEnvSprites); } @@ -1125,7 +1135,7 @@ public synchronized void paintComponent(Graphics g) { drawDeployment(g); } - if ((game.getPhase() == GamePhase.SET_ARTILLERY_AUTOHIT_HEXES) && showAllDeployment) { + if (game.getPhase().isSetArtilleryAutohitHexes() && showAllDeployment) { drawAllDeployment(g); } @@ -1154,7 +1164,7 @@ public synchronized void paintComponent(Graphics g) { drawSprites(g, attackSprites); // draw movement vectors. - if (game.useVectorMove() && (game.getPhase() == GamePhase.MOVEMENT)) { + if (game.useVectorMove() && game.getPhase().isMovement()) { drawSprites(g, movementSprites); } @@ -1162,11 +1172,11 @@ public synchronized void paintComponent(Graphics g) { drawSprites(g, pathSprites); // draw firing solution sprites, but only during the firing phase - if ((game.getPhase() == GamePhase.FIRING) || (game.getPhase() == GamePhase.OFFBOARD)) { + if (game.getPhase().isFiring() || game.getPhase().isOffboard()) { drawSprites(g, firingSprites); } - if (game.getPhase() == GamePhase.FIRING) { + if (game.getPhase().isFiring()) { for (Coords c : strafingCoords) { drawHexBorder(g, getHexLocation(c), Color.yellow, 0, 3); } @@ -1935,7 +1945,7 @@ public Mounted getSelectedArtilleryWeapon() { // during // the artyautohithexes phase. These could be displayed if the player // uses the /reset command in some situations - if (game.getPhase() == GamePhase.SET_ARTILLERY_AUTOHIT_HEXES) { + if (game.getPhase().isSetArtilleryAutohitHexes()) { return null; } @@ -2189,8 +2199,7 @@ public BufferedImage getEntireBoardImage(boolean ignoreUnits, boolean useBaseZoo drawDeployment(boardGraph); } - if ((game.getPhase() == GamePhase.SET_ARTILLERY_AUTOHIT_HEXES) - && (showAllDeployment)) { + if (game.getPhase().isSetArtilleryAutohitHexes() && showAllDeployment) { drawAllDeployment(boardGraph); } @@ -2632,7 +2641,7 @@ private void drawHex(Coords c, Graphics boardGraph, boolean saveBoardImage) { if (getDisplayInvalidHexInfo() && !hex.isValid(null)) { Point hexCenter = new Point((int) (HEX_W / 2 * scale), (int) (HEX_H / 2 * scale)); drawCenteredText(g, Messages.getString("BoardEditor.INVALID"), hexCenter, Color.RED, - false, new Font("SansSerif", Font.BOLD, 14)); + false, new Font(MMConstants.FONT_SANS_SERIF, Font.BOLD, 14)); } // write terrain level / water depth / building height @@ -4923,7 +4932,7 @@ public synchronized void boardChangedAllHexes(BoardEvent b) { public void gameEntityNew(GameEntityNewEvent e) { updateEcmList(); redrawAllEntities(); - if (game.getPhase() == GamePhase.MOVEMENT) { + if (game.getPhase().isMovement()) { refreshMoveVectors(); } } @@ -4932,7 +4941,7 @@ public void gameEntityNew(GameEntityNewEvent e) { public void gameEntityRemove(GameEntityRemoveEvent e) { updateEcmList(); redrawAllEntities(); - if (game.getPhase() == GamePhase.MOVEMENT) { + if (game.getPhase().isMovement()) { refreshMoveVectors(); } } @@ -4946,9 +4955,8 @@ public void gameEntityChange(GameEntityChangeEvent e) { updateEcmList(); - //For Entities that have converted to another mode, check for a different sprite - if (game.getPhase() == GamePhase.MOVEMENT - && en.isConvertingNow()) { + // For Entities that have converted to another mode, check for a different sprite + if (game.getPhase().isMovement() && en.isConvertingNow()) { tileManager.reloadImage(en); } @@ -4961,7 +4969,7 @@ public void gameEntityChange(GameEntityChangeEvent e) { } redrawAllEntities(); - if (game.getPhase() == GamePhase.MOVEMENT) { + if (game.getPhase().isMovement()) { refreshMoveVectors(); } if ((mp != null) && !mp.isEmpty() && guip.getShowMoveStep() @@ -5035,9 +5043,10 @@ public void gameBoardChanged(GameBoardChangeEvent e) { @Override public void gamePhaseChange(GamePhaseChangeEvent e) { - if (GUIPreferences.getInstance().getGameSummaryBoardView() && ((e.getOldPhase() == GamePhase.DEPLOYMENT) - || (e.getOldPhase() == GamePhase.MOVEMENT) || (e.getOldPhase() == GamePhase.TARGETING) - || (e.getOldPhase() == GamePhase.FIRING) || (e.getOldPhase() == GamePhase.PHYSICAL))) { + if (GUIPreferences.getInstance().getGameSummaryBoardView() + && (e.getOldPhase().isDeployment() || e.getOldPhase().isMovement() + || e.getOldPhase().isTargeting() || e.getOldPhase().isFiring() + || e.getOldPhase().isPhysical())) { File dir = new File(Configuration.gameSummaryImagesBVDir(), game.getUUIDString()); if (!dir.exists()) { dir.mkdirs(); @@ -5474,8 +5483,7 @@ public String getHexTooltip(MouseEvent e) { } } - if ((game.getPhase() == GamePhase.MOVEMENT) && - (movementTarget != null)) { + if (game.getPhase().isMovement() && (movementTarget != null)) { txt.append("
"); int disPM = movementTarget.distance(mcoords); if (disPM == 1) { @@ -5505,7 +5513,7 @@ public String getHexTooltip(MouseEvent e) { // Show the player(s) that may deploy here // in the artillery autohit designation phase - if ((game.getPhase() == GamePhase.SET_ARTILLERY_AUTOHIT_HEXES) && (mhex != null)) { + if (game.getPhase().isSetArtilleryAutohitHexes() && (mhex != null)) { txt.append("
"); Enumeration allP = game.getPlayers(); boolean foundPlayer = false; @@ -5641,7 +5649,6 @@ public String getHexTooltip(MouseEvent e) { } final Collection shdList = game.getBoard().getSpecialHexDisplay(mcoords); - final GamePhase currPhase = game.getPhase(); int round = game.getRoundCount(); if (shdList != null) { boolean isHexAutoHit = localPlayer.getArtyAutoHitHexes().contains(mcoords); @@ -5653,7 +5660,7 @@ public String getHexTooltip(MouseEvent e) { // The exception is auto hits. There will be an icon for auto // hits, so we need to draw a tooltip if (!shd.isObscured(localPlayer) - && (shd.drawNow(currPhase, round, localPlayer) + && (shd.drawNow(game.getPhase(), round, localPlayer) || (isHexAutoHit && isTypeAutoHit))) { if (shd.getType() == SpecialHexDisplay.Type.PLAYER_NOTE) { if (localPlayer.equals(shd.getOwner())) { diff --git a/megamek/src/megamek/client/ui/swing/boardview/EntitySprite.java b/megamek/src/megamek/client/ui/swing/boardview/EntitySprite.java index c303fd95c20..7ca95d738dc 100644 --- a/megamek/src/megamek/client/ui/swing/boardview/EntitySprite.java +++ b/megamek/src/megamek/client/ui/swing/boardview/EntitySprite.java @@ -18,25 +18,17 @@ */ package megamek.client.ui.swing.boardview; -import java.awt.AlphaComposite; -import java.awt.BasicStroke; -import java.awt.Color; -import java.awt.Font; -import java.awt.Graphics2D; -import java.awt.GraphicsConfiguration; -import java.awt.GraphicsEnvironment; -import java.awt.Image; -import java.awt.Point; -import java.awt.Rectangle; -import java.awt.Stroke; -import java.awt.Transparency; -import java.util.*; +import megamek.MMConstants; import megamek.client.ui.Messages; import megamek.client.ui.swing.GUIPreferences; import megamek.client.ui.swing.util.EntityWreckHelper; import megamek.common.*; import megamek.common.annotations.Nullable; -import megamek.common.enums.GamePhase; + +import java.awt.*; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Set; /** * Sprite for an entity. Changes whenever the entity changes. Consists of an @@ -225,7 +217,7 @@ private void updateLabel() { } int face = (entity.isCommander() && !onlyDetectedBySensors()) ? Font.ITALIC : Font.PLAIN; - labelFont = new Font("SansSerif", face, (int) (10 * Math.max(bv.scale, 0.9))); + labelFont = new Font(MMConstants.FONT_SANS_SERIF, face, (int) (10 * Math.max(bv.scale, 0.9))); // Check the hexes in directions 2, 5, 1, 4 if they are free of entities // and place the label in the direction of the first free hex @@ -358,8 +350,8 @@ private void drawStatusStrings(Graphics2D g, ArrayList statusStrings) { // When zoomed far out, status wouldn't be readable, therefore // draw a big "!" (and the label is red) - if (bv.scale < 0.55 && criticalStatus) { - Font bigFont = new Font("SansSerif", Font.BOLD, (int) (42 * bv.scale)); + if ((bv.scale < 0.55) && criticalStatus) { + Font bigFont = new Font(MMConstants.FONT_SANS_SERIF, Font.BOLD, (int) (42 * bv.scale)); g.setFont(bigFont); Point pos = new Point(bv.hex_size.width / 2, bv.hex_size.height / 2); bv.drawTextShadow(g, "!", pos, bigFont); @@ -368,7 +360,7 @@ private void drawStatusStrings(Graphics2D g, ArrayList statusStrings) { } // Critical status text - Font boldFont = new Font("SansSerif",Font.BOLD,(int) (12 * bv.scale)); + Font boldFont = new Font(MMConstants.FONT_SANS_SERIF, Font.BOLD, (int) (12 * bv.scale)); g.setFont(boldFont); int y = (int) (bv.hex_size.height * 0.6); for (Status curStatus: statusStrings) { @@ -704,7 +696,7 @@ public void prepare() { && !((Infantry) entity).isTakingCover()) && !(isAero && ((IAero) entity).isSpheroid() && !board.inSpace())) { // Indicate a stacked unit with the same facing that can still move - if (shouldIndicateNotDone() && (bv.game.getPhase() == GamePhase.MOVEMENT)) { + if (shouldIndicateNotDone() && bv.game.getPhase().isMovement()) { var tr = graph.getTransform(); // rotate the arrow slightly graph.scale(1 / bv.scale, 1 / bv.scale); @@ -717,7 +709,7 @@ public void prepare() { graph.setTransform(tr); } - if (!entity.isDone() && (bv.game.getPhase() == GamePhase.MOVEMENT)) { + if (!entity.isDone() && bv.game.getPhase().isMovement()) { graph.setColor(GUIPreferences.getInstance().getWarningColor()); graph.fill(bv.facingPolys[entity.getFacing()]); graph.setColor(Color.WHITE); diff --git a/megamek/src/megamek/client/ui/swing/boardview/FiringSolutionSprite.java b/megamek/src/megamek/client/ui/swing/boardview/FiringSolutionSprite.java index 2826aae155d..00786b81c4d 100644 --- a/megamek/src/megamek/client/ui/swing/boardview/FiringSolutionSprite.java +++ b/megamek/src/megamek/client/ui/swing/boardview/FiringSolutionSprite.java @@ -97,18 +97,15 @@ public void prepare() { graph.scale(bv.scale, bv.scale); // get the right font - String fontName = GUIPreferences.getInstance().getString( - GUIPreferences.ADVANCED_MOVE_FONT_TYPE); - int fontStyle = GUIPreferences.getInstance().getInt( - GUIPreferences.ADVANCED_MOVE_FONT_STYLE); + String fontName = GUIPreferences.getInstance().getString(GUIPreferences.ADVANCED_MOVE_FONT_TYPE); + int fontStyle = GUIPreferences.getInstance().getInt(GUIPreferences.ADVANCED_MOVE_FONT_STYLE); if (noHitPossible) { // write big red X graph.setFont(new Font(fontName, fontStyle, fontSizeLarge)); if (bv.scale > 0.7) { // better translucent, the X is so big - bv.drawOutlineText(graph, "X", centerHex, - fontSizeLarge, xColor, true, Color.BLACK); + bv.drawOutlineText(graph, "X", centerHex, fontSizeLarge, xColor, true, Color.BLACK); } else { // better readable at small scale bv.drawCenteredText(graph, "X", centerHex, xColor, false); diff --git a/megamek/src/megamek/client/ui/swing/boardview/FovHighlightingAndDarkening.java b/megamek/src/megamek/client/ui/swing/boardview/FovHighlightingAndDarkening.java index 5af2599ac84..78c10a63b21 100644 --- a/megamek/src/megamek/client/ui/swing/boardview/FovHighlightingAndDarkening.java +++ b/megamek/src/megamek/client/ui/swing/boardview/FovHighlightingAndDarkening.java @@ -3,7 +3,6 @@ import megamek.client.ui.swing.GUIPreferences; import megamek.common.*; import megamek.common.annotations.Nullable; -import megamek.common.enums.GamePhase; import megamek.common.enums.IlluminationLevel; import megamek.common.event.GameListener; import megamek.common.event.GameListenerAdapter; @@ -97,8 +96,7 @@ boolean draw(Graphics boardGraph, Coords c, int drawX, int drawY, boolean saveBo boolean highlight = gs.getBoolean(GUIPreferences.FOV_HIGHLIGHT); boolean darken = gs.getBoolean(GUIPreferences.FOV_DARKEN); - if ((darken || highlight) - && (this.boardView1.game.getPhase() == GamePhase.MOVEMENT)) { + if ((darken || highlight) && this.boardView1.game.getPhase().isMovement()) { final int pad = 0; final int lw = 7; diff --git a/megamek/src/megamek/client/ui/swing/boardview/GhostEntitySprite.java b/megamek/src/megamek/client/ui/swing/boardview/GhostEntitySprite.java index 2b8ccda5fbf..514a4b47df5 100644 --- a/megamek/src/megamek/client/ui/swing/boardview/GhostEntitySprite.java +++ b/megamek/src/megamek/client/ui/swing/boardview/GhostEntitySprite.java @@ -1,13 +1,12 @@ package megamek.client.ui.swing.boardview; -import java.awt.Font; -import java.awt.Graphics; -import java.awt.Rectangle; -import java.awt.image.ImageObserver; - +import megamek.MMConstants; import megamek.common.Entity; import megamek.common.util.ImageUtil; +import java.awt.*; +import java.awt.image.ImageObserver; + class GhostEntitySprite extends Sprite { private Entity entity; @@ -19,7 +18,7 @@ public GhostEntitySprite(BoardView boardView1, final Entity entity) { this.entity = entity; String shortName = entity.getShortName(); - Font font = new Font("SansSerif", Font.PLAIN, 10); + Font font = new Font(MMConstants.FONT_SANS_SERIF, Font.PLAIN, 10); modelRect = new Rectangle(47, 55, bv.getFontMetrics(font).stringWidth( shortName) + 1, bv.getFontMetrics(font).getAscent()); Rectangle tempBounds = new Rectangle(bv.hex_size).union(modelRect); diff --git a/megamek/src/megamek/client/ui/swing/boardview/IsometricSprite.java b/megamek/src/megamek/client/ui/swing/boardview/IsometricSprite.java index dd5a52053a2..0815c5eab3a 100644 --- a/megamek/src/megamek/client/ui/swing/boardview/IsometricSprite.java +++ b/megamek/src/megamek/client/ui/swing/boardview/IsometricSprite.java @@ -1,5 +1,6 @@ package megamek.client.ui.swing.boardview; +import megamek.MMConstants; import megamek.client.ui.swing.GUIPreferences; import megamek.client.ui.swing.util.EntityWreckHelper; import megamek.common.Coords; @@ -28,7 +29,7 @@ public IsometricSprite(BoardView boardView1, Entity entity, int secondaryPos, Im this.radarBlipImage = radarBlipImage; this.secondaryPos = secondaryPos; String shortName = entity.getShortName(); - Font font = new Font("SansSerif", Font.PLAIN, 10); + Font font = new Font(MMConstants.FONT_SANS_SERIF, Font.PLAIN, 10); modelRect = new Rectangle(47, 55, bv.getFontMetrics(font).stringWidth( shortName) + 1, bv.getFontMetrics(font).getAscent()); diff --git a/megamek/src/megamek/client/ui/swing/boardview/IsometricWreckSprite.java b/megamek/src/megamek/client/ui/swing/boardview/IsometricWreckSprite.java index 33409fd0ca4..ecd75e59e73 100644 --- a/megamek/src/megamek/client/ui/swing/boardview/IsometricWreckSprite.java +++ b/megamek/src/megamek/client/ui/swing/boardview/IsometricWreckSprite.java @@ -1,28 +1,24 @@ /* * MegaMek - Copyright (C) 2020 - The MegaMek Team * - * 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 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. + * 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. */ - package megamek.client.ui.swing.boardview; -import java.awt.AlphaComposite; -import java.awt.Font; -import java.awt.Graphics; -import java.awt.Graphics2D; -import java.awt.Rectangle; -import java.awt.image.ImageObserver; - +import megamek.MMConstants; import megamek.common.Entity; +import java.awt.*; +import java.awt.image.ImageObserver; + /** * Sprite for an wreck. Consists of an image, drawn from the Tile Manager * and an identification label. @@ -39,27 +35,21 @@ public IsometricWreckSprite(BoardView boardView1, final Entity entity, int secon String shortName = entity.getShortName(); - Font font = new Font("SansSerif", Font.PLAIN, 10); + Font font = new Font(MMConstants.FONT_SANS_SERIF, Font.PLAIN, 10); modelRect = new Rectangle(47, 55, bv.getFontMetrics(font).stringWidth( shortName) + 1, bv.getFontMetrics(font).getAscent()); image = null; } - /** - * - */ @Override - public void drawOnto(Graphics g, int x, int y, ImageObserver observer, - boolean makeTranslucent) { + public void drawOnto(Graphics g, int x, int y, ImageObserver observer, boolean makeTranslucent) { if (isReady()) { Graphics2D g2 = (Graphics2D) g; if (makeTranslucent) { - g2.setComposite(AlphaComposite.getInstance( - AlphaComposite.SRC_OVER, 0.35f)); + g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.35f)); g2.drawImage(image, x, y, observer); - g2.setComposite(AlphaComposite.getInstance( - AlphaComposite.SRC_OVER, 1.0f)); + g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 1.0f)); } else { g.drawImage(image, x, y, observer); } @@ -71,5 +61,4 @@ public void drawOnto(Graphics g, int x, int y, ImageObserver observer, public Entity getEntity() { return entity; } - } diff --git a/megamek/src/megamek/client/ui/swing/boardview/KeyBindingsOverlay.java b/megamek/src/megamek/client/ui/swing/boardview/KeyBindingsOverlay.java index fd1d40496d0..0917070cb88 100644 --- a/megamek/src/megamek/client/ui/swing/boardview/KeyBindingsOverlay.java +++ b/megamek/src/megamek/client/ui/swing/boardview/KeyBindingsOverlay.java @@ -13,20 +13,7 @@ */ package megamek.client.ui.swing.boardview; -import java.awt.AlphaComposite; -import java.awt.Color; -import java.awt.Composite; -import java.awt.Font; -import java.awt.FontMetrics; -import java.awt.Graphics; -import java.awt.Graphics2D; -import java.awt.Image; -import java.awt.Rectangle; -import java.awt.event.KeyEvent; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - +import megamek.MMConstants; import megamek.client.ui.IDisplayable; import megamek.client.ui.Messages; import megamek.client.ui.swing.ClientGUI; @@ -44,6 +31,14 @@ import megamek.common.util.ImageUtil; import org.apache.logging.log4j.LogManager; +import java.awt.*; +import java.awt.event.KeyEvent; +import java.awt.font.TextAttribute; +import java.text.AttributedString; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + /** * An overlay for the Boardview that displays a selection of keybinds * for the current game situation @@ -51,7 +46,7 @@ * @author SJuliez */ public class KeyBindingsOverlay implements IDisplayable, IPreferenceChangeListener { - private static final Font FONT = new Font("SansSerif", Font.PLAIN, 13); + private static final Font FONT = new Font(MMConstants.FONT_SANS_SERIF, Font.PLAIN, 13); private static final int DIST_TOP = 30; private static final int DIST_SIDE = 30; private static final int PADDING_X = 10; @@ -65,17 +60,19 @@ public class KeyBindingsOverlay implements IDisplayable, IPreferenceChangeListen private static final List BINDS_FIRE = Arrays.asList( KeyCommandBind.NEXT_WEAPON, KeyCommandBind.PREV_WEAPON, + KeyCommandBind.UNDO_LAST_STEP, KeyCommandBind.NEXT_TARGET, KeyCommandBind.NEXT_TARGET_VALID, KeyCommandBind.NEXT_TARGET_NOALLIES, KeyCommandBind.NEXT_TARGET_VALID_NO_ALLIES - ); + ); /** The keybinds to be shown during the movement phase */ private static final List BINDS_MOVE = Arrays.asList( KeyCommandBind.TOGGLE_MOVEMODE, + KeyCommandBind.UNDO_LAST_STEP, KeyCommandBind.TOGGLE_CONVERSIONMODE - ); + ); /** The keybinds to be shown in all phases during the local player's turn */ private static final List BINDS_MY_TURN = Arrays.asList( @@ -84,19 +81,19 @@ public class KeyBindingsOverlay implements IDisplayable, IPreferenceChangeListen KeyCommandBind.NEXT_UNIT, KeyCommandBind.PREV_UNIT, KeyCommandBind.CENTER_ON_SELECTED - ); + ); /** The keybinds to be shown in all phases during any player's turn */ private static final List BINDS_ANY_TURN = Arrays.asList( KeyCommandBind.TOGGLE_CHAT, KeyCommandBind.DRAW_LABELS, KeyCommandBind.HEX_COORDS - ); + ); /** The keybinds to be shown in the Board Editor */ private static final List BINDS_BOARD_EDITOR = Arrays.asList( KeyCommandBind.HEX_COORDS - ); + ); private static final List ADDTL_BINDS = Arrays.asList( Messages.getString("KeyBindingsDisplay.fixedBinds").split("\n")); @@ -106,6 +103,7 @@ public class KeyBindingsOverlay implements IDisplayable, IPreferenceChangeListen ClientGUI clientGui; + private static final GUIPreferences GUIP = GUIPreferences.getInstance(); /** True when the overlay is displayed or fading in. */ private boolean visible; @@ -127,11 +125,12 @@ public class KeyBindingsOverlay implements IDisplayable, IPreferenceChangeListen * for the current game situation. */ public KeyBindingsOverlay(Game game, ClientGUI cg) { - visible = GUIPreferences.getInstance().getBoolean(GUIPreferences.SHOW_KEYBINDS_OVERLAY); + visible = GUIP.getBoolean(GUIPreferences.SHOW_KEYBINDS_OVERLAY); currentPhase = game.getPhase(); game.addGameListener(gameListener); clientGui = cg; KeyBindParser.addPreferenceChangeListener(this); + GUIP.addPreferenceChangeListener(this); } @Override @@ -146,12 +145,13 @@ public void draw(Graphics graph, Rectangle clipBounds) { changed = false; // calculate the size from the text lines, font and padding - graph.setFont(FONT); - FontMetrics fm = graph.getFontMetrics(FONT); + Font newFont = FONT.deriveFont(FONT.getSize() * GUIP.getGUIScale()); + graph.setFont(newFont); + FontMetrics fm = graph.getFontMetrics(newFont); List allLines = assembleTextLines(); Rectangle r = getSize(graph, allLines, fm); r = new Rectangle(r.width + 2 * PADDING_X, r.height + 2 * PADDING_Y); - + displayImage = ImageUtil.createAcceleratedImage(r.width, r.height); Graphics intGraph = displayImage.getGraphics(); GUIPreferences.AntiAliasifSet(intGraph); @@ -190,6 +190,10 @@ private Rectangle getSize(Graphics graph, List lines, FontMetrics fm) { int width = 0; for (String line: lines) { if (fm.stringWidth(line) > width) { + if (line.startsWith("#") && line.length() > 7) { + line = line.substring(7); + } + width = fm.stringWidth(line); } } @@ -267,15 +271,21 @@ private void drawShadowedString(Graphics graph, String s, int x, int y) { int grn = Integer.parseInt(s.substring(3, 5), 16); int blu = Integer.parseInt(s.substring(5, 7), 16); textColor = new Color(red, grn, blu); - } catch (Exception e) { - LogManager.getLogger().error("", e); + } catch (Exception ex) { + LogManager.getLogger().error("", ex); } s = s.substring(7); } - graph.setColor(SHADOW_COLOR); - graph.drawString(s, x + 1, y + 1); - graph.setColor(textColor); - graph.drawString(s, x, y); + + if (s.length() > 0) { + AttributedString text = new AttributedString(s); + text.addAttribute(TextAttribute.FONT, new Font(FONT.getFontName(), Font.PLAIN, (int) (FONT.getSize() * GUIP.getGUIScale())), 0, s.length()); + + graph.setColor(SHADOW_COLOR); + graph.drawString(text.getIterator(), x + 1, y + 1); + graph.setColor(textColor); + graph.drawString(text.getIterator(), x, y); + } } /** @@ -285,7 +295,7 @@ private void drawShadowedString(Graphics graph, String s, int x, int y) { * */ public void setVisible(boolean vis) { visible = vis; - GUIPreferences.getInstance().setValue(GUIPreferences.SHOW_KEYBINDS_OVERLAY, vis); + GUIP.setValue(GUIPreferences.SHOW_KEYBINDS_OVERLAY, vis); if (vis) { fadingIn = true; fadingOut = false; @@ -341,9 +351,8 @@ public void gameTurnChange(GameTurnChangeEvent e) { @Override public void preferenceChange(PreferenceChangeEvent e) { - if (e.getName().equals(KeyBindParser.KEYBINDS_CHANGED)) { - changed = true; - } + // change on any preference change + changed = true; } } diff --git a/megamek/src/megamek/client/ui/swing/boardview/MovingEntitySprite.java b/megamek/src/megamek/client/ui/swing/boardview/MovingEntitySprite.java index 7b94c38a295..58142c3eda8 100644 --- a/megamek/src/megamek/client/ui/swing/boardview/MovingEntitySprite.java +++ b/megamek/src/megamek/client/ui/swing/boardview/MovingEntitySprite.java @@ -1,18 +1,13 @@ package megamek.client.ui.swing.boardview; -import java.awt.AlphaComposite; -import java.awt.Dimension; -import java.awt.Font; -import java.awt.Graphics; -import java.awt.Graphics2D; -import java.awt.Image; -import java.awt.Rectangle; -import java.awt.image.ImageObserver; - +import megamek.MMConstants; import megamek.common.Coords; import megamek.common.Entity; import megamek.common.util.ImageUtil; +import java.awt.*; +import java.awt.image.ImageObserver; + class MovingEntitySprite extends Sprite { private int facing; @@ -23,17 +18,17 @@ class MovingEntitySprite extends Sprite { private int elevation; - public MovingEntitySprite(BoardView boardView1, final Entity entity, - final Coords position, final int facing, final int elevation) { + public MovingEntitySprite(BoardView boardView1, final Entity entity, final Coords position, + final int facing, final int elevation) { super(boardView1); this.entity = entity; this.facing = facing; this.elevation = elevation; String shortName = entity.getShortName(); - Font font = new Font("SansSerif", Font.PLAIN, 10); - modelRect = new Rectangle(47, 55, bv.getFontMetrics(font).stringWidth( - shortName) + 1, bv.getFontMetrics(font).getAscent()); + Font font = new Font(MMConstants.FONT_SANS_SERIF, Font.PLAIN, 10); + modelRect = new Rectangle(47, 55, bv.getFontMetrics(font).stringWidth(shortName) + 1, + bv.getFontMetrics(font).getAscent()); int altAdjust = 0; if (bv.useIsometric() diff --git a/megamek/src/megamek/client/ui/swing/boardview/PlanetaryConditionsOverlay.java b/megamek/src/megamek/client/ui/swing/boardview/PlanetaryConditionsOverlay.java new file mode 100644 index 00000000000..747a3abc4d6 --- /dev/null +++ b/megamek/src/megamek/client/ui/swing/boardview/PlanetaryConditionsOverlay.java @@ -0,0 +1,400 @@ +/* +* MegaMek - Copyright (C) 2020 - The MegaMek Team +* +* 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. +*/ +package megamek.client.ui.swing.boardview; + +import megamek.client.ui.IDisplayable; +import megamek.client.ui.Messages; +import megamek.client.ui.swing.ClientGUI; +import megamek.client.ui.swing.GUIPreferences; +import megamek.client.ui.swing.util.KeyCommandBind; +import megamek.common.Game; +import megamek.common.KeyBindParser; +import megamek.common.PlanetaryConditions; +import megamek.common.enums.GamePhase; +import megamek.common.event.GameListener; +import megamek.common.event.GameListenerAdapter; +import megamek.common.event.GamePhaseChangeEvent; +import megamek.common.event.GameTurnChangeEvent; +import megamek.common.preference.IPreferenceChangeListener; +import megamek.common.preference.PreferenceChangeEvent; +import megamek.common.util.ImageUtil; +import org.apache.logging.log4j.LogManager; + +import java.awt.event.KeyEvent; +import java.awt.font.TextAttribute; +import java.text.AttributedString; +import java.text.MessageFormat; +import java.util.ArrayList; +import java.awt.AlphaComposite; +import java.awt.Color; +import java.awt.Composite; +import java.awt.Font; +import java.awt.FontMetrics; +import java.awt.Graphics; +import java.awt.Graphics2D; +import java.awt.Image; +import java.awt.Rectangle; +import java.util.List; + +/** + * An overlay for the Boardview that displays a selection of Planetary Conditions + * for the current game situation + * + * + */ +public class PlanetaryConditionsOverlay implements IDisplayable, IPreferenceChangeListener { + private static final Font FONT = new Font("SansSerif", Font.PLAIN, 13); + private static final int DIST_TOP = 30; + private int distSide = 500; + private int overlayWidth = 500; + private static final int PADDING_X = 10; + private static final int PADDING_Y = 5; + private static final Color SHADOW_COLOR = Color.DARK_GRAY; + private static final float FADE_SPEED = 0.2f; + + ClientGUI clientGui; + private static final GUIPreferences GUIP = GUIPreferences.getInstance(); + + /** True when the overlay is displayed or fading in. */ + private boolean visible; + /** True indicates the strings should be redrawn. */ + private boolean changed = true; + /** The cached image for this Display. */ + Image displayImage; + /** The current game phase. */ + GamePhase currentPhase; + + Game currentGame; + /** True while fading in this overlay. */ + private boolean fadingIn = false; + /** True while fading out this overlay. */ + private boolean fadingOut = false; + /** The transparency of the overlay. Only used while fading in/out. */ + private float alpha = 1; + + private static final String MSG_HEADING = Messages.getString("PlanetaryConditionsOverlay.heading"); + private static final String MSG_TEMPERATURE = Messages.getString("PlanetaryConditionsOverlay.Temperature"); + private static final String MSG_GRAVITY = Messages.getString("PlanetaryConditionsOverlay.Gravity"); + private static final String MSG_LIGHT = Messages.getString("PlanetaryConditionsOverlay.Light"); + private static final String MSG_ATMOSPHERICPREASSURE = Messages.getString("PlanetaryConditionsOverlay.AtmosphericPressure"); + private static final String MSG_EMI = Messages.getString("PlanetaryConditionsOverlay.EMI"); + private static final String MSG_WEATHER = Messages.getString("PlanetaryConditionsOverlay.Weather"); + private static final String MSG_WIND = Messages.getString("PlanetaryConditionsOverlay.Wind"); + private static final String MSG_DIRECTION = Messages.getString("PlanetaryConditionsOverlay.WindDirection"); + private static final String MSG_FOG = Messages.getString("PlanetaryConditionsOverlay.Fog"); + private static final String MSG_BLOWINGSAND = Messages.getString("PlanetaryConditionsOverlay.BlowingSand"); + + /** + * An overlay for the Boardview that displays a selection of Planetary Conditions + * for the current game situation. + */ + public PlanetaryConditionsOverlay(Game game, ClientGUI cg) { + visible = GUIP.getBoolean(GUIPreferences.SHOW_PLANETARYCONDITIONS_OVERLAY); + currentGame = game; + currentPhase = game.getPhase(); + game.addGameListener(gameListener); + clientGui = cg; + KeyBindParser.addPreferenceChangeListener(this); + GUIP.addPreferenceChangeListener(this); + } + + @Override + public void draw(Graphics graph, Rectangle clipBounds) { + if (!visible && !isSliding()) { + return; + } + + if ((clientGui == null) || (currentGame == null)) { + return; + } + + // At startup, phase and turn change and when the Planetary Conditions change, + // the cached image is (re)created + if (changed) { + changed = false; + + // calculate the size from the text lines, font and padding + Font newFont = FONT.deriveFont(FONT.getSize() * GUIP.getGUIScale()); + graph.setFont(newFont); + FontMetrics fm = graph.getFontMetrics(newFont); + List allLines = assembleTextLines(); + Rectangle r = getSize(graph, allLines, fm); + r = new Rectangle(r.width + 2 * PADDING_X, r.height + 2 * PADDING_Y); + overlayWidth = r.width; + + displayImage = ImageUtil.createAcceleratedImage(r.width, r.height); + Graphics intGraph = displayImage.getGraphics(); + GUIPreferences.AntiAliasifSet(intGraph); + + // draw a semi-transparent background rectangle + Color colorBG = GUIP.getPlanetaryConditionsColorBackground(); + intGraph.setColor(new Color(colorBG.getRed(), colorBG.getGreen(), colorBG.getBlue(), 200)); + intGraph.fillRoundRect(0, 0, r.width, r.height, PADDING_X, PADDING_X); + + // The coordinates to write the texts to + int x = PADDING_X; + int y = PADDING_Y + fm.getAscent(); + + // write the strings + for (String line: allLines) { + drawShadowedString(intGraph, line, x, y); + y += fm.getHeight(); + } + } + + distSide = clientGui.getWidth() - (overlayWidth + 100); + + // draw the cached image to the boardview + // uses Composite to draw the image with variable transparency + if (alpha < 1) { + // Save the former composite and set an alpha blending composite + Composite saveComp = ((Graphics2D) graph).getComposite(); + int type = AlphaComposite.SRC_OVER; + ((Graphics2D) graph).setComposite(AlphaComposite.getInstance(type, alpha)); + graph.drawImage(displayImage, clipBounds.x + distSide, clipBounds.y + DIST_TOP, null); + ((Graphics2D) graph).setComposite(saveComp); + } else { + graph.drawImage(displayImage, clipBounds.x + distSide, clipBounds.y + DIST_TOP, null); + } + } + + /** Calculates the pixel size of the display from the necessary text lines. */ + private Rectangle getSize(Graphics graph, List lines, FontMetrics fm) { + int width = 0; + for (String line: lines) { + if (fm.stringWidth(line) > width) { + if (line.startsWith("#") && line.length() > 7) { + line = line.substring(7); + } + + width = fm.stringWidth(line); + } + } + int height = fm.getHeight() * lines.size(); + return new Rectangle(width, height); + } + + /** Returns an ArrayList of all text lines to be shown. */ + private List assembleTextLines() { + List result = new ArrayList<>(); + + Color colorTitle = GUIP.getPlanetaryConditionsColorTitle(); + Color colorHot = GUIP.getPlanetaryConditionsColorHot(); + Color colorCold = GUIP.getPlanetaryConditionsColorCold(); + + KeyCommandBind kcb = KeyCommandBind.PLANETARY_CONDITIONS; + String mod = KeyEvent.getModifiersExText(kcb.modifiers); + String key = KeyEvent.getKeyText(kcb.key); + String toggleKey = (mod.isEmpty() ? "" : mod + "+") + key; + + String tmpStr = ""; + Boolean showHeading = GUIP.getAdvancedPlanetaryConditionsShowHeader(); + tmpStr = (showHeading ? String.format("#%02X%02X%02X", colorTitle.getRed(), colorTitle.getGreen(), colorTitle.getBlue()) + MessageFormat.format(MSG_HEADING, toggleKey) : ""); + + if (tmpStr.length() > 0) { + result.add(tmpStr); + } + + if (clientGui != null && !currentGame.getBoard().inSpace()) { + // In a game, not the Board Editor + + String tempColor = ""; + int temp = currentGame.getPlanetaryConditions().getTemperature(); + + if (currentGame.getPlanetaryConditions().isExtremeTemperatureHeat()) { + tempColor = String.format("#%02X%02X%02X", colorHot.getRed(), colorHot.getGreen(), colorHot.getBlue()); + } else if (currentGame.getPlanetaryConditions().isExtremeTemperatureCold()) { + tempColor = String.format("#%02X%02X%02X", colorCold.getRed(), colorCold.getGreen(), colorCold.getBlue()); + } + + boolean showDefaultConditions = GUIP.getAdvancedPlanetaryConditionsShowDefaults(); + + Boolean showLabel = GUIP.getAdvancedPlanetaryConditionsShowLabels(); + Boolean showValue = GUIP.getAdvancedPlanetaryConditionsShowValues(); + Boolean showIndicator = GUIP.getAdvancedPlanetaryConditionsShowIndicators(); + + + if (((showDefaultConditions) || ((!showDefaultConditions) && (currentGame.getPlanetaryConditions().isExtremeTemperature())))) { + tmpStr = (showLabel ? MSG_TEMPERATURE + " " : ""); + tmpStr = tmpStr + (showValue ? temp + "\u00B0C " : ""); + tmpStr = tmpStr + (showIndicator ? (!showValue ? temp + "\u00B0C " : "" ) + currentGame.getPlanetaryConditions().getTemperatureIndicator() : ""); + result.add(tempColor + tmpStr); + } + + if (((showDefaultConditions) || ((!showDefaultConditions) && (currentGame.getPlanetaryConditions().getGravity() != 1.0)))) { + float grav = currentGame.getPlanetaryConditions().getGravity(); + tmpStr = (showLabel ? MSG_GRAVITY + " " : ""); + tmpStr = tmpStr + (showValue ? grav + "g " : ""); + tmpStr = tmpStr + (showIndicator ? (!showValue ? grav + "g " : "") + currentGame.getPlanetaryConditions().getGravityIndicator() : ""); + result.add(tmpStr); + } + + if (((showDefaultConditions) || ((!showDefaultConditions) && (currentGame.getPlanetaryConditions().getLight() != PlanetaryConditions.L_DAY)))) { + tmpStr = (showLabel ? MSG_LIGHT + " " : ""); + tmpStr = tmpStr + (showValue ? currentGame.getPlanetaryConditions().getLightDisplayableName() + " " : ""); + tmpStr = tmpStr + (showIndicator ? currentGame.getPlanetaryConditions().getLightIndicator() : ""); + result.add(tmpStr); + } + + if (((showDefaultConditions) || ((!showDefaultConditions) && (currentGame.getPlanetaryConditions().getAtmosphere() != PlanetaryConditions.ATMO_STANDARD)))) { + tmpStr = (showLabel ? MSG_ATMOSPHERICPREASSURE + " " : ""); + tmpStr = tmpStr + (showValue ? currentGame.getPlanetaryConditions().getAtmosphereDisplayableName() + " " : ""); + tmpStr = tmpStr + (showIndicator ? currentGame.getPlanetaryConditions().getAtmosphereIndicator() : ""); + result.add(tmpStr); + } + + if (((showDefaultConditions) || ((!showDefaultConditions) && (currentGame.getPlanetaryConditions().hasEMI())))) { + tmpStr = (showLabel ? MSG_EMI + " " : ""); + tmpStr = tmpStr + (showValue ? currentGame.getPlanetaryConditions().getEMIDisplayableValue() + " " : ""); + tmpStr = tmpStr + (showIndicator ? currentGame.getPlanetaryConditions().getEMIIndicator() : ""); + result.add(tmpStr); + } + + if (((showDefaultConditions) || ((!showDefaultConditions) && (currentGame.getPlanetaryConditions().getWeather() != PlanetaryConditions.WE_NONE)))) { + tmpStr = (showLabel ? MSG_WEATHER + " " : ""); + tmpStr = tmpStr + (showValue ? currentGame.getPlanetaryConditions().getWeatherDisplayableName() + " " : ""); + tmpStr = tmpStr + (showIndicator ? currentGame.getPlanetaryConditions().getWeatherIndicator() : ""); + result.add(tmpStr); + } + + if (((showDefaultConditions) || ((!showDefaultConditions) && (currentGame.getPlanetaryConditions().getWindStrength() != PlanetaryConditions.WI_NONE)))) { + tmpStr = (showLabel ? MSG_WIND + " " : ""); + tmpStr = tmpStr + (showValue ? currentGame.getPlanetaryConditions().getWindDisplayableName() + " " : ""); + tmpStr = tmpStr + (showIndicator ? currentGame.getPlanetaryConditions().getWindStrengthIndicator() : ""); + result.add(tmpStr); + tmpStr = (showLabel ? MSG_DIRECTION + " " : ""); + tmpStr = tmpStr + (showValue ? currentGame.getPlanetaryConditions().getWindDirDisplayableName() + " " : ""); + tmpStr = tmpStr + (showIndicator ? currentGame.getPlanetaryConditions().getWindDirectionIndicator() : ""); + result.add(tmpStr); + } + + if (((showDefaultConditions) || ((!showDefaultConditions) && (currentGame.getPlanetaryConditions().getFog() != PlanetaryConditions.FOG_NONE)))) { + tmpStr = (showLabel ? MSG_FOG + " " : ""); + tmpStr = tmpStr + (showValue ? currentGame.getPlanetaryConditions().getFogDisplayableName() + " " : ""); + tmpStr = tmpStr + (showIndicator ? currentGame.getPlanetaryConditions().getFogIndicator() : ""); + result.add(tmpStr); + } + + if (((showDefaultConditions) || ((!showDefaultConditions) && (currentGame.getPlanetaryConditions().isSandBlowing())))) { + tmpStr = (showLabel ? MSG_BLOWINGSAND + " " : ""); + tmpStr = tmpStr + (showValue ? currentGame.getPlanetaryConditions().getSandBlowingDisplayableValue() + " " : ""); + tmpStr = tmpStr + (showIndicator ? currentGame.getPlanetaryConditions().getSandBlowingIndicator() : ""); + result.add(tmpStr); + } + } + + return result; + } + + /** + * Draws the String s to the Graphics graph at position x, y + * with a shadow. If the string starts with #789ABC then 789ABC + * is converted to a color to write the rest of the text, + * otherwise TEXT_COLOR is used. + */ + private void drawShadowedString(Graphics graph, String s, int x, int y) { + Color textColor = GUIP.getPlanetaryConditionsColorText(); + // Extract a color code from the start of the string + // used to display headlines if it's there + if (s.startsWith("#") && s.length() > 7) { + try { + int red = Integer.parseInt(s.substring(1, 3), 16); + int grn = Integer.parseInt(s.substring(3, 5), 16); + int blu = Integer.parseInt(s.substring(5, 7), 16); + textColor = new Color(red, grn, blu); + } catch (Exception e) { + LogManager.getLogger().error("", e); + } + s = s.substring(7); + } + + if (s.length() > 0) { + AttributedString text = new AttributedString(s); + text.addAttribute(TextAttribute.FONT, new Font(FONT.getFontName(), Font.PLAIN, (int) (FONT.getSize() * GUIP.getGUIScale())), 0, s.length()); + + graph.setColor(SHADOW_COLOR); + graph.drawString(text.getIterator(), x + 1, y + 1); + graph.setColor(textColor); + graph.drawString(text.getIterator(), x, y); + } + } + + /** + * Activates or deactivates the overlay, fading it in or out. + * Also saves the visibility to the GUIPreferences so + * MegaMek remembers it. + * */ + public void setVisible(boolean vis) { + visible = vis; + GUIP.setValue(GUIPreferences.SHOW_PLANETARYCONDITIONS_OVERLAY, vis); + if (vis) { + fadingIn = true; + fadingOut = false; + } else { + fadingIn = false; + fadingOut = true; + } + } + + public boolean isVisible() { + return visible; + } + + @Override + public boolean isSliding() { + return fadingOut || fadingIn; + } + + @Override + public boolean slide() { + if (fadingIn) { + alpha += FADE_SPEED; + if (alpha > 1) { + alpha = 1; + fadingIn = false; + } + return true; + } else if (fadingOut) { + alpha -= FADE_SPEED; + if (alpha < 0) { + alpha = 0; + fadingOut = false; + } + return true; + } + return false; + } + + /** Detects phase and turn changes to display Planetary Conditions. */ + private GameListener gameListener = new GameListenerAdapter() { + @Override + public void gamePhaseChange(GamePhaseChangeEvent e) { + currentPhase = e.getNewPhase(); + changed = true; + } + + @Override + public void gameTurnChange(GameTurnChangeEvent e) { + // The active player has changed + changed = true; + } + }; + + @Override + public void preferenceChange(PreferenceChangeEvent e) { + // change on any preference change + changed = true; + } + +} diff --git a/megamek/src/megamek/client/ui/swing/boardview/StepSprite.java b/megamek/src/megamek/client/ui/swing/boardview/StepSprite.java index 669ca4361a7..39e37f17ad1 100644 --- a/megamek/src/megamek/client/ui/swing/boardview/StepSprite.java +++ b/megamek/src/megamek/client/ui/swing/boardview/StepSprite.java @@ -13,16 +13,16 @@ */ package megamek.client.ui.swing.boardview; -import java.awt.*; -import java.awt.geom.AffineTransform; -import java.awt.image.BufferedImage; - +import megamek.MMConstants; import megamek.client.ui.Messages; import megamek.client.ui.swing.GUIPreferences; -import megamek.codeUtilities.StringUtility; import megamek.common.*; import megamek.common.MovePath.MoveStepType; +import java.awt.*; +import java.awt.geom.AffineTransform; +import java.awt.image.BufferedImage; + /** * Sprite for a step in a movement path. Only one sprite should exist for * any hex in a path. Contains a colored number, and arrows indicating @@ -256,7 +256,7 @@ public void prepare() { // show new movement mode String mode = Messages.getString("BoardView1.ConversionMode." + step.getMovementMode()); - graph.setFont(new Font("SansSerif", Font.PLAIN, 12)); + graph.setFont(new Font(MMConstants.FONT_SANS_SERIF, Font.PLAIN, 12)); int modeX = 42 - (graph.getFontMetrics(graph.getFont()).stringWidth(mode) / 2); graph.setColor(Color.darkGray); graph.drawString(mode, modeX, modePos - 1); @@ -305,7 +305,7 @@ private void drawAnnouncement(Graphics2D graph, String text, MoveStep step, Colo if (step.isPastDanger()) { text = "(" + text + ")"; } - graph.setFont(new Font("SansSerif", Font.PLAIN, 12)); + graph.setFont(new Font(MMConstants.FONT_SANS_SERIF, Font.PLAIN, 12)); int posX = 42 - (graph.getFontMetrics(graph.getFont()).stringWidth(text) / 2); int posY = 38 + graph.getFontMetrics(graph.getFont()).getHeight(); graph.setColor(Color.darkGray); @@ -323,7 +323,7 @@ private void drawAnnouncement(Graphics2D graph, String text, MoveStep step, Colo private void drawConditions(MoveStep step, Graphics graph, Color col) { if (step.isEvading()) { String evade = Messages.getString("BoardView1.Evade"); - graph.setFont(new Font("SansSerif", Font.PLAIN, 12)); + graph.setFont(new Font(MMConstants.FONT_SANS_SERIF, Font.PLAIN, 12)); int evadeX = 42 - (graph.getFontMetrics(graph.getFont()).stringWidth(evade) / 2); graph.setColor(Color.darkGray); graph.drawString(evade, evadeX, 64); @@ -334,7 +334,7 @@ private void drawConditions(MoveStep step, Graphics graph, Color col) { if (step.isRolled()) { // Announce roll String roll = Messages.getString("BoardView1.Roll"); - graph.setFont(new Font("SansSerif", Font.PLAIN, 12)); + graph.setFont(new Font(MMConstants.FONT_SANS_SERIF, Font.PLAIN, 12)); int rollX = 42 - (graph.getFontMetrics(graph.getFont()).stringWidth(roll) / 2); graph.setColor(Color.darkGray); graph.drawString(roll, rollX, 18); @@ -357,13 +357,12 @@ private void drawActiveVectors(MoveStep step, Graphics graph) { int[] v = step.getVectors(); for (int i = 0; i < 6; i++) { String active = Integer.toString(v[i]); - graph.setFont(new Font("SansSerif", Font.PLAIN, 12)); + graph.setFont(new Font(MMConstants.FONT_SANS_SERIF, Font.PLAIN, 12)); graph.setColor(Color.darkGray); graph.drawString(active, activeXpos[i], activeYpos[i]); graph.setColor(Color.red); graph.drawString(active, activeXpos[i] - 1, activeYpos[i] - 1); } - } @Override @@ -377,13 +376,9 @@ public MoveStep getStep() { } private Font getMovementFont() { - String fontName = GUIPreferences.getInstance().getString( - GUIPreferences.ADVANCED_MOVE_FONT_TYPE); - int fontStyle = GUIPreferences.getInstance().getInt( - GUIPreferences.ADVANCED_MOVE_FONT_STYLE); - int fontSize = GUIPreferences.getInstance().getInt( - GUIPreferences.ADVANCED_MOVE_FONT_SIZE); - + String fontName = GUIPreferences.getInstance().getString(GUIPreferences.ADVANCED_MOVE_FONT_TYPE); + int fontStyle = GUIPreferences.getInstance().getInt(GUIPreferences.ADVANCED_MOVE_FONT_STYLE); + int fontSize = GUIPreferences.getInstance().getInt(GUIPreferences.ADVANCED_MOVE_FONT_SIZE); return new Font(fontName, fontStyle, fontSize); } @@ -394,8 +389,7 @@ private void drawRemainingVelocity(MoveStep step, Graphics graph, boolean shiftF return; } - if (!step.getEntity().isAirborne() - || !step.getEntity().isAero()) { + if (!step.getEntity().isAirborne() || !step.getEntity().isAero()) { return; } @@ -416,7 +410,7 @@ private void drawRemainingVelocity(MoveStep step, Graphics graph, boolean shiftF // Convert the buffer to a String and draw it. String velString = velStringBuf.toString(); - graph.setFont(new Font("SansSerif", Font.PLAIN, 12)); + graph.setFont(new Font(MMConstants.FONT_SANS_SERIF, Font.PLAIN, 12)); int costX = 42; if (shiftFlag) { costX -= (graph.getFontMetrics(graph.getFont()).stringWidth(velString) / 2); @@ -437,7 +431,7 @@ private void drawRemainingVelocity(MoveStep step, Graphics graph, boolean shiftF } String turnString = "<" + step.getNStraight() + ">"; - graph.setFont(new Font("SansSerif", Font.PLAIN, 10)); + graph.setFont(new Font(MMConstants.FONT_SANS_SERIF, Font.PLAIN, 10)); costX = 50; graph.setColor(Color.darkGray); graph.drawString(turnString, costX, 15); diff --git a/megamek/src/megamek/client/ui/swing/boardview/TextMarkerSprite.java b/megamek/src/megamek/client/ui/swing/boardview/TextMarkerSprite.java index b9116dd46cc..e7e0daa5ea9 100644 --- a/megamek/src/megamek/client/ui/swing/boardview/TextMarkerSprite.java +++ b/megamek/src/megamek/client/ui/swing/boardview/TextMarkerSprite.java @@ -1,17 +1,13 @@ package megamek.client.ui.swing.boardview; -import java.awt.Color; -import java.awt.Font; -import java.awt.FontMetrics; -import java.awt.Graphics2D; -import java.awt.Point; -import java.awt.geom.Rectangle2D; - +import megamek.MMConstants; import megamek.client.ui.swing.GUIPreferences; import megamek.common.Coords; +import java.awt.*; +import java.awt.geom.Rectangle2D; + public class TextMarkerSprite extends HexSprite { - private String spriteText; private Color spriteColor; @@ -33,7 +29,7 @@ public void prepare() { // get a big font and test to see which font size will fit // the hex shape - Font textFont = new Font("SansSerif", Font.PLAIN, 1000); + Font textFont = new Font(MMConstants.FONT_SANS_SERIF, Font.PLAIN, 1000); graph.setFont(textFont); FontMetrics fm = graph.getFontMetrics(graph.getFont()); Rectangle2D rect = fm.getStringBounds(spriteText, graph); @@ -50,9 +46,9 @@ public void prepare() { factor = factor * 0.7f; // set the font and draw the text - Font textFontS = new Font("SansSerif", Font.PLAIN, (int) (factor * 1000)); + Font textFontS = new Font(MMConstants.FONT_SANS_SERIF, Font.PLAIN, (int) (factor * 1000)); graph.setFont(textFontS); - Point pos = new Point((int) (bounds.getWidth() / 2),(int) (bounds.getHeight() / 2)); + Point pos = new Point((int) (bounds.getWidth() / 2), (int) (bounds.getHeight() / 2)); bv.drawTextShadow(graph, spriteText, pos, textFontS); bv.drawCenteredText(graph, spriteText, pos, spriteColor, false); } diff --git a/megamek/src/megamek/client/ui/swing/boardview/WreckSprite.java b/megamek/src/megamek/client/ui/swing/boardview/WreckSprite.java index 7a5917ff012..53d164bdf75 100644 --- a/megamek/src/megamek/client/ui/swing/boardview/WreckSprite.java +++ b/megamek/src/megamek/client/ui/swing/boardview/WreckSprite.java @@ -1,24 +1,23 @@ /* * MegaMek - Copyright (C) 2020 - The MegaMek Team * - * 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 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. + * 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. */ - package megamek.client.ui.swing.boardview; -import java.awt.Font; -import java.awt.Rectangle; - +import megamek.MMConstants; import megamek.common.Entity; +import java.awt.*; + /** * Sprite for an wreck. Consists of an image, drawn from the Tile Manager * and an identification label. @@ -31,15 +30,14 @@ public WreckSprite(BoardView boardView1, final Entity entity, int secondaryPos) String shortName = entity.getShortName(); - Font font = new Font("SansSerif", Font.PLAIN, 10); - modelRect = new Rectangle(47, 55, bv.getFontMetrics(font).stringWidth( - shortName) + 1, bv.getFontMetrics(font).getAscent()); + Font font = new Font(MMConstants.FONT_SANS_SERIF, Font.PLAIN, 10); + modelRect = new Rectangle(47, 55, bv.getFontMetrics(font).stringWidth(shortName) + 1, + bv.getFontMetrics(font).getAscent()); Rectangle tempBounds = new Rectangle(bv.hex_size).union(modelRect); if (secondaryPos == -1) { tempBounds.setLocation(bv.getHexLocation(entity.getPosition())); } else { - tempBounds.setLocation(bv.getHexLocation(entity - .getSecondaryPositions().get(secondaryPos))); + tempBounds.setLocation(bv.getHexLocation(entity.getSecondaryPositions().get(secondaryPos))); } bounds = tempBounds; diff --git a/megamek/src/megamek/client/ui/swing/calculationReport/TextCalculationReport.java b/megamek/src/megamek/client/ui/swing/calculationReport/TextCalculationReport.java index d565bd9aa0b..da898dd37cb 100644 --- a/megamek/src/megamek/client/ui/swing/calculationReport/TextCalculationReport.java +++ b/megamek/src/megamek/client/ui/swing/calculationReport/TextCalculationReport.java @@ -18,6 +18,8 @@ */ package megamek.client.ui.swing.calculationReport; +import megamek.MMConstants; + import javax.swing.*; import java.awt.*; import java.util.ArrayList; @@ -131,7 +133,7 @@ public JComponent toJComponent() { final JEditorPane editorPane = new JEditorPane("text/plain", this.toString()); editorPane.setEditable(false); editorPane.setCaretPosition(0); - editorPane.setFont(new Font("Monospaced", Font.PLAIN, editorPane.getFont().getSize())); + editorPane.setFont(new Font(MMConstants.FONT_MONOSPACED, Font.PLAIN, editorPane.getFont().getSize())); return editorPane; } diff --git a/megamek/src/megamek/client/ui/swing/dialog/AbstractUnitSelectorDialog.java b/megamek/src/megamek/client/ui/swing/dialog/AbstractUnitSelectorDialog.java index 66612977503..d66dfd7c039 100644 --- a/megamek/src/megamek/client/ui/swing/dialog/AbstractUnitSelectorDialog.java +++ b/megamek/src/megamek/client/ui/swing/dialog/AbstractUnitSelectorDialog.java @@ -14,12 +14,14 @@ */ package megamek.client.ui.swing.dialog; +import megamek.MMConstants; import megamek.client.ui.Messages; import megamek.client.ui.dialogs.BVDisplayDialog; import megamek.client.ui.models.XTableColumnModel; import megamek.client.ui.panes.EntityViewPane; import megamek.client.ui.swing.GUIPreferences; import megamek.client.ui.swing.UnitLoadingDialog; +import megamek.client.ui.swing.util.UIUtil; import megamek.common.*; import megamek.common.annotations.Nullable; import megamek.common.options.GameOptions; @@ -33,7 +35,9 @@ import javax.swing.event.DocumentListener; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; -import javax.swing.table.*; +import javax.swing.table.AbstractTableModel; +import javax.swing.table.TableColumn; +import javax.swing.table.TableRowSorter; import java.awt.*; import java.awt.event.*; import java.util.List; @@ -76,10 +80,13 @@ public abstract class AbstractUnitSelectorDialog extends JDialog implements Runn protected Map techLevelListToIndex = new HashMap<>(); protected JComboBox comboUnitType = new JComboBox<>(); protected JComboBox comboWeight = new JComboBox<>(); + private JScrollPane techLevelScroll; + private JPanel panelFilterButtons; protected JLabel labelImage = new JLabel(""); //inline to avoid potential null pointer issues protected JTable tableUnits; protected JTextField textFilter; protected EntityViewPane panePreview; + private JPanel selectionPanel; private JSplitPane splitPane; private StringBuffer searchBuffer = new StringBuffer(); @@ -101,6 +108,7 @@ public abstract class AbstractUnitSelectorDialog extends JDialog implements Runn private AdvancedSearchDialog2 advancedSearchDialog2; protected TableRowSorter sorter; + private JScrollPane scrollTableUnits; protected GameOptions gameOptions = null; protected boolean enableYearLimits = false; @@ -173,12 +181,12 @@ private void initComponents() { //region Unit Preview Pane panePreview = new EntityViewPane(frame, null); + panePreview.setMinimumSize(new Dimension(0,0)); + panePreview.setPreferredSize(new Dimension(0,0)); //endregion Unit Preview Pane //region Selection Panel - JPanel selectionPanel = new JPanel(new GridBagLayout()); - selectionPanel.setMinimumSize(new Dimension(500, 500)); - selectionPanel.setPreferredSize(new Dimension(500, 600)); + selectionPanel = new JPanel(new GridBagLayout()); tableUnits = new JTable(unitModel); tableUnits.setColumnModel(unitColumnModel); @@ -199,27 +207,19 @@ private void initComponents() { refreshUnitView(); } }); - for (int i = 0; i < MechTableModel.N_COL; i++) { - TableColumn column = tableUnits.getColumnModel().getColumn(i); - if (i == MechTableModel.COL_CHASSIS) { - column.setPreferredWidth(125); - } else if ((i == MechTableModel.COL_MODEL) || (i == MechTableModel.COL_COST)) { - column.setPreferredWidth(75); - } else if ((i == MechTableModel.COL_WEIGHT) || (i == MechTableModel.COL_BV)) { - column.setPreferredWidth(50); - } else { - column.setPreferredWidth(25); - } + + for (int i = 0; i < unitModel.getColumnCount(); i++) { + tableUnits.getColumnModel().getColumn(i).setPreferredWidth(unitModel.getPreferredWidth(i)); } bvColumn = tableUnits.getColumnModel().getColumn(MechTableModel.COL_BV); pvColumn = tableUnits.getColumnModel().getColumn(MechTableModel.COL_PV); - tableUnits.setFont(new Font("Monospaced", Font.PLAIN, 12)); + tableUnits.setFont(new Font(MMConstants.FONT_MONOSPACED, Font.PLAIN, 12)); togglePV(false); - JScrollPane scrollTableUnits = new JScrollPane(tableUnits); + scrollTableUnits = new JScrollPane(tableUnits); scrollTableUnits.setName("scrollTableUnits"); - scrollTableUnits.setMinimumSize(new Dimension(500, 400)); - scrollTableUnits.setPreferredSize(new Dimension(500, 400)); + + gridBagConstraints.insets = new Insets(5, 0, 0, 0); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 2; gridBagConstraints.fill = GridBagConstraints.BOTH; @@ -228,20 +228,17 @@ private void initComponents() { gridBagConstraints.weighty = 1.0; selectionPanel.add(scrollTableUnits, gridBagConstraints); - JPanel panelFilterButtons = new JPanel(new GridBagLayout()); - panelFilterButtons.setMinimumSize(new Dimension(300, 180)); - panelFilterButtons.setPreferredSize(new Dimension(300, 180)); + panelFilterButtons = new JPanel(new GridBagLayout()); JLabel labelType = new JLabel(Messages.getString("MechSelectorDialog.m_labelType")); labelType.setToolTipText(Messages.getString("MechSelectorDialog.m_labelType.ToolTip")); + gridBagConstraintsWest.insets = new Insets(5, 0, 0, 0); gridBagConstraintsWest.gridx = 0; gridBagConstraintsWest.gridy = 2; panelFilterButtons.add(labelType, gridBagConstraintsWest); listTechLevel.setToolTipText(Messages.getString("MechSelectorDialog.m_labelType.ToolTip")); - JScrollPane techLevelScroll = new JScrollPane(listTechLevel); - techLevelScroll.setMinimumSize(new Dimension(300, 100)); - techLevelScroll.setPreferredSize(new Dimension(300, 100)); + techLevelScroll = new JScrollPane(listTechLevel); gridBagConstraintsWest.gridx = 1; gridBagConstraintsWest.gridy = 2; panelFilterButtons.add(techLevelScroll, gridBagConstraintsWest); @@ -259,8 +256,6 @@ private void initComponents() { weightModel.addElement(Messages.getString("MechSelectorDialog.All")); comboWeight.setModel(weightModel); comboWeight.setName("comboWeight"); - comboWeight.setMinimumSize(new Dimension(300, 27)); - comboWeight.setPreferredSize(new Dimension(300, 27)); comboWeight.addActionListener(this); gridBagConstraintsWest.gridx = 1; gridBagConstraintsWest.gridy = 1; @@ -283,8 +278,6 @@ private void initComponents() { unitTypeModel.addElement(Messages.getString("MechSelectorDialog.SupportVee")); comboUnitType.setModel(unitTypeModel); comboUnitType.setName("comboUnitType"); - comboUnitType.setMinimumSize(new Dimension(300, 27)); - comboUnitType.setPreferredSize(new Dimension(300, 27)); comboUnitType.addActionListener(this); gridBagConstraintsWest.gridx = 1; gridBagConstraintsWest.gridy = 0; @@ -292,8 +285,6 @@ private void initComponents() { textFilter = new JTextField(""); textFilter.setName("textFilter"); - textFilter.setMinimumSize(new Dimension(300, 28)); - textFilter.setPreferredSize(new Dimension(300, 28)); textFilter.getDocument().addDocumentListener(new DocumentListener() { @Override public void changedUpdate(DocumentEvent e) { @@ -312,7 +303,9 @@ public void removeUpdate(DocumentEvent e) { }); gridBagConstraintsWest.gridx = 1; gridBagConstraintsWest.gridy = 3; + gridBagConstraintsWest.fill = GridBagConstraints.HORIZONTAL; panelFilterButtons.add(textFilter, gridBagConstraintsWest); + gridBagConstraintsWest.fill = GridBagConstraints.NONE; JLabel labelFilter = new JLabel(Messages.getString("MechSelectorDialog.m_labelFilter")); labelFilter.setName("labelFilter"); @@ -373,10 +366,13 @@ public void removeUpdate(DocumentEvent e) { selectionPanel.add(panelSearchButtons, gridBagConstraints); //endregion Selection Panel + JScrollPane selectionScrollPane = new JScrollPane(selectionPanel); + JScrollPane previewScrollPane = new JScrollPane(panePreview); + JPanel panelButtons = createButtonsPanel(); splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, true, - selectionPanel, panePreview); + selectionScrollPane, previewScrollPane); splitPane.setResizeWeight(0); gridBagConstraints = new GridBagConstraints(); gridBagConstraints.gridx = gridBagConstraints.gridy = 0; @@ -637,6 +633,10 @@ public void setVisible(boolean visible) { buttonResetSearch.setEnabled(false); filterUnits(); + if (visible) { + adaptToGUIScale(); + } + super.setVisible(visible); } @@ -796,6 +796,29 @@ public int getColumnCount() { return N_COL; } + public int getPreferredWidth(int col) { + switch (col) { + case COL_MODEL: + return 75; + case COL_CHASSIS: + return 125; + case COL_WEIGHT: + return 50; + case COL_BV: + return 25; + case COL_PV: + return 25; + case COL_YEAR: + return 25; + case COL_COST: + return 25; + case COL_LEVEL: + return 25; + default: + return 0; + } + } + @Override public String getColumnName(int column) { switch (column) { @@ -879,4 +902,12 @@ public Object getValueAt(int row, int col) { } } } + + private void adaptToGUIScale() { + UIUtil.adjustDialog(this, UIUtil.FONT_SCALE1); + textFilter.setMinimumSize(new Dimension(UIUtil.scaleForGUI(200), UIUtil.scaleForGUI(28))); + textFilter.setPreferredSize(new Dimension(UIUtil.scaleForGUI(200), UIUtil.scaleForGUI(28))); + techLevelScroll.setMinimumSize(new Dimension(UIUtil.scaleForGUI(300), UIUtil.scaleForGUI(100))); + techLevelScroll.setPreferredSize(new Dimension(UIUtil.scaleForGUI(300), UIUtil.scaleForGUI(100))); + } } diff --git a/megamek/src/megamek/client/ui/swing/dialog/AdvancedSearchDialog2.java b/megamek/src/megamek/client/ui/swing/dialog/AdvancedSearchDialog2.java index cc1d5368a83..e75f58876eb 100644 --- a/megamek/src/megamek/client/ui/swing/dialog/AdvancedSearchDialog2.java +++ b/megamek/src/megamek/client/ui/swing/dialog/AdvancedSearchDialog2.java @@ -21,6 +21,7 @@ import megamek.client.ui.baseComponents.AbstractButtonDialog; import megamek.client.ui.swing.unitSelector.ASAdvancedSearchPanel; import megamek.client.ui.swing.unitSelector.TWAdvancedSearchPanel; +import megamek.client.ui.swing.util.UIUtil; import javax.swing.*; import javax.swing.border.EmptyBorder; @@ -50,6 +51,9 @@ public AdvancedSearchDialog2(JFrame parent, int allowedYear) { @Override public void setVisible(boolean b) { alphaStrikeTab.saveValues(); + if (b) { + adaptToGUIScale(); + } super.setVisible(b); } @@ -75,7 +79,8 @@ protected JPanel createButtonPanel() { @Override protected Container createCenterPane() { - return advancedSearchPane; + JScrollPane advScrollpane = new JScrollPane(advancedSearchPane); + return advScrollpane; } /** Deactivates the search fields in both search tabs so that no units are filtered out. */ @@ -91,4 +96,9 @@ public ASAdvancedSearchPanel getASAdvancedSearch() { public TWAdvancedSearchPanel getTWAdvancedSearch() { return totalWarTab; } + + private void adaptToGUIScale() { + UIUtil.adjustDialog(this, UIUtil.FONT_SCALE1); + totalWarTab.adaptToGUIScale(); + } } diff --git a/megamek/src/megamek/client/ui/swing/gameConnectionDialogs/AbstractGameConnectionDialog.java b/megamek/src/megamek/client/ui/swing/gameConnectionDialogs/AbstractGameConnectionDialog.java index 4d7694e06b4..5b24838e690 100644 --- a/megamek/src/megamek/client/ui/swing/gameConnectionDialogs/AbstractGameConnectionDialog.java +++ b/megamek/src/megamek/client/ui/swing/gameConnectionDialogs/AbstractGameConnectionDialog.java @@ -25,6 +25,7 @@ import megamek.client.ui.swing.CloseAction; import megamek.client.ui.swing.OkayAction; import megamek.client.ui.swing.dialog.DialogButton; +import megamek.client.ui.swing.util.UIUtil; import megamek.codeUtilities.StringUtility; import megamek.common.preference.ClientPreferences; import megamek.common.preference.PreferenceManager; @@ -145,7 +146,7 @@ public void setPlayerName(String playerName) { if (playerNameCombo == null) { playerNameCombo = new JComboBox<>(playerNames); Dimension preferredSize = playerNameCombo.getPreferredSize(); - preferredSize.setSize(180, preferredSize.getHeight()); + preferredSize.setSize(UIUtil.scaleForGUI(180), UIUtil.scaleForGUI(25)); playerNameCombo.setPreferredSize(preferredSize); playerNameCombo.setEditable(true); } diff --git a/megamek/src/megamek/client/ui/swing/gameConnectionDialogs/ConnectDialog.java b/megamek/src/megamek/client/ui/swing/gameConnectionDialogs/ConnectDialog.java index 8b0f11e8e16..8b6d892bf63 100644 --- a/megamek/src/megamek/client/ui/swing/gameConnectionDialogs/ConnectDialog.java +++ b/megamek/src/megamek/client/ui/swing/gameConnectionDialogs/ConnectDialog.java @@ -111,9 +111,13 @@ public void actionPerformed(ActionEvent e) { @Override public void setVisible(boolean b) { if (b) { - UIUtil.adjustDialog(getContentPane()); + adaptToGUIScale(); pack(); } super.setVisible(b); } + + private void adaptToGUIScale() { + UIUtil.adjustDialog(this, UIUtil.FONT_SCALE1); + } } diff --git a/megamek/src/megamek/client/ui/swing/gameConnectionDialogs/HostDialog.java b/megamek/src/megamek/client/ui/swing/gameConnectionDialogs/HostDialog.java index 16a0644021f..1c0a8eaacc4 100644 --- a/megamek/src/megamek/client/ui/swing/gameConnectionDialogs/HostDialog.java +++ b/megamek/src/megamek/client/ui/swing/gameConnectionDialogs/HostDialog.java @@ -178,9 +178,13 @@ public void actionPerformed(ActionEvent e) { @Override public void setVisible(boolean b) { if (b) { - UIUtil.adjustDialog(getContentPane()); + adaptToGUIScale(); pack(); } super.setVisible(b); } + + private void adaptToGUIScale() { + UIUtil.adjustDialog(this, UIUtil.FONT_SCALE1); + } } diff --git a/megamek/src/megamek/client/ui/swing/lobby/ChatLounge.java b/megamek/src/megamek/client/ui/swing/lobby/ChatLounge.java index eea8f45e2e6..d488719e034 100644 --- a/megamek/src/megamek/client/ui/swing/lobby/ChatLounge.java +++ b/megamek/src/megamek/client/ui/swing/lobby/ChatLounge.java @@ -20,6 +20,7 @@ */ package megamek.client.ui.swing.lobby; +import megamek.MMConstants; import megamek.client.Client; import megamek.client.bot.BotClient; import megamek.client.bot.princess.BehaviorSettings; @@ -43,7 +44,6 @@ import megamek.client.ui.swing.widget.SkinSpecification; import megamek.common.*; import megamek.common.annotations.Nullable; -import megamek.common.enums.GamePhase; import megamek.common.event.*; import megamek.common.force.Force; import megamek.common.force.Forces; @@ -122,35 +122,31 @@ public class ChatLounge extends AbstractPhaseDisplay implements private JLabel lblTechLevel = new JLabel(""); // Game Setup - private JButton butOptions = new JButton(Messages.getString("ChatLounge.butOptions")); - //private JToggleButton butGroundMap = new JToggleButton("Ground Map"); - private JToggleButton butGroundMap = new JToggleButton(Messages.getString("ChatLounge.butGroundMap")); - //private JToggleButton butLowAtmoMap = new JToggleButton("Low Altitude Map"); - private JToggleButton butLowAtmoMap = new JToggleButton("Low Altitude Map"); - //private JToggleButton butHighAtmoMap = new JToggleButton("High Altitude Map"); - private JToggleButton butHighAtmoMap = new JToggleButton("High Altitude Map"); - //private JToggleButton butSpaceMap = new JToggleButton("Space Map"); - private JToggleButton butSpaceMap = new JToggleButton("Space Map"); + private JButton butOptions = new JButton(MSG_BUTOPTIONS); + private JToggleButton butGroundMap = new JToggleButton(MSG_BUTGROUNDMAP); + private JToggleButton butLowAtmoMap = new JToggleButton(MSG_NAMELOWALTITUDEMAP); + private JToggleButton butHighAtmoMap = new JToggleButton(MSG_NAMEHIGHALTITUDEMAP); + private JToggleButton butSpaceMap = new JToggleButton(MSG_NAMESPACEMAP); private ButtonGroup grpMap = new ButtonGroup(); /* Unit Configuration Panel */ private FixedYPanel panUnitInfo = new FixedYPanel(); - private JButton butAdd = new JButton(Messages.getString("ChatLounge.butLoad")); - private JButton butArmy = new JButton(Messages.getString("ChatLounge.butArmy")); - private JButton butSkills = new JButton(Messages.getString("ChatLounge.butSkills")); - private JButton butNames = new JButton(Messages.getString("ChatLounge.butNames")); - private JButton butLoadList = new JButton(Messages.getString("ChatLounge.butLoadList")); - private JButton butSaveList = new JButton(Messages.getString("ChatLounge.butSaveList")); + private JButton butAdd = new JButton(MSG_BUTLOAD); + private JButton butArmy = new JButton(MSG_BUTARMY); + private JButton butSkills = new JButton(MSG_BUTSKILLS); + private JButton butNames = new JButton(MSG_BUTNAMES); + private JButton butLoadList = new JButton(MSG_BUTLOADLIST); + private JButton butSaveList = new JButton(MSG_BUTSAVELIST); /* Unit Table */ private JTable mekTable; public JScrollPane scrMekTable; - private MMToggleButton butCompact = new MMToggleButton(Messages.getString("ChatLounge.butCompact")); - private MMToggleButton butShowUnitID = new MMToggleButton(Messages.getString("ChatLounge.butShowUnitID")); - private JToggleButton butListView = new JToggleButton("Sortable View"); - private JToggleButton butForceView = new JToggleButton("Force View"); - private JButton butCollapse = new JButton("<<"); - private JButton butExpand = new JButton(">>"); + private MMToggleButton butCompact = new MMToggleButton(MSG_BUTCOMPACT); + private MMToggleButton butShowUnitID = new MMToggleButton(MSG_BUTSHOWUNITID); + private JToggleButton butListView = new JToggleButton(MSG_BUTSORTABLEVIEW); + private JToggleButton butForceView = new JToggleButton(MSG_BUTFORCEVIEW); + private JButton butCollapse = new JButton(MSG_BUTCOLLAPSE); + private JButton butExpand = new JButton(MSG_BUTEXPAND); private MekTableModel mekModel; /* Force Tree */ @@ -162,53 +158,51 @@ public class ChatLounge extends AbstractPhaseDisplay implements private FixedYPanel panPlayerInfo; private JComboBox comboTeam = new JComboBox<>(); private JButton butCamo = new JButton(); - private JButton butAddBot = new JButton(Messages.getString("ChatLounge.butAddBot")); - private JButton butRemoveBot = new JButton(Messages.getString("ChatLounge.butRemoveBot")); -// private JButton butBotSettings = new JButton("Bot Settings..."); -// private JButton butConfigPlayer = new JButton("Configure Player..."); - private JButton butConfigPlayer = new JButton(Messages.getString("ChatLounge.butConfigPlayer")); - private JButton butBotSettings = new JButton(Messages.getString("ChatLounge.butBotSettings")); - + private JButton butAddBot = new JButton(MSG_BUTADDBOT); + private JButton butRemoveBot = new JButton(MSG_BUTREMOVEBOT); + private JButton butConfigPlayer = new JButton(MSG_BUTCONFIGPLAYER); + private JButton butBotSettings = new JButton(MSG_BUTSETTINGS); + private MekTableMouseAdapter mekTableMouseAdapter = new MekTableMouseAdapter(); private PlayerTableModel playerModel = new PlayerTableModel(); private PlayerTable tablePlayers = new PlayerTable(playerModel, this); private JScrollPane scrPlayers = new JScrollPane(tablePlayers); /* Map Settings Panel */ - private JLabel lblMapWidth = new JLabel("Map Width:"); - private JButton butMapGrowW = new JButton(">"); - private JButton butMapShrinkW = new JButton("<"); + private JLabel lblMapWidth = new JLabel(MSG_LABELMAPWIDTH); + private JButton butMapGrowW = new JButton(MSG_BUTGROW); + private JButton butMapShrinkW = new JButton(MSG_BUTSHRINK); private JTextField fldMapWidth = new JTextField(3); - private JLabel lblMapHeight = new JLabel("Map Height:"); - private JButton butMapGrowH = new JButton(">"); - private JButton butMapShrinkH = new JButton("<"); + private JLabel lblMapHeight = new JLabel(MSG_LABELMAPHEIGHT); + private JButton butMapGrowH = new JButton(MSG_BUTGROW); + private JButton butMapShrinkH = new JButton(MSG_BUTSHRINK); private JTextField fldMapHeight = new JTextField(3); private FixedYPanel panMapHeight = new FixedYPanel(); private FixedYPanel panMapWidth = new FixedYPanel(); - private JLabel lblSpaceBoardWidth = new JLabel("Board Width:"); + private JLabel lblSpaceBoardWidth = new JLabel(MSG_LABELBOARDWIDTH); private JTextField fldSpaceBoardWidth = new JTextField(3); - private JLabel lblSpaceBoardHeight = new JLabel("Board Height:"); + private JLabel lblSpaceBoardHeight = new JLabel(MSG_LABELBOARDHEIGHT); private JTextField fldSpaceBoardHeight = new JTextField(3); private FixedYPanel panSpaceBoardHeight = new FixedYPanel(); private FixedYPanel panSpaceBoardWidth = new FixedYPanel(); - private JLabel lblBoardSize = new JLabel("Board Size: "); - private JButton butHelp = new JButton(" ? "); - - private JButton butConditions = new JButton(Messages.getString("ChatLounge.butConditions")); - private JButton butRandomMap = new JButton(Messages.getString("BoardSelectionDialog.GeneratedMapSettings")); + private JLabel lblBoardSize = new JLabel(MSG_LABELBOARDSIZE); + private JButton butHelp = new JButton(" " + MSG_BUTHELP + " "); + + private JButton butConditions = new JButton(MSG_BUTCONDITIONS); + private JButton butRandomMap = new JButton(MSG_BUTRANDOMMAP); ArrayList mapButtons = new ArrayList<>(20); MapSettings mapSettings; private JPanel panGroundMap; @SuppressWarnings("rawtypes") private JComboBox comMapSizes; - private JButton butBoardPreview = new JButton(Messages.getString("BoardSelectionDialog.ViewGameBoard")); + private JButton butBoardPreview = new JButton(MSG_VIEWGAMEBOARD); private JPanel panMapButtons = new JPanel(); private JLabel lblBoardsAvailable = new JLabel(); private JList lisBoardsAvailable; private JScrollPane scrBoardsAvailable; - private JButton butSpaceSize = new JButton(Messages.getString("ChatLounge.MapSize")); + private JButton butSpaceSize = new JButton(MSG_BUTMAPSIZE); private Set mapSizes = new TreeSet<>(); boolean resetAvailBoardSelection = false; boolean resetSelectedBoards = true; @@ -221,22 +215,23 @@ public class ChatLounge extends AbstractPhaseDisplay implements private ArrayList serverBoards = new ArrayList<>(); private JSplitPane splGroundMap; - private JLabel lblSearch = new JLabel("Search: "); + private JLabel lblSearch = new JLabel(MSG_LABELSEARCH); private JTextField fldSearch = new JTextField(10); - private JButton butCancelSearch = new JButton("X"); + private JButton butCancelSearch = new JButton(MSG_BUTCANCELSEARCH); private MekTableSorter activeSorter; private ArrayList unitSorters = new ArrayList<>(); private ArrayList bvSorters = new ArrayList<>(); - private JButton butAddY = new JButton("+"); - private JButton butAddX = new JButton("+"); - private JButton butSaveMapSetup = new JButton(Messages.getString("ChatLounge.map.saveMapSetup") + " *"); - private JButton butLoadMapSetup = new JButton(Messages.getString("ChatLounge.map.loadMapSetup")); + private JButton butAddY = new JButton(MSG_BUTADD); + private JButton butAddX = new JButton(MSG_BUTADD); + private JButton butSaveMapSetup = new JButton(MSG_MAPSAVESETUP + " *"); + private JButton butLoadMapSetup = new JButton(MSG_MAPLOADSETUP); /* Team Overview Panel */ private TeamOverviewPanel panTeamOverview; - JButton butDetach = new JButton("Detach to Window"); + JButton butDetach = new JButton(MSG_BUTDETACH); + private JSplitPane splitPaneMain; ClientDialog teamOverviewWindow; private ImageLoader loader; @@ -249,18 +244,124 @@ public class ChatLounge extends AbstractPhaseDisplay implements private Map boardTags = new HashMap<>(); LobbyKeyDispatcher lobbyKeyDispatcher = new LobbyKeyDispatcher(this); - + + private static final String CL_KEY_FILEEXTENTION_BOARD = ".board"; + private static final String CL_KEY_FILEEXTENTION_XML = ".xml"; + private static final String CL_KEY_FILEPATH_MAPASSEMBLYHELP = "docs/Boards Stuff/MapAssemblyHelp.html"; + private static final String CL_KEY_FILEPATH_MAPSETUP = "/mapsetup"; + private static final String CL_KEY_NAMEHELPPANE = "helpPane"; + + private static final String CL_ACTIONCOMMAND_LOADLIST = "load_list"; + private static final String CL_ACTIONCOMMAND_SAVELIST = "save_list"; + private static final String CL_ACTIONCOMMAND_LOADMECH = "load_mech"; + private static final String CL_ACTIONCOMMAND_ADDBOT = "add_bot"; + private static final String CL_ACTIONCOMMAND_REMOVEBOT = "remove_bot"; + private static final String CL_ACTIONCOMMAND_BOTCONFIG = "BOTCONFIG"; + private static final String CL_ACTIONCOMMAND_CONFIGURE = "CONFIGURE"; + private static final String CL_ACTIONCOMMAND_CAMO= "camo"; + + private static final String MSG_ERROR = Messages.getString("Error"); + private static final String MSG_OKAY = Messages.getString("Okay"); + private static final String MSG_ALERTBOTTITLE = Messages.getString("ChatLounge.AlertBot.title"); + private static final String MSG_ALERTBOTMESSAGE = Messages.getString("ChatLounge.AlertBot.message"); + private static final String MSG_BOARDGENERATEDMESSAGE = Messages.getString("ChatLounge.board.generatedMessage"); + private static final String MSG_BOARDRANDOMLYSELECTEDMESSAGE = Messages.getString("ChatLounge.board.randomlySelectedMessage"); + private static final String MSG_BOARDSEVERSIDB = Messages.getString("ChatLounge.board.serverSide"); + private static final String MSG_BUTOPTIONS = Messages.getString("ChatLounge.butOptions"); + private static final String MSG_BUTGROUNDMAP = Messages.getString("ChatLounge.butGroundMap"); + private static final String MSG_BUTLOAD = Messages.getString("ChatLounge.butLoad"); + private static final String MSG_BUTARMY = Messages.getString("ChatLounge.butArmy"); + private static final String MSG_BUTSKILLS = Messages.getString("ChatLounge.butSkills"); + private static final String MSG_BUTNAMES = Messages.getString("ChatLounge.butNames"); + private static final String MSG_BUTLOADLIST = Messages.getString("ChatLounge.butLoadList"); + private static final String MSG_BUTSAVELIST = Messages.getString("ChatLounge.butSaveList"); + private static final String MSG_BUTCOMPACT = Messages.getString("ChatLounge.butCompact"); + private static final String MSG_BUTSHOWUNITID = Messages.getString("ChatLounge.butShowUnitID"); + private static final String MSG_BUTADDBOT = Messages.getString("ChatLounge.butAddBot"); + private static final String MSG_BUTREMOVEBOT = Messages.getString("ChatLounge.butRemoveBot"); + private static final String MSG_BUTCONFIGPLAYER = Messages.getString("ChatLounge.butConfigPlayer"); + private static final String MSG_BUTSETTINGS = Messages.getString("ChatLounge.butBotSettings"); + private static final String MSG_BUTCONDITIONS = Messages.getString("ChatLounge.butConditions"); + private static final String MSG_BUTRANDOMMAP = Messages.getString("BoardSelectionDialog.GeneratedMapSettings"); + private static final String MSG_BUTMAPSIZE= Messages.getString("ChatLounge.MapSize"); + private static final String MSG_BUTHELP = Messages.getString("ChatLounge.butHelp"); + private static final String MSG_BUTCANCELSEARCH = Messages.getString("ChatLounge.butCancelSearch"); + private static final String MSG_BUTADD = Messages.getString("ChatLounge.butAdd"); + private static final String MSG_BUTDETACH = Messages.getString("ChatLounge.butDetach"); + private static final String MSG_BUTCOLLAPSE = Messages.getString("ChatLounge.butCollapse"); + private static final String MSG_BUTEXPAND = Messages.getString("ChatLounge.butExpand"); + private static final String MSG_BUTGROW = Messages.getString("ChatLounge.butGrow"); + private static final String MSG_BUTSHRINK = Messages.getString("ChatLounge.butShrink"); + private static final String MSG_BUTSORTABLEVIEW = Messages.getString("ChatLounge.butSortableView"); + private static final String MSG_BUTFORCEVIEW = Messages.getString("ChatLounge.butForceView"); + private static final String MSG_CUSTOMMAPSIZE = Messages.getString("ChatLounge.CustomMapSize"); + private static final String MSG_FILENOTFOUND = Messages.getString("ChatLounge.fileNotFound"); + private static final String MSG_IMPROPERCOMMAND = Messages.getString("ChatLounge.ImproperCommand"); + private static final String MSG_GAMEYEAR = Messages.getString("ChatLounge.GameYear"); + private static final String MSG_IMDONE = Messages.getString("ChatLounge.imDone"); + private static final String MSG_LABELSEARCH = Messages.getString("ChatLounge.labSearch"); + private static final String MSG_LABELBOARDWIDTH = Messages.getString("ChatLounge.labBoardWidth"); + private static final String MSG_LABELBOARDHEIGHT = Messages.getString("ChatLounge.labBoardHeight"); + private static final String MSG_LABELBOARDSIZE = Messages.getString("ChatLounge.labBoardSize"); + private static final String MSG_LABELMAPWIDTH = Messages.getString("ChatLounge.labMapWidth"); + private static final String MSG_LABELMAPHEIGHT = Messages.getString("ChatLounge.labMapHeight"); + private static final String MSG_MAPLOADSETUP = Messages.getString("ChatLounge.map.loadMapSetup"); + private static final String MSG_MAPSUMMARY = Messages.getString("ChatLounge.MapSummary"); + private static final String MSG_NAMESELECTUNITS = Messages.getString("ChatLounge.name.selectUnits"); + private static final String MSG_NAMESELECTMAP = Messages.getString("ChatLounge.name.SelectMap"); + private static final String MSG_NAMETEAMOVERVIEW = Messages.getString("ChatLounge.name.teamOverview"); + private static final String MSG_NAMEUNITSETUP = Messages.getString("ChatLounge.name.unitSetup"); + private static final String MSG_NAMEPLAYERSETUP = Messages.getString("ChatLounge.name.playerSetup"); + private static final String MSG_NAMEGROUNDMAP = Messages.getString("ChatLounge.name.groundMap"); + private static final String MSG_NAMEATMOSPHERICMAP = Messages.getString("ChatLounge.name.atmosphericMap"); + private static final String MSG_NAMESPACEMAP = Messages.getString("ChatLounge.name.spaceMap"); + private static final String MSG_NAMELOWALTITUDEMAP = Messages.getString("ChatLounge.name.lowAltitudeMap"); + private static final String MSG_NAMEHIGHALTITUDEMAP = Messages.getString("ChatLounge.name.HighAltitudeMap"); + private static final String MSG_NOCMDRTITLE = Messages.getString("ChatLounge.noCmdr.title"); + private static final String MSG_NOCMDRMSG = Messages.getString("ChatLounge.noCmdr.msg"); + private static final String MSG_NOTDONE = Messages.getString("ChatLounge.notDone"); + private static final String MSG_OVERLAPDEPLOYTITLE = Messages.getString("ChatLounge.OverlapDeploy.title"); + private static final String MSG_OVERLAPDEPLOYMSG = Messages.getString("ChatLounge.OverlapDeploy.msg"); + private static final String MSG_PROBLEMLOADINGMAPSETUP = Messages.getString("ChatLounge.map.problemLoadMapSetup"); + private static final String MSG_MAPPROBLEMSAVING = Messages.getString("ChatLounge.map.problemSaving"); + private static final String MSG_MAPSUMMARYSELECTEDMAPS = Messages.getString("ChatLounge.MapSummarySelectedMaps"); + private static final String MSG_MAPCONFIRMREPLACE = Messages.getString("ChatLounge.map.confirmReplace"); + private static final String MSG_MAPSERVERSIDETIP = Messages.getString("ChatLounge.map.serverSideTip"); + private static final String MSG_MAPSAVESETUPREPLACE = Messages.getString("ChatLounge.map.saveMapSetupReplace"); + private static final String MSG_MAPSAVESETUP = Messages.getString("ChatLounge.map.saveMapSetup"); + private static final String MSG_SELECTBOTORPLAYER = Messages.getString("ChatLounge.SelectBotOrPlayer"); + private static final String MSG_MAPSEARCHTIP = Messages.getString("ChatLounge.map.searchTip"); + private static final String MSG_MAPSAVESETUPTIP = Messages.getString("ChatLounge.map.saveMapSetupTip"); + private static final String MSG_MAPTITLEMAPASSEMBLYHELP = Messages.getString("ChatLounge.map.title.mapAssemblyHelp"); + private static final String MSG_TECHYEAR = Messages.getString("ChatLounge.TechLevel"); + private static final String MSG_TOOLTIPTECHYEAR = Messages.getString("ChatLounge.tooltip.techYear"); + private static final String MSG_TREEPATHMETHODREQUIRESENTITYFORCE = Messages.getString("ChatLounge.TreePath.methodRequiresEntityForce"); + private static final String MSG_ABSTRACTHELPDIALOGNOHELPTITLE = Messages.getString("AbstractHelpDialog.noHelp.title"); + private static final String MSG_ABSTRACTHELPDIALOGERRORREADING = Messages.getString("AbstractHelpDialog.errorReading"); + private static final String MSG_BOARDEDITORCOULDNTINITIALIZE = Messages.getString("BoardEditor.CouldntInitialize"); + private static final String MSG_BOARDEDITORFATALERROR = Messages.getString("BoardEditor.FatalError"); + private static final String MSG_MAPSAVAILABLE = Messages.getString("BoardSelectionDialog.mapsAvailable"); + private static final String MSG_VIEWGAMEBOARDTOOLTIP = Messages.getString("BoardSelectionDialog.ViewGameBoardTooltip"); + private static final String MSG_VIEWGAMEBOARD = Messages.getString("BoardSelectionDialog.ViewGameBoard"); + private static final String MSG_FIGHTERSQUADRONBOMBERROR = Messages.getString("FighterSquadron.bomberror"); + /** Creates a new chat lounge for the clientgui.getClient(). */ public ChatLounge(ClientGUI clientgui) { super(clientgui, SkinSpecification.UIComponents.ChatLounge.getComp(), SkinSpecification.UIComponents.ChatLoungeDoneButton.getComp()); setLayout(new BorderLayout()); - panTabs.add("Select Units", panUnits); - panTabs.add("Select Map", panMap); - panTabs.add("Team Overview", panTeam); - add(panTabs, BorderLayout.CENTER); - + splitPaneMain = new JSplitPane(JSplitPane.VERTICAL_SPLIT); + splitPaneMain.setDividerSize(15); + splitPaneMain.setResizeWeight(0.95); + JPanel p = new JPanel(new BorderLayout()); + panTabs.add(MSG_NAMESELECTUNITS, panUnits); + panTabs.add(MSG_NAMESELECTMAP, panMap); + panTabs.add(MSG_NAMETEAMOVERVIEW, panTeam); + p.add(panTabs, BorderLayout.CENTER); + splitPaneMain.setTopComponent(p); + add(splitPaneMain); + setupSorters(); setupTeamOverview(); setupPlayerConfig(); @@ -273,6 +374,10 @@ public ChatLounge(ClientGUI clientgui) { adaptToGUIScale(); setupListeners(); } + + public void setBottom(JComponent comp) { + splitPaneMain.setBottomComponent(comp); + } /** Sets up all the listeners that the lobby works with. */ private void setupListeners() { @@ -405,7 +510,7 @@ private void setupTeamOverview() { panTeam.add(panTeamOverview); // setup (but don't show) the detached team overview window - teamOverviewWindow = new ClientDialog(clientgui.frame, "Team Overview", false); + teamOverviewWindow = new ClientDialog(clientgui.frame, MSG_NAMETEAMOVERVIEW, false); teamOverviewWindow.setSize(clientgui.frame.getWidth() / 2, clientgui.frame.getHeight() / 2); } @@ -413,7 +518,7 @@ private void setupTeamOverview() { WindowListener teamOverviewWindowListener = new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { - int i = panTabs.indexOfTab("Team Overview"); + int i = panTabs.indexOfTab(MSG_NAMETEAMOVERVIEW); Component cp = panTabs.getComponentAt(i); if (cp instanceof JPanel) { ((JPanel) cp).add(panTeamOverview); @@ -486,15 +591,15 @@ private void setupUnitConfig() { MechSummaryCache mechSummaryCache = MechSummaryCache.getInstance(); boolean mscLoaded = mechSummaryCache.isInitialized(); - butLoadList.setActionCommand("load_list"); + butLoadList.setActionCommand(CL_ACTIONCOMMAND_LOADLIST); butLoadList.setEnabled(mscLoaded); - butSaveList.setActionCommand("save_list"); + butSaveList.setActionCommand(CL_ACTIONCOMMAND_SAVELIST); butSaveList.setEnabled(false); butAdd.setEnabled(mscLoaded); - butAdd.setActionCommand("load_mech"); + butAdd.setActionCommand(CL_ACTIONCOMMAND_LOADMECH); butArmy.setEnabled(mscLoaded); - panUnitInfo.setBorder(BorderFactory.createTitledBorder(" Unit Setup ")); + panUnitInfo.setBorder(BorderFactory.createTitledBorder(MSG_NAMEUNITSETUP)); panUnitInfo.setLayout(new BoxLayout(panUnitInfo, BoxLayout.PAGE_AXIS)); JPanel panUnitInfoAdd = new JPanel(new GridLayout(2, 1, 2, 2)); panUnitInfoAdd.setBorder(new EmptyBorder(0, 0, 2, 1)); @@ -514,20 +619,20 @@ private void setupUnitConfig() { private void setupPlayerConfig() { scrPlayers.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER); - butAddBot.setActionCommand("add_bot"); + butAddBot.setActionCommand(CL_ACTIONCOMMAND_ADDBOT); butRemoveBot.setEnabled(false); - butRemoveBot.setActionCommand("remove_bot"); + butRemoveBot.setActionCommand(CL_ACTIONCOMMAND_REMOVEBOT); butBotSettings.setEnabled(false); - butBotSettings.setActionCommand("BOTCONFIG"); + butBotSettings.setActionCommand(CL_ACTIONCOMMAND_BOTCONFIG); butConfigPlayer.setEnabled(false); - butConfigPlayer.setActionCommand("CONFIGURE"); + butConfigPlayer.setActionCommand(CL_ACTIONCOMMAND_CONFIGURE); setButUnitIDState(); setupTeamCombo(); - butCamo.setActionCommand("camo"); + butCamo.setActionCommand(CL_ACTIONCOMMAND_CAMO); refreshCamoButton(); panPlayerInfo = new FixedYPanel(new GridLayout(1, 2, 2, 2)); - panPlayerInfo.setBorder(BorderFactory.createTitledBorder("Player Setup")); + panPlayerInfo.setBorder(BorderFactory.createTitledBorder(MSG_NAMEPLAYERSETUP)); JPanel panPlayerInfoBts = new JPanel(new GridLayout(4, 1, 2, 2)); panPlayerInfoBts.add(comboTeam); @@ -673,7 +778,7 @@ public void componentResized(ComponentEvent e) { bottomPanel.add(butSaveMapSetup); bottomPanel.add(butLoadMapSetup); - butBoardPreview.setToolTipText(Messages.getString("BoardSelectionDialog.ViewGameBoardTooltip")); + butBoardPreview.setToolTipText(MSG_VIEWGAMEBOARDTOOLTIP); // The left side panel including the game map preview JPanel panMapPreview = new JPanel(); @@ -722,7 +827,7 @@ public void componentShown(ComponentEvent e) { // setup the board preview window. boardPreviewW = new ClientDialog(clientgui.frame, - Messages.getString("BoardSelectionDialog.ViewGameBoard"), + MSG_VIEWGAMEBOARD, false); boardPreviewW.setLocationRelativeTo(clientgui.frame); @@ -739,9 +844,8 @@ public void componentShown(ComponentEvent e) { previewBV.zoomOut(); boardPreviewW.center(); } catch (IOException e) { - JOptionPane.showMessageDialog(this, - Messages.getString("BoardEditor.CouldntInitialize") + e, - Messages.getString("BoardEditor.FatalError"), JOptionPane.ERROR_MESSAGE); + JOptionPane.showMessageDialog(this, MSG_BOARDEDITORCOULDNTINITIALIZE + e, + MSG_BOARDEDITORFATALERROR, JOptionPane.ERROR_MESSAGE); } refreshMapButtons(); } @@ -858,7 +962,7 @@ private void refreshMapSizes() { for (BoardDimensions size : mapSizes) { comMapSizes.addItem(size); } - comMapSizes.addItem(Messages.getString("ChatLounge.CustomMapSize")); + comMapSizes.addItem(MSG_CUSTOMMAPSIZE); comMapSizes.setSelectedIndex(oldSelection != -1 ? oldSelection : 0); comMapSizes.addActionListener(lobbyListener); } @@ -870,7 +974,7 @@ private void refreshMapSizes() { private void refreshMapUI() { boolean inSpace = mapSettings.getMedium() == MapSettings.MEDIUM_SPACE; boolean onGround = mapSettings.getMedium() == MapSettings.MEDIUM_GROUND; - boolean customSize = comMapSizes.getSelectedItem().equals(Messages.getString("ChatLounge.CustomMapSize")); + boolean customSize = comMapSizes.getSelectedItem().equals(MSG_CUSTOMMAPSIZE); lisBoardsAvailable.setEnabled(!inSpace); mapIcons.clear(); butConditions.setEnabled(!inSpace); @@ -939,7 +1043,7 @@ private void refreshBoardsAvailable() { private void refreshBoardTags() { boardTags.clear(); for (String boardName : mapSettings.getBoardsAvailableVector()) { - File boardFile = new MegaMekFile(Configuration.boardsDir(), boardName + ".board").getFile(); + File boardFile = new MegaMekFile(Configuration.boardsDir(), boardName + CL_KEY_FILEEXTENTION_BOARD).getFile(); Set tags = Board.getTags(boardFile); boardTags.put(boardName, String.join("||", tags).toLowerCase()); } @@ -1035,12 +1139,12 @@ private void refreshMapButtons() { boardForImage = boardForImage.replace(Board.BOARD_REQUEST_ROTATION, ""); } - File boardFile = new MegaMekFile(Configuration.boardsDir(), boardForImage + ".board").getFile(); + File boardFile = new MegaMekFile(Configuration.boardsDir(), boardForImage + CL_KEY_FILEEXTENTION_BOARD).getFile(); if (boardFile.exists()) { buttonBoard = new Board(16, 17); - buttonBoard.load(new MegaMekFile(Configuration.boardsDir(), boardForImage + ".board").getFile()); + buttonBoard.load(new MegaMekFile(Configuration.boardsDir(), boardForImage + CL_KEY_FILEEXTENTION_BOARD).getFile()); StringBuffer errs = new StringBuffer(); - try (InputStream is = new FileInputStream(new MegaMekFile(Configuration.boardsDir(), boardForImage + ".board").getFile())) { + try (InputStream is = new FileInputStream(new MegaMekFile(Configuration.boardsDir(), boardForImage +CL_KEY_FILEEXTENTION_BOARD).getFile())) { buttonBoard.load(is, errs, true); BoardUtilities.flip(buttonBoard, rotateBoard, rotateBoard); } catch (IOException ex) { @@ -1073,7 +1177,7 @@ private void refreshMapButtons() { panMapButtons.setVisible(true); lblBoardsAvailable.setText(mapSettings.getBoardWidth() + "x" + mapSettings.getBoardHeight() + " " - + Messages.getString("BoardSelectionDialog.mapsAvailable")); + + MSG_MAPSAVAILABLE); comMapSizes.removeActionListener(lobbyListener); int items = comMapSizes.getItemCount(); @@ -1099,9 +1203,9 @@ private void markServerSideBoard(BufferedImage image) { GUIPreferences.AntiAliasifSet(g); int w = image.getWidth(); int h = image.getHeight(); - String text = "Server-side board"; + String text = MSG_BOARDSEVERSIDB; int fontSize = Math.min(w / 10, UIUtil.scaleForGUI(16)); - g.setFont(new Font("Dialog", Font.ITALIC, fontSize)); + g.setFont(new Font(MMConstants.FONT_DIALOG, Font.ITALIC, fontSize)); FontMetrics fm = g.getFontMetrics(g.getFont()); int cx = (w - fm.stringWidth(text)) / 2; int cy = h / 10 + fm.getAscent(); @@ -1151,7 +1255,7 @@ public Board getPossibleGameBoard(boolean onlyFixedBoards) { name = name.substring(Board.BOARD_REQUEST_ROTATION.length()); } - sheetBoards[i].load(new MegaMekFile(Configuration.boardsDir(), name + ".board").getFile()); + sheetBoards[i].load(new MegaMekFile(Configuration.boardsDir(), name + CL_KEY_FILEEXTENTION_BOARD).getFile()); BoardUtilities.flip(sheetBoards[i], flipBoard, flipBoard); } } @@ -1306,7 +1410,7 @@ private void refreshMapSettings() { * condition. */ private void refreshDoneButton(boolean done) { - butDone.setText(done ? Messages.getString("ChatLounge.notDone") : Messages.getString("ChatLounge.imDone")); + butDone.setText(done ? MSG_NOTDONE : MSG_IMDONE); } /** Refreshes the state of the Done button with the state of the local player. */ @@ -1336,8 +1440,8 @@ void loadOnto(Entity carried, int carrierId, int bayNumber) { } // We can't load all of the squadrons bombs if (numLoadedBombs > ((IBomber) carried).getMaxBombPoints()) { - JOptionPane.showMessageDialog(clientgui.frame, Messages.getString("FighterSquadron.bomberror"), - Messages.getString("FighterSquadron.error"), JOptionPane.ERROR_MESSAGE); + JOptionPane.showMessageDialog(clientgui.frame, MSG_FIGHTERSQUADRONBOMBERROR, + MSG_FIGHTERSQUADRONBOMBERROR, JOptionPane.ERROR_MESSAGE); return; } } @@ -1655,7 +1759,7 @@ public void gamePhaseChange(GamePhaseChangeEvent e) { return; } - if (clientgui.getClient().getGame().getPhase() == GamePhase.LOUNGE) { + if (clientgui.getClient().getGame().getPhase().isLounge()) { refreshDoneButton(); refreshGameSettings(); refreshPlayerTable(); @@ -1737,8 +1841,7 @@ public void actionPerformed(ActionEvent ev) { // list of entities with a list from a file. Client c = getSelectedClient(); if (c == null) { - clientgui.doAlertDialog(Messages.getString("ChatLounge.ImproperCommand"), - Messages.getString("ChatLounge.SelectBotOrPlayer")); + clientgui.doAlertDialog(MSG_IMPROPERCOMMAND, MSG_SELECTBOTORPLAYER); return; } clientgui.loadListFile(c.getLocalPlayer()); @@ -1748,8 +1851,7 @@ public void actionPerformed(ActionEvent ev) { // list of entities to a file. Client c = getSelectedClient(); if (c == null) { - clientgui.doAlertDialog(Messages.getString("ChatLounge.ImproperCommand"), - Messages.getString("ChatLounge.SelectBotOrPlayer")); + clientgui.doAlertDialog(MSG_IMPROPERCOMMAND, MSG_SELECTBOTORPLAYER); return; } clientgui.saveListFile(c.getGame().getPlayerEntities(c.getLocalPlayer(), false), @@ -1781,7 +1883,7 @@ public void actionPerformed(ActionEvent ev) { previewGameBoard(); } else if (ev.getSource().equals(comMapSizes)) { - if (comMapSizes.getSelectedItem().equals(Messages.getString("ChatLounge.CustomMapSize"))) { + if (comMapSizes.getSelectedItem().equals(MSG_CUSTOMMAPSIZE)) { refreshMapUI(); } else if (comMapSizes.getSelectedItem() != null) { BoardDimensions size = (BoardDimensions) comMapSizes.getSelectedItem(); @@ -1863,13 +1965,13 @@ public void actionPerformed(ActionEvent ev) { fldSearch.setText(""); } else if (ev.getSource() == butHelp) { - File helpfile = new File("docs/Boards Stuff/MapAssemblyHelp.html"); - final JDialog dialog = new ClientDialog(clientgui.frame, "Map Assembly Help", true, true); + File helpfile = new File(CL_KEY_FILEPATH_MAPASSEMBLYHELP); + final JDialog dialog = new ClientDialog(clientgui.frame, MSG_MAPTITLEMAPASSEMBLYHELP, true, true); final int height = 600; final int width = 600; final JEditorPane pane = new JEditorPane(); - pane.setName("helpPane"); + pane.setName(CL_KEY_NAMEHELPPANE); pane.setEditable(false); pane.setFont(UIUtil.getScaledFont()); try { @@ -1880,12 +1982,12 @@ public void actionPerformed(ActionEvent ev) { tScroll.getVerticalScrollBar().setUnitIncrement(16); dialog.add(tScroll, BorderLayout.CENTER); } catch (Exception e) { - dialog.setTitle(Messages.getString("AbstractHelpDialog.noHelp.title")); - pane.setText(Messages.getString("AbstractHelpDialog.errorReading") + e.getMessage()); + dialog.setTitle(MSG_ABSTRACTHELPDIALOGNOHELPTITLE); + pane.setText(MSG_ABSTRACTHELPDIALOGERRORREADING + e.getMessage()); LogManager.getLogger().error("", e); } - JButton button = new DialogButton(Messages.getString("Okay")); + JButton button = new DialogButton(MSG_OKAY); button.addActionListener(e -> dialog.setVisible(false)); JPanel okayPanel = new JPanel(new FlowLayout()); okayPanel.add(button); @@ -1948,8 +2050,7 @@ private void configAndCreateBot(@Nullable Player toReplace) { botClient.connect(); clientgui.getBots().put(bcd.getBotName(), botClient); } catch (Exception e) { - clientgui.doAlertDialog(Messages.getString("ChatLounge.AlertBot.title"), - Messages.getString("ChatLounge.AlertBot.message")); + clientgui.doAlertDialog(MSG_ALERTBOTTITLE, MSG_ALERTBOTMESSAGE); botClient.die(); } } @@ -1961,8 +2062,8 @@ private void configAndCreateBot(@Nullable Player toReplace) { * @see MapSetup */ private void saveMapSetup() { - JFileChooser fc = new JFileChooser(Configuration.dataDir() + "/mapsetup"); - fc.setDialogTitle(Messages.getString("ChatLounge.map.saveMapSetup")); + JFileChooser fc = new JFileChooser(Configuration.dataDir() + CL_KEY_FILEPATH_MAPSETUP); + fc.setDialogTitle(MSG_MAPSAVESETUP); fc.setMultiSelectionEnabled(false); fc.setAcceptAllFileFilterUsed(false); fc.setFileFilter(XMLFileFilter); @@ -1972,20 +2073,19 @@ private void saveMapSetup() { if ((returnVal != JFileChooser.APPROVE_OPTION) || (selectedFile == null)) { return; } - if (!selectedFile.getName().toLowerCase().endsWith(".xml")) { - selectedFile = new File(selectedFile.getPath() + ".xml"); + if (!selectedFile.getName().toLowerCase().endsWith(CL_KEY_FILEEXTENTION_XML)) { + selectedFile = new File(selectedFile.getPath() + CL_KEY_FILEEXTENTION_XML); } if (selectedFile.exists()) { - String msg = Messages.getString("ChatLounge.map.saveMapSetupReplace", selectedFile.getName()); - if (!MMConfirmDialog.confirm(clientgui.frame, "Confirm replace", msg)) { + String msg = Messages.getFormattedString(MSG_MAPSAVESETUPREPLACE, selectedFile.getName()); + if (!MMConfirmDialog.confirm(clientgui.frame, MSG_MAPCONFIRMREPLACE, msg)) { return; } } try (OutputStream os = new FileOutputStream(selectedFile)) { MapSetup.save(os, mapSettings); } catch (Exception ex) { - JOptionPane.showMessageDialog(clientgui.frame, - "There was a problem while saving the map setup!", "Error", JOptionPane.ERROR_MESSAGE); + JOptionPane.showMessageDialog(clientgui.frame, MSG_MAPPROBLEMSAVING, MSG_ERROR, JOptionPane.ERROR_MESSAGE); LogManager.getLogger().error("", ex); } } @@ -1996,8 +2096,8 @@ private void saveMapSetup() { * @see MapSetup */ private void loadMapSetup() { - JFileChooser fc = new JFileChooser(Configuration.dataDir() + "/mapsetup"); - fc.setDialogTitle(Messages.getString("ChatLounge.map.loadMapSetup")); + JFileChooser fc = new JFileChooser(Configuration.dataDir() + CL_KEY_FILEPATH_MAPSETUP); + fc.setDialogTitle(MSG_MAPLOADSETUP); fc.setMultiSelectionEnabled(false); fc.setAcceptAllFileFilterUsed(false); fc.setFileFilter(XMLFileFilter); @@ -2007,7 +2107,7 @@ private void loadMapSetup() { return; } if (!fc.getSelectedFile().exists()) { - JOptionPane.showMessageDialog(clientgui.frame, "File not found."); + JOptionPane.showMessageDialog(clientgui.frame, MSG_FILENOTFOUND); return; } try (InputStream os = new FileInputStream(fc.getSelectedFile())) { @@ -2017,8 +2117,8 @@ private void loadMapSetup() { mapSettings.setBoardsSelectedVector(setup.getBoards()); clientgui.getClient().sendMapSettings(mapSettings); } catch (Exception ex) { - JOptionPane.showMessageDialog(clientgui.frame, - "There was a problem while loading the map setup!", "Error", JOptionPane.ERROR_MESSAGE); + JOptionPane.showMessageDialog(clientgui.frame, + MSG_PROBLEMLOADINGMAPSETUP, MSG_ERROR, JOptionPane.ERROR_MESSAGE); LogManager.getLogger().error("", ex); } } @@ -2049,7 +2149,7 @@ private void doBotSettings() { FileFilter XMLFileFilter = new FileFilter() { @Override public boolean accept(File f) { - return (f.getPath().toLowerCase().endsWith(".xml") || f.isDirectory()); + return (f.getPath().toLowerCase().endsWith(CL_KEY_FILEEXTENTION_XML) || f.isDirectory()); } @Override @@ -2124,39 +2224,35 @@ public void updateMapSettings(MapSettings newSettings) { /**OK Refreshes the Map Summary, Tech Level and Game Year labels. */ private void refreshLabels() { - Font scaledFont = UIUtil.getScaledFont(); GameOptions opts = clientgui.getClient().getGame().getOptions(); - String txt = Messages.getString("ChatLounge.GameYear"); + String txt = MSG_GAMEYEAR; txt += opts.intOption(OptionsConstants.ALLOWED_YEAR); lblGameYear.setText(txt); - lblGameYear.setFont(scaledFont); - lblGameYear.setToolTipText(scaleStringForGUI(Messages.getString("ChatLounge.tooltip.techYear"))); + lblGameYear.setToolTipText(scaleStringForGUI(MSG_TOOLTIPTECHYEAR)); String tlString = TechConstants.getLevelDisplayableName(TechConstants.T_TECH_UNKNOWN); IOption tlOpt = opts.getOption(OptionsConstants.ALLOWED_TECHLEVEL); if (tlOpt != null) { tlString = tlOpt.stringValue(); } - lblTechLevel.setText(Messages.getString("ChatLounge.TechLevel") + tlString); - lblTechLevel.setFont(scaledFont); - lblTechLevel.setToolTipText(scaleStringForGUI(Messages.getString("ChatLounge.tooltip.techYear"))); + lblTechLevel.setText(MSG_TECHYEAR + tlString); + lblTechLevel.setToolTipText(scaleStringForGUI(MSG_TOOLTIPTECHYEAR)); - txt = Messages.getString("ChatLounge.MapSummary"); + txt = MSG_MAPSUMMARY; txt += (mapSettings.getBoardWidth() * mapSettings.getMapWidth()) + " x " + (mapSettings.getBoardHeight() * mapSettings.getMapHeight()); if (butGroundMap.isSelected()) { - txt += " Ground Map"; + txt += MSG_NAMEGROUNDMAP; } else if (butLowAtmoMap.isSelected()) { - txt += " Atmospheric Map"; + txt += " " + MSG_NAMEATMOSPHERICMAP; } else { - txt += " Space Map"; + txt += " " + MSG_NAMESPACEMAP; } lblMapSummary.setText(txt); - lblMapSummary.setFont(scaledFont); StringBuilder selectedMaps = new StringBuilder(); - selectedMaps.append(Messages.getString("ChatLounge.MapSummarySelectedMaps")); + selectedMaps.append(MSG_MAPSUMMARYSELECTEDMAPS); for (String map: mapSettings.getBoardsSelectedVector()) { selectedMaps.append("  "); if (map.startsWith(MapSettings.BOARD_SURPRISE)) { @@ -2178,8 +2274,7 @@ public void ready() { // enforce exclusive deployment zones in double blind for (Player player: client.getGame().getPlayersVector()) { if (!isValidStartPos(game, player)) { - clientgui.doAlertDialog(Messages.getString("ChatLounge.OverlapDeploy.title"), - Messages.getString("ChatLounge.OverlapDeploy.msg")); + clientgui.doAlertDialog(MSG_OVERLAPDEPLOYTITLE, MSG_OVERLAPDEPLOYMSG); return; } } @@ -2200,8 +2295,8 @@ public void ready() { } if (!players.isEmpty()) { - String title = Messages.getString("ChatLounge.noCmdr.title"); - String msg = Messages.getString("ChatLounge.noCmdr.msg"); + String title = MSG_NOCMDRTITLE; + String msg = MSG_NOCMDRMSG; for (String player : players) { msg += player + "\n"; } @@ -2944,7 +3039,7 @@ private TreePath getPath(Object outdatedEntry) { pathObjs[index++] = game().getEntity(entityId); return new TreePath(pathObjs); } else { - throw new IllegalArgumentException("Method requires Entity or Force object."); + throw new IllegalArgumentException(MSG_TREEPATHMETHODREQUIRESENTITYFORCE); } } @@ -3064,69 +3159,23 @@ private void setColumnWidth(TableColumn column) { /** Adapts the whole Lobby UI (both panels) to the current guiScale. */ private void adaptToGUIScale() { updateTableHeaders(); - setTableRowHeights(); refreshLabels(); refreshCamoButton(); refreshMapButtons(); mekModel.refreshCells(); - panTeamOverview.adaptToGUIScale(); Font scaledFont = UIUtil.getScaledFont(); - Font scaledBigFont = new Font("Dialog", Font.PLAIN, UIUtil.scaleForGUI(UIUtil.FONT_SCALE1 + 3)); - - butCompact.setFont(scaledFont); - butOptions.setFont(scaledBigFont); - butLoadList.setFont(scaledFont); - butSaveList.setFont(scaledFont); - butSkills.setFont(scaledFont); - butNames.setFont(scaledFont); - butAddBot.setFont(scaledFont); - butRemoveBot.setFont(scaledFont); - butConfigPlayer.setFont(scaledFont); - butBotSettings.setFont(scaledFont); - butShowUnitID.setFont(scaledFont); - butConditions.setFont(scaledFont); - butRandomMap.setFont(scaledFont); - butSpaceSize.setFont(scaledFont); - butBoardPreview.setFont(scaledFont); - butAddX.setFont(scaledFont); - butAddY.setFont(scaledFont); - comMapSizes.setFont(scaledFont); - comboTeam.setFont(scaledFont); - lblBoardsAvailable.setFont(scaledFont); - lblMapWidth.setFont(scaledFont); - butMapGrowW.setFont(scaledFont); - butMapShrinkW.setFont(scaledFont); - fldMapWidth.setFont(scaledFont); - lblMapHeight.setFont(scaledFont); - butMapGrowH.setFont(scaledFont); - butMapShrinkH.setFont(scaledFont); - fldMapHeight.setFont(scaledFont); - lblSpaceBoardWidth.setFont(scaledFont); - lblSpaceBoardHeight.setFont(scaledFont); - fldSpaceBoardWidth.setFont(scaledFont); - fldSpaceBoardHeight.setFont(scaledFont); - butGroundMap.setFont(scaledFont); - butLowAtmoMap.setFont(scaledFont); - butHighAtmoMap.setFont(scaledFont); - butSpaceMap.setFont(scaledFont); - lblBoardSize.setFont(scaledFont); - butSaveMapSetup.setFont(scaledFont); - butLoadMapSetup.setFont(scaledFont); - butDetach.setFont(scaledFont); - butCancelSearch.setFont(scaledFont); - butListView.setFont(scaledFont); - butForceView.setFont(scaledFont); - butCollapse.setFont(scaledFont); - butExpand.setFont(scaledFont); - - butAdd.setFont(scaledBigFont); - butArmy.setFont(scaledBigFont); - panTabs.setFont(scaledBigFont); - - lblSearch.setFont(scaledFont); - fldSearch.setFont(scaledFont); - String searchTip = Messages.getString("ChatLounge.map.searchTip") + "
"; + + UIUtil.adjustContainer(splitPaneMain, UIUtil.FONT_SCALE1); + UIUtil.scaleComp(butDone, UIUtil.FONT_SCALE2); + UIUtil.scaleComp(butOptions, UIUtil.FONT_SCALE2); + UIUtil.scaleComp(butAdd, UIUtil.FONT_SCALE2); + UIUtil.scaleComp(butArmy, UIUtil.FONT_SCALE2); + + + setTableRowHeights(); + + String searchTip = MSG_MAPSEARCHTIP + "
"; searchTip += autoTagHTMLTable(); fldSearch.setToolTipText(UIUtil.scaleStringForGUI(searchTip)); @@ -3136,10 +3185,10 @@ private void adaptToGUIScale() { int scaledBorder = UIUtil.scaleForGUI(TEAMOVERVIEW_BORDER); panTeam.setBorder(new EmptyBorder(scaledBorder, scaledBorder, scaledBorder, scaledBorder)); - butBoardPreview.setToolTipText(scaleMessageForGUI("BoardSelectionDialog.ViewGameBoardTooltip")); - butSaveMapSetup.setToolTipText(scaleMessageForGUI("ChatLounge.map.saveMapSetupTip")); - - Font scaledHelpFont = new Font("Dialog", Font.PLAIN, UIUtil.scaleForGUI(UIUtil.FONT_SCALE1 + 33)); + butBoardPreview.setToolTipText(scaleStringForGUI(MSG_VIEWGAMEBOARDTOOLTIP)); + butSaveMapSetup.setToolTipText(scaleStringForGUI(MSG_MAPSAVESETUPTIP)); + + Font scaledHelpFont = new Font(MMConstants.FONT_DIALOG, Font.PLAIN, UIUtil.scaleForGUI(UIUtil.FONT_SCALE1 + 33)); butHelp.setFont(scaledHelpFont); // Makes a new tooltip appear immediately (rescaled and possibly for a different unit) @@ -3181,10 +3230,8 @@ private String autoTagHTMLTable() { * Saves column widths of the Mek Table when the mouse button is released. * Also switches between table sorting types */ - MouseListener mekTableHeaderMouseListener = new MouseAdapter() - { - private void changeSorter(MouseEvent e) - { + MouseListener mekTableHeaderMouseListener = new MouseAdapter() { + private void changeSorter(MouseEvent e) { // Save table widths for (int i = 0; i < MekTableModel.N_COL; i++) { TableColumn column = mekTable.getColumnModel().getColumn(i); @@ -3230,7 +3277,6 @@ private void sorterPopup(MouseEvent e) { } popup.show(e.getComponent(), e.getX(), e.getY()); } - }; /** @@ -3313,7 +3359,6 @@ private void redrawMapTable(Image image) { lisBoardsAvailable.repaint(); } } - class ImageLoader extends SwingWorker { @@ -3330,7 +3375,7 @@ private synchronized void add(String name) { } private Image prepareImage(String boardName) { - File boardFile = new MegaMekFile(Configuration.boardsDir(), boardName + ".board").getFile(); + File boardFile = new MegaMekFile(Configuration.boardsDir(), boardName + CL_KEY_FILEEXTENTION_BOARD).getFile(); Board board; StringBuffer errs = new StringBuffer(); if (boardFile.exists()) { @@ -3425,7 +3470,7 @@ public Component getListCellRendererComponent(JList list, Object value, String board = (String) value; // For generated boards, add the size to have different images for different sizes if (board.startsWith(MapSettings.BOARD_GENERATED)) { - board += mapSettings.getBoardSize().toString(); + board += mapSettings.getBoardSize(); } // If the gui scaling has changed, clear out all images, triggering a reload @@ -3595,9 +3640,9 @@ private boolean hasSpecialBoard(String boardName, Collection list) { String createBoardTooltip(String boardName) { String result = ""; if (boardName.startsWith(MapSettings.BOARD_GENERATED)) { - result = "This board is generated using the current Generated
Map Settings when the game is started."; + result = MSG_BOARDGENERATEDMESSAGE; } else if (boardName.startsWith(MapSettings.BOARD_SURPRISE)) { - result = "This board is selected randomly from the following list
of boards when the game is started:
"; + result = MSG_BOARDRANDOMLYSELECTEDMESSAGE; result += boardName.substring(MapSettings.BOARD_SURPRISE.length()).replace("\n", "
"); } else { result = boardName; @@ -3606,7 +3651,7 @@ String createBoardTooltip(String boardName) { result += invalidBoardTip(); } if (hasServerSideBoard(boardName)) { - result += Messages.getString("ChatLounge.map.serverSideTip"); + result += MSG_MAPSERVERSIDETIP; } return result; } diff --git a/megamek/src/megamek/client/ui/swing/lobby/LobbyUtility.java b/megamek/src/megamek/client/ui/swing/lobby/LobbyUtility.java index eb192bf68cb..f7749f40e9e 100644 --- a/megamek/src/megamek/client/ui/swing/lobby/LobbyUtility.java +++ b/megamek/src/megamek/client/ui/swing/lobby/LobbyUtility.java @@ -18,18 +18,7 @@ */ package megamek.client.ui.swing.lobby; -import java.awt.Color; -import java.awt.Font; -import java.awt.FontMetrics; -import java.awt.Graphics; -import java.io.File; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.HashMap; -import java.util.HashSet; -import java.util.StringTokenizer; - +import megamek.MMConstants; import megamek.client.ui.Messages; import megamek.client.ui.swing.GUIPreferences; import megamek.client.ui.swing.util.UIUtil; @@ -38,6 +27,10 @@ import megamek.common.options.GameOptions; import megamek.common.options.OptionsConstants; +import java.awt.*; +import java.io.File; +import java.util.*; + /** * This class provides static helper functions for the Lobby aka ChatLounge. * @author Simon @@ -153,7 +146,7 @@ static void drawMinimapLabel(String text, int w, int h, Graphics g, boolean inva // The text size may grow with the width of the image, but no bigger than 16*guiscale // to avoid huge text int fontSize = Math.min(w / 10, UIUtil.scaleForGUI(16)); - Font font = new Font("Dialog", Font.PLAIN, fontSize); + Font font = new Font(MMConstants.FONT_DIALOG, Font.PLAIN, fontSize); g.setFont(font); FontMetrics fm = g.getFontMetrics(font); int th = fm.getAscent() + fm.getDescent(); // The text height diff --git a/megamek/src/megamek/client/ui/swing/lobby/MapPreviewButton.java b/megamek/src/megamek/client/ui/swing/lobby/MapPreviewButton.java index 873392de7f6..0e0fe5b16ed 100644 --- a/megamek/src/megamek/client/ui/swing/lobby/MapPreviewButton.java +++ b/megamek/src/megamek/client/ui/swing/lobby/MapPreviewButton.java @@ -18,6 +18,7 @@ */ package megamek.client.ui.swing.lobby; +import megamek.MMConstants; import megamek.client.ui.swing.GUIPreferences; import megamek.client.ui.swing.util.UIUtil; import megamek.common.MapSettings; @@ -189,7 +190,7 @@ private void drawIndex(Graphics g, int w, int h) { String text = Integer.toString(index + 1); int fontSize = Math.min(w, h) / 4; fontSize = Math.min(fontSize, UIUtil.scaleForGUI(45)); - g.setFont(new Font("Dialog", Font.PLAIN, fontSize)); + g.setFont(new Font(MMConstants.FONT_DIALOG, Font.PLAIN, fontSize)); FontMetrics fm = g.getFontMetrics(g.getFont()); int cx = (w - fm.stringWidth(text)) / 2; int cy = (h + fm.getAscent() - fm.getDescent()) / 2; @@ -200,7 +201,7 @@ private void drawIndex(Graphics g, int w, int h) { private void drawExample(Graphics g, int w, int h) { String text = "Example board"; int fontSize = Math.min(w / 10, UIUtil.scaleForGUI(25)); - g.setFont(new Font("Dialog", Font.ITALIC, fontSize)); + g.setFont(new Font(MMConstants.FONT_DIALOG, Font.ITALIC, fontSize)); FontMetrics fm = g.getFontMetrics(g.getFont()); int cx = (w - fm.stringWidth(text)) / 2; int cy = h / 10 + fm.getAscent(); diff --git a/megamek/src/megamek/client/ui/swing/lobby/MekForceTreeRenderer.java b/megamek/src/megamek/client/ui/swing/lobby/MekForceTreeRenderer.java index fddc4fe7b00..0a344d70165 100644 --- a/megamek/src/megamek/client/ui/swing/lobby/MekForceTreeRenderer.java +++ b/megamek/src/megamek/client/ui/swing/lobby/MekForceTreeRenderer.java @@ -18,6 +18,7 @@ */ package megamek.client.ui.swing.lobby; +import megamek.MMConstants; import megamek.client.ui.swing.tooltip.UnitToolTip; import megamek.client.ui.swing.util.UIUtil; import megamek.common.Configuration; @@ -69,7 +70,7 @@ public Component getTreeCellRendererComponent(JTree tree, Object value, boolean } if (value instanceof Entity) { - Font scaledFont = new Font("Dialog", Font.PLAIN, UIUtil.scaleForGUI(UIUtil.FONT_SCALE1)); + Font scaledFont = new Font(MMConstants.FONT_DIALOG, Font.PLAIN, UIUtil.scaleForGUI(UIUtil.FONT_SCALE1)); setFont(scaledFont); entity = (Entity) value; this.row = row; @@ -95,7 +96,7 @@ public Component getTreeCellRendererComponent(JTree tree, Object value, boolean } } else if (value instanceof Force) { entity = null; - Font scaledFont = new Font("Dialog", Font.PLAIN, UIUtil.scaleForGUI(UIUtil.FONT_SCALE1 + 3)); + Font scaledFont = new Font(MMConstants.FONT_DIALOG, Font.PLAIN, UIUtil.scaleForGUI(UIUtil.FONT_SCALE1 + 3)); setFont(scaledFont); Force force = (Force) value; if (lobby.isCompact()) { diff --git a/megamek/src/megamek/client/ui/swing/lobby/MekTableModel.java b/megamek/src/megamek/client/ui/swing/lobby/MekTableModel.java index f2350aed68e..68c423a0be6 100644 --- a/megamek/src/megamek/client/ui/swing/lobby/MekTableModel.java +++ b/megamek/src/megamek/client/ui/swing/lobby/MekTableModel.java @@ -241,6 +241,10 @@ private Player ownerOf(Entity entity) { /** Creates and returns the display content of the "Player" column for the given entity. */ private String playerCellContent(final Entity entity) { + if (entity == null) { + return ""; + } + StringBuilder result = new StringBuilder(""); Player owner = ownerOf(entity); boolean isEnemy = clientGui.getClient().getLocalPlayer().isEnemyOf(owner); diff --git a/megamek/src/megamek/client/ui/swing/lobby/PlayerSettingsDialog.java b/megamek/src/megamek/client/ui/swing/lobby/PlayerSettingsDialog.java index b604616d70d..f7374d79502 100644 --- a/megamek/src/megamek/client/ui/swing/lobby/PlayerSettingsDialog.java +++ b/megamek/src/megamek/client/ui/swing/lobby/PlayerSettingsDialog.java @@ -70,12 +70,13 @@ public PlayerSettingsDialog(ClientGUI cg, Client cl) { numFormatter.setMinimum(0); numFormatter.setCommitsOnValidEdit(true); + initialize(); } @Override protected void finalizeInitialization() throws Exception { - UIUtil.adjustDialog(this); + adaptToGUIScale(); super.finalizeInitialization(); } @@ -416,5 +417,7 @@ private int parseField(JTextField field) { return 0; } } - + private void adaptToGUIScale() { + UIUtil.adjustDialog(this, UIUtil.FONT_SCALE1); + } } diff --git a/megamek/src/megamek/client/ui/swing/lobby/TeamOverviewPanel.java b/megamek/src/megamek/client/ui/swing/lobby/TeamOverviewPanel.java index 031a0692ee1..873664c679b 100644 --- a/megamek/src/megamek/client/ui/swing/lobby/TeamOverviewPanel.java +++ b/megamek/src/megamek/client/ui/swing/lobby/TeamOverviewPanel.java @@ -18,6 +18,7 @@ */ package megamek.client.ui.swing.lobby; +import megamek.MMConstants; import megamek.client.ui.Messages; import megamek.client.ui.swing.ClientGUI; import megamek.client.ui.swing.GUIPreferences; @@ -77,8 +78,7 @@ public TeamOverviewPanel(ClientGUI cg) { colModel.getColumn(TOMCOLS.HIDDEN.ordinal()).setCellRenderer(centerRenderer); scrTeams.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER); add(scrTeams); - - adaptToGUIScale(); + refreshData(); } @@ -124,12 +124,6 @@ public void mouseReleased(MouseEvent e) { } }; - /** Adapts the row heights and headers to the current GUI scaling. */ - public void adaptToGUIScale() { - teamOverviewModel.updateRowHeights(); - refreshTableHeader(); - } - /** Refreshes the headers, setting the header names and gui scaling them. */ public void refreshTableHeader() { JTableHeader header = teamOverviewTable.getTableHeader(); @@ -422,7 +416,7 @@ public Component getTableCellRendererComponent(JTable table, Object value, boole Vector playerList = (Vector) value; int baseSize = FONT_SCALE1 - (isDetached ? 2 : 0); int size = scaleForGUI(2 * baseSize); - Font font = new Font("Dialog", Font.PLAIN, scaleForGUI(baseSize)); + Font font = new Font(MMConstants.FONT_DIALOG, Font.PLAIN, scaleForGUI(baseSize)); for (Object obj: playerList) { if (!(obj instanceof Player)) { continue; diff --git a/megamek/src/megamek/client/ui/swing/minimap/Minimap.java b/megamek/src/megamek/client/ui/swing/minimap/Minimap.java index 963cf161d57..59bdb212b50 100644 --- a/megamek/src/megamek/client/ui/swing/minimap/Minimap.java +++ b/megamek/src/megamek/client/ui/swing/minimap/Minimap.java @@ -20,6 +20,7 @@ */ package megamek.client.ui.swing.minimap; +import megamek.MMConstants; import megamek.client.Client; import megamek.client.event.BoardViewEvent; import megamek.client.event.BoardViewListener; @@ -33,7 +34,6 @@ import megamek.common.actions.EntityAction; import megamek.common.actions.WeaponAttackAction; import megamek.common.annotations.Nullable; -import megamek.common.enums.GamePhase; import megamek.common.event.*; import megamek.common.preference.IPreferenceChangeListener; import megamek.common.preference.PreferenceChangeEvent; @@ -509,7 +509,7 @@ private synchronized void drawMap(boolean forceDraw) { } addRoadElements(h, j, k); // Color invalid hexes red when in the Map Editor - if ((game != null) && (game.getPhase() == GamePhase.UNKNOWN) && !h.isValid(null)) { + if ((game != null) && game.getPhase().isUnknown() && !h.isValid(null)) { gg.setColor(GUIPreferences.getInstance().getWarningColor()); paintCoord(gg, j, k, true); } @@ -570,8 +570,7 @@ private synchronized void drawMap(boolean forceDraw) { /** Indicates the deployment hexes. */ private void drawDeploymentZone(Graphics g) { - if ((null != client) && (null != game) - && (GamePhase.DEPLOYMENT == game.getPhase()) && (dialog != null) + if ((null != client) && (null != game) && game.getPhase().isDeployment() && (dialog != null) && (bv.getDeployingEntity() != null)) { GameTurn turn = game.getTurn(); if ((turn != null) && (turn.getPlayerNum() == client.getLocalPlayer().getId())) { @@ -896,7 +895,7 @@ private void paintUnit(Graphics g, Entity entity) { if (EntityVisibilityUtils.onlyDetectedBySensors(bv.getLocalPlayer(), entity)) { // This unit is visible only as a sensor Return String sensorReturn = "?"; - Font font = new Font("SansSerif", Font.BOLD, FONT_SIZE[zoom]); + Font font = new Font(MMConstants.FONT_SANS_SERIF, Font.BOLD, FONT_SIZE[zoom]); int width = getFontMetrics(font).stringWidth(sensorReturn) / 2; int height = getFontMetrics(font).getHeight() / 2 - 2; g.setFont(font); @@ -940,14 +939,12 @@ private void paintUnit(Graphics g, Entity entity) { Path2D form = MinimapUnitSymbols.getForm(entity); - Color borderColor = Color.WHITE; + Color borderColor = entity.moved != EntityMovementType.MOVE_NONE ? Color.BLACK : Color.WHITE; Color fontColor = Color.BLACK; - if (entity.moved != EntityMovementType.MOVE_NONE) { - borderColor = Color.BLACK; - } - + float outerBorderWidth = 30f; - float innerBorderWidth = 20f; + float innerBorderWidth = 10f; + float formStrokeWidth = 20f; if (stratOpsSymbols) { // White border to set off the icon from the background @@ -959,15 +956,12 @@ private void paintUnit(Graphics g, Entity entity) { g2.setColor(fontColor); g2.fill(STRAT_BASERECT); - // Rectangle border for all units - g2.setColor(borderColor); - g2.setStroke(new BasicStroke(innerBorderWidth, BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL)); - g2.draw(STRAT_BASERECT); - // Set a thin brush for filled areas (leave a thick brush for line symbols if ((entity instanceof Mech) || (entity instanceof Protomech) || (entity instanceof VTOL) || (entity.isAero())) { g2.setStroke(new BasicStroke(1f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER)); + } else { + g2.setStroke(new BasicStroke(formStrokeWidth, BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL)); } // Fill the form in player color / team color @@ -987,7 +981,7 @@ private void paintUnit(Graphics g, Entity entity) { } if (!s.isBlank()) { var fontContext = new FontRenderContext(null, true, true); - var font = new Font("SansSerif", Font.BOLD, 100); + var font = new Font(MMConstants.FONT_SANS_SERIF, Font.BOLD, 100); FontMetrics currentMetrics = getFontMetrics(font); int stringWidth = currentMetrics.stringWidth(s); GlyphVector gv = font.createGlyphVector(fontContext, s); @@ -1001,6 +995,11 @@ private void paintUnit(Graphics g, Entity entity) { // Draw the unit icon in black g2.draw(form); + // Rectangle border for all units + g2.setColor(borderColor); + g2.setStroke(new BasicStroke(innerBorderWidth, BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL)); + g2.draw(STRAT_BASERECT); + } else { // Standard symbols // White border to set off the icon from the background @@ -1343,10 +1342,11 @@ public void boardChangedHex(BoardEvent b) { private final GameListener gameListener = new GameListenerAdapter() { @Override public void gamePhaseChange(GamePhaseChangeEvent e) { - if (GUIPreferences.getInstance().getGameSummaryMinimap() && ((e.getOldPhase() == GamePhase.DEPLOYMENT) - || (e.getOldPhase() == GamePhase.MOVEMENT) || (e.getOldPhase() == GamePhase.TARGETING) - || (e.getOldPhase() == GamePhase.PREMOVEMENT) || (e.getOldPhase() == GamePhase.PREFIRING) - || (e.getOldPhase() == GamePhase.FIRING) || (e.getOldPhase() == GamePhase.PHYSICAL))) { + if (GUIPreferences.getInstance().getGameSummaryMinimap() + && (e.getOldPhase().isDeployment() || e.getOldPhase().isMovement() + || e.getOldPhase().isTargeting() || e.getOldPhase().isPremovement() + || e.getOldPhase().isPrefiring() || e.getOldPhase().isFiring() + || e.getOldPhase().isPhysical())) { File dir = new File(Configuration.gameSummaryImagesMMDir(), game.getUUIDString()); if (!dir.exists()) { dir.mkdirs(); @@ -1358,7 +1358,6 @@ public void gamePhaseChange(GamePhaseChangeEvent e) { } catch (Exception ex) { LogManager.getLogger().error("", ex); } - } refreshMap(); } diff --git a/megamek/src/megamek/client/ui/swing/tooltip/PilotToolTip.java b/megamek/src/megamek/client/ui/swing/tooltip/PilotToolTip.java index 195d0b31f2b..e3b5c2a5bde 100644 --- a/megamek/src/megamek/client/ui/swing/tooltip/PilotToolTip.java +++ b/megamek/src/megamek/client/ui/swing/tooltip/PilotToolTip.java @@ -33,7 +33,6 @@ import static megamek.client.ui.swing.tooltip.TipUtil.getOptionList; import static megamek.client.ui.swing.tooltip.TipUtil.scaledHTMLSpacer; import static megamek.client.ui.swing.util.UIUtil.guiScaledFontHTML; -import static megamek.client.ui.swing.util.UIUtil.scaleForGUI; import static megamek.client.ui.swing.util.UIUtil.uiQuirksColor; public final class PilotToolTip { @@ -133,7 +132,7 @@ private static StringBuilder crewPortraits(final Entity entity, boolean showDefa try { // Adjust the portrait size to the GUI scale and number of pilots - float imgSize = scaleForGUI(PORTRAIT_BASESIZE); + float imgSize = UIUtil.scaleForGUI(PORTRAIT_BASESIZE); imgSize /= 0.2f * (crew.getSlotCount() - 1) + 1; Image portrait = crew.getPortrait(i).getBaseImage().getScaledInstance(-1, (int) imgSize, Image.SCALE_SMOOTH); // Write the scaled portrait to file diff --git a/megamek/src/megamek/client/ui/swing/tooltip/UnitToolTip.java b/megamek/src/megamek/client/ui/swing/tooltip/UnitToolTip.java index 7be100109fd..28bd4d59a42 100644 --- a/megamek/src/megamek/client/ui/swing/tooltip/UnitToolTip.java +++ b/megamek/src/megamek/client/ui/swing/tooltip/UnitToolTip.java @@ -13,18 +13,12 @@ */ package megamek.client.ui.swing.tooltip; -import java.awt.Color; -import java.text.MessageFormat; -import java.util.*; -import java.util.Map.Entry; -import java.util.stream.Collectors; import megamek.client.ui.Messages; import megamek.client.ui.swing.GUIPreferences; import megamek.client.ui.swing.util.UIUtil; import megamek.common.*; import megamek.common.annotations.Nullable; -import megamek.common.enums.GamePhase; -import megamek.common.options.*; +import megamek.common.options.OptionsConstants; import megamek.common.preference.PreferenceManager; import megamek.common.templates.TROView; import megamek.common.weapons.LegAttack; @@ -33,9 +27,18 @@ import megamek.common.weapons.SwarmWeaponAttack; import org.apache.logging.log4j.LogManager; +import java.awt.*; +import java.text.MessageFormat; +import java.util.ArrayList; +import java.util.Comparator; +import java.util.HashMap; +import java.util.List; +import java.util.Map.Entry; +import java.util.stream.Collectors; + +import static megamek.client.ui.Messages.getString; import static megamek.client.ui.swing.tooltip.TipUtil.*; import static megamek.client.ui.swing.util.UIUtil.*; -import static megamek.client.ui.Messages.*; public final class UnitToolTip { @@ -614,10 +617,10 @@ private static StringBuilder inGameValues(Entity entity, Player localPlayer) { // Actual Movement if (!isGunEmplacement) { // "Has not yet moved" only during movement phase - if (!entity.isDone() && game.getPhase() == GamePhase.MOVEMENT) { + if (!entity.isDone() && game.getPhase().isMovement()) { result.append(addToTT("NotYetMoved", BR)); - } else if ((entity.isDone() && game.getPhase() == GamePhase.MOVEMENT) - || game.getPhase() == GamePhase.FIRING) { + } else if ((entity.isDone() && game.getPhase().isMovement()) + || game.getPhase().isFiring()) { result.append(guiScaledFontHTML(GUIPreferences.getInstance().getColorForMovement(entity.moved))); int tmm = Compute.getTargetMovementModifier(game, entity.getId()).getValue(); if (entity.moved == EntityMovementType.MOVE_NONE) { diff --git a/megamek/src/megamek/client/ui/swing/unitDisplay/ExtraPanel.java b/megamek/src/megamek/client/ui/swing/unitDisplay/ExtraPanel.java index 171b880d0bb..0a24bbc6010 100644 --- a/megamek/src/megamek/client/ui/swing/unitDisplay/ExtraPanel.java +++ b/megamek/src/megamek/client/ui/swing/unitDisplay/ExtraPanel.java @@ -7,10 +7,13 @@ import megamek.client.ui.swing.GUIPreferences; import megamek.client.ui.swing.HeatEffects; import megamek.client.ui.swing.Slider; +import megamek.client.ui.swing.util.UIUtil; import megamek.client.ui.swing.widget.*; import megamek.common.*; import megamek.common.enums.GamePhase; import megamek.common.options.OptionsConstants; +import megamek.common.preference.IPreferenceChangeListener; +import megamek.common.preference.PreferenceChangeEvent; import megamek.common.util.fileUtils.MegaMekFile; import javax.swing.*; @@ -24,9 +27,11 @@ /** * This class shows information about a unit that doesn't belong elsewhere. */ -class ExtraPanel extends PicMap implements ActionListener, ItemListener { +class ExtraPanel extends PicMap implements ActionListener, ItemListener, IPreferenceChangeListener { private final UnitDisplay unitDisplay; + private JPanel panelMain; + private JScrollPane scrollPane; private JLabel lblLastTarget; private JLabel curSensorsL; private JLabel narcLabel; @@ -154,7 +159,7 @@ public Component getListCellRendererComponent(JList list, Object value, int i gridbag = new GridBagLayout(); c = new GridBagConstraints(); - setLayout(gridbag); + panelMain = new JPanel(gridbag); c.fill = GridBagConstraints.BOTH; c.insets = new Insets(15, 9, 1, 9); @@ -163,65 +168,71 @@ public Component getListCellRendererComponent(JList list, Object value, int i c.weighty = 1.0; gridbag.setConstraints(curSensorsL, c); - add(curSensorsL); + panelMain.add(curSensorsL); gridbag.setConstraints(chSensors, c); - add(chSensors); + panelMain.add(chSensors); gridbag.setConstraints(narcLabel, c); - add(narcLabel); + panelMain.add(narcLabel); c.insets = new Insets(1, 9, 1, 9); - JScrollPane scrollPane = new JScrollPane(narcList); + scrollPane = new JScrollPane(narcList); scrollPane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER); gridbag.setConstraints(scrollPane, c); - add(scrollPane); + panelMain.add(scrollPane); gridbag.setConstraints(unusedL, c); - add(unusedL); + panelMain.add(unusedL); gridbag.setConstraints(unusedR, c); - add(unusedR); + panelMain.add(unusedR); gridbag.setConstraints(carrysL, c); - add(carrysL); + panelMain.add(carrysL); gridbag.setConstraints(carrysR, c); - add(carrysR); + panelMain.add(carrysR); gridbag.setConstraints(dumpBombs, c); - add(dumpBombs); + panelMain.add(dumpBombs); gridbag.setConstraints(sinksL, c); - add(sinksL); + panelMain.add(sinksL); gridbag.setConstraints(sinksR, c); - add(sinksR); + panelMain.add(sinksR); gridbag.setConstraints(sinks2B, c); - add(sinks2B); + panelMain.add(sinks2B); gridbag.setConstraints(heatL, c); - add(heatL); + panelMain.add(heatL); c.insets = new Insets(1, 9, 18, 9); gridbag.setConstraints(heatR, c); - add(heatR); + panelMain.add(heatR); c.insets = new Insets(0, 0, 0, 0); gridbag.setConstraints(lblLastTarget, c); - add(lblLastTarget); + panelMain.add(lblLastTarget); c.insets = new Insets(1, 9, 18, 9); gridbag.setConstraints(lastTargetR, c); - add(lastTargetR); + panelMain.add(lastTargetR); c.insets = new Insets(1, 9, 1, 9); gridbag.setConstraints(activateHidden, c); c.insets = new Insets(1, 9, 6, 9); gridbag.setConstraints(comboActivateHiddenPhase, c); - add(activateHidden); - add(comboActivateHiddenPhase); + panelMain.add(activateHidden); + panelMain.add(comboActivateHiddenPhase); + + adaptToGUIScale(); + GUIPreferences.getInstance().addPreferenceChangeListener(this); + setLayout(new BorderLayout()); + add(panelMain); + panelMain.setOpaque(false); setBackGround(); onResize(); @@ -610,4 +621,18 @@ public void actionPerformed(ActionEvent ae) { clientgui.getClient().sendActivateHidden(myMechId, (phase == null) ? GamePhase.UNKNOWN : phase); } } + + private void adaptToGUIScale() { + UIUtil.adjustContainer(panelMain, UIUtil.FONT_SCALE1); + scrollPane.setMinimumSize(new Dimension(200, UIUtil.scaleForGUI(100))); + scrollPane.setPreferredSize(new Dimension(200, UIUtil.scaleForGUI(100))); + } + + @Override + public void preferenceChange(PreferenceChangeEvent e) { + // Update the text size when the GUI scaling changes + if (e.getName().equals(GUIPreferences.GUI_SCALE)) { + adaptToGUIScale(); + } + } } diff --git a/megamek/src/megamek/client/ui/swing/unitDisplay/SystemPanel.java b/megamek/src/megamek/client/ui/swing/unitDisplay/SystemPanel.java index 4f58d3c069f..88899be49ef 100644 --- a/megamek/src/megamek/client/ui/swing/unitDisplay/SystemPanel.java +++ b/megamek/src/megamek/client/ui/swing/unitDisplay/SystemPanel.java @@ -4,10 +4,13 @@ import megamek.client.ui.Messages; import megamek.client.ui.swing.ChoiceDialog; import megamek.client.ui.swing.ClientGUI; +import megamek.client.ui.swing.GUIPreferences; +import megamek.client.ui.swing.util.UIUtil; import megamek.client.ui.swing.widget.*; import megamek.common.*; -import megamek.common.enums.GamePhase; import megamek.common.options.OptionsConstants; +import megamek.common.preference.IPreferenceChangeListener; +import megamek.common.preference.PreferenceChangeEvent; import megamek.common.util.fileUtils.MegaMekFile; import javax.swing.*; @@ -24,7 +27,7 @@ /** * This class shows the critical hits and systems for a mech */ -class SystemPanel extends PicMap implements ItemListener, ActionListener, ListSelectionListener { +class SystemPanel extends PicMap implements ItemListener, ActionListener, ListSelectionListener, IPreferenceChangeListener { private static int LOC_ALL_EQUIP = 0; private static int LOC_ALL_WEAPS = 1; @@ -35,6 +38,8 @@ class SystemPanel extends PicMap implements ItemListener, ActionListener, ListSe private static final long serialVersionUID = 6660316427898323590L; + private JPanel panelMain; + private JScrollPane tSlotScroll; private JLabel locLabel; private JLabel slotLabel; private JLabel modeLabel; @@ -91,7 +96,7 @@ class SystemPanel extends PicMap implements ItemListener, ActionListener, ListSe // layout main panel GridBagLayout gridbag = new GridBagLayout(); GridBagConstraints c = new GridBagConstraints(); - setLayout(gridbag); + panelMain = new JPanel(gridbag); c.fill = GridBagConstraints.BOTH; c.insets = new Insets(15, 9, 1, 1); @@ -102,7 +107,7 @@ class SystemPanel extends PicMap implements ItemListener, ActionListener, ListSe c.gridwidth = 1; c.gridheight = 1; gridbag.setConstraints(locLabel, c); - add(locLabel); + panelMain.add(locLabel); c.weightx = 0.0; c.gridy = 0; @@ -110,7 +115,7 @@ class SystemPanel extends PicMap implements ItemListener, ActionListener, ListSe c.gridwidth = GridBagConstraints.REMAINDER; c.insets = new Insets(15, 1, 1, 9); gridbag.setConstraints(slotLabel, c); - add(slotLabel); + panelMain.add(slotLabel); c.weightx = 0.5; // c.weighty = 1.0; @@ -120,7 +125,7 @@ class SystemPanel extends PicMap implements ItemListener, ActionListener, ListSe c.insets = new Insets(1, 9, 15, 1); c.gridheight = 1; gridbag.setConstraints(locList, c); - add(locList); + panelMain.add(locList); c.fill = GridBagConstraints.BOTH; c.insets = new Insets(15, 9, 1, 1); @@ -131,7 +136,7 @@ class SystemPanel extends PicMap implements ItemListener, ActionListener, ListSe c.gridwidth = 1; c.gridheight = 1; gridbag.setConstraints(unitLabel, c); - add(unitLabel); + panelMain.add(unitLabel); c.weightx = 0.5; // c.weighty = 1.0; @@ -141,7 +146,7 @@ class SystemPanel extends PicMap implements ItemListener, ActionListener, ListSe c.insets = new Insets(1, 9, 15, 1); c.gridheight = GridBagConstraints.REMAINDER; gridbag.setConstraints(unitList, c); - add(unitList); + panelMain.add(unitList); c.gridwidth = GridBagConstraints.REMAINDER; c.gridheight = 1; @@ -150,10 +155,10 @@ class SystemPanel extends PicMap implements ItemListener, ActionListener, ListSe c.weightx = 0.0; c.weighty = 1.0; c.insets = new Insets(1, 1, 1, 9); - JScrollPane tSlotScroll = new JScrollPane(slotList); + tSlotScroll = new JScrollPane(slotList); tSlotScroll.setMinimumSize(new Dimension(200, 100)); gridbag.setConstraints(tSlotScroll, c); - add(tSlotScroll); + panelMain.add(tSlotScroll); c.gridwidth = 1; c.gridy = 2; @@ -162,7 +167,7 @@ class SystemPanel extends PicMap implements ItemListener, ActionListener, ListSe c.weighty = 0.0; gridbag.setConstraints(modeLabel, c); c.insets = new Insets(1, 1, 1, 1); - add(modeLabel); + panelMain.add(modeLabel); c.weightx = 1.0; c.gridwidth = GridBagConstraints.REMAINDER; @@ -170,7 +175,7 @@ class SystemPanel extends PicMap implements ItemListener, ActionListener, ListSe c.gridx = 2; c.insets = new Insets(1, 1, 1, 9); gridbag.setConstraints(m_chMode, c); - add(m_chMode); + panelMain.add(m_chMode); c.gridwidth = GridBagConstraints.REMAINDER; c.gridheight = GridBagConstraints.REMAINDER; @@ -178,7 +183,13 @@ class SystemPanel extends PicMap implements ItemListener, ActionListener, ListSe c.gridx = 1; c.insets = new Insets(4, 4, 15, 9); gridbag.setConstraints(m_bDumpAmmo, c); - add(m_bDumpAmmo); + panelMain.add(m_bDumpAmmo); + + adaptToGUIScale(); + GUIPreferences.getInstance().addPreferenceChangeListener(this); + setLayout(new BorderLayout()); + add(panelMain); + panelMain.setOpaque(false); setBackGround(); onResize(); @@ -460,7 +471,7 @@ public void itemStateChanged(ItemEvent ev) { if ((m.getType() instanceof MiscType) && m.getType().hasSubType(MiscType.S_RETRACTABLE_BLADE) - && (clientgui.getClient().getGame().getPhase() != GamePhase.MOVEMENT)) { + && !clientgui.getClient().getGame().getPhase().isMovement()) { clientgui.systemMessage(Messages.getString("MechDisplay.RetractableBladeModePhase")); return; } @@ -486,7 +497,7 @@ public void itemStateChanged(ItemEvent ev) { this.unitDisplay.wPan.displayMech(en); this.unitDisplay.wPan.selectWeapon(weap); } else { - if (GamePhase.DEPLOYMENT == clientgui.getClient().getGame().getPhase()) { + if (clientgui.getClient().getGame().getPhase().isDeployment()) { clientgui.systemMessage(Messages.getString("MechDisplay.willSwitchAtStart", m.getName(), m.pendingMode().getDisplayableName())); } else { @@ -723,8 +734,8 @@ public void valueChanged(ListSelectionEvent event) { if ((m != null) && bOwner && (m.getType() instanceof AmmoType) - && (client.getGame().getPhase() != GamePhase.DEPLOYMENT) - && (client.getGame().getPhase() != GamePhase.MOVEMENT) + && !client.getGame().getPhase().isDeployment() + && !client.getGame().getPhase().isMovement() && (m.getUsableShotsLeft() > 0) && !m.isDumping() && en.isActive() @@ -829,4 +840,18 @@ private void removeListeners() { m_chMode.removeItemListener(this); m_bDumpAmmo.removeActionListener(this); } + + private void adaptToGUIScale() { + UIUtil.adjustContainer(panelMain, UIUtil.FONT_SCALE1); + tSlotScroll.setMinimumSize(new Dimension(200, UIUtil.scaleForGUI(100))); + tSlotScroll.setPreferredSize(new Dimension(200, UIUtil.scaleForGUI(100))); + } + + @Override + public void preferenceChange(PreferenceChangeEvent e) { + // Update the text size when the GUI scaling changes + if (e.getName().equals(GUIPreferences.GUI_SCALE)) { + adaptToGUIScale(); + } + } } \ No newline at end of file diff --git a/megamek/src/megamek/client/ui/swing/unitDisplay/WeaponPanel.java b/megamek/src/megamek/client/ui/swing/unitDisplay/WeaponPanel.java index 613a58e6c33..0acb416fcc5 100644 --- a/megamek/src/megamek/client/ui/swing/unitDisplay/WeaponPanel.java +++ b/megamek/src/megamek/client/ui/swing/unitDisplay/WeaponPanel.java @@ -1,15 +1,19 @@ package megamek.client.ui.swing.unitDisplay; +import megamek.MMConstants; import megamek.client.event.MechDisplayEvent; import megamek.client.ui.GBC; import megamek.client.ui.Messages; import megamek.client.ui.baseComponents.MMComboBox; import megamek.client.ui.swing.*; +import megamek.client.ui.swing.util.UIUtil; import megamek.client.ui.swing.widget.*; import megamek.common.*; import megamek.common.annotations.Nullable; import megamek.common.enums.WeaponSortOrder; import megamek.common.options.OptionsConstants; +import megamek.common.preference.IPreferenceChangeListener; +import megamek.common.preference.PreferenceChangeEvent; import megamek.common.util.fileUtils.MegaMekFile; import megamek.common.weapons.bayweapons.BayWeapon; import megamek.common.weapons.gaussrifles.HAGWeapon; @@ -24,13 +28,13 @@ import java.awt.event.ActionListener; import java.awt.event.KeyListener; import java.awt.event.MouseEvent; -import java.util.*; import java.util.List; +import java.util.*; /** * This class contains the all the gizmos for firing the mech's weapons. */ -public class WeaponPanel extends PicMap implements ListSelectionListener, ActionListener { +public class WeaponPanel extends PicMap implements ListSelectionListener, ActionListener, IPreferenceChangeListener { /** * Mouse adaptor for the weapon list. Supports rearranging the weapons * to define a custom ordering. @@ -289,6 +293,8 @@ public void sort(Comparator comparator) { * after the forced target. */ private Targetable prevTarget = null; + private JPanel panelMain; + private JScrollPane tWeaponScroll; private JComboBox m_chAmmo; public JComboBox m_chBayWeapon; @@ -358,7 +364,7 @@ public void sort(Comparator comparator) { WeaponPanel(UnitDisplay unitDisplay) { this.unitDisplay = unitDisplay; - setLayout(new GridBagLayout()); + panelMain = new JPanel(new GridBagLayout()); int gridy = 0; wSortOrder = new JLabel( @@ -366,10 +372,10 @@ public void sort(Comparator comparator) { SwingConstants.LEFT); wSortOrder.setOpaque(false); wSortOrder.setForeground(Color.WHITE); - add(wSortOrder, GBC.std().fill(GridBagConstraints.HORIZONTAL) + panelMain.add(wSortOrder, GBC.std().fill(GridBagConstraints.HORIZONTAL) .insets(15, 9, 1, 1).gridy(gridy).gridx(0)); comboWeaponSortOrder = new MMComboBox<>("comboWeaponSortOrder", WeaponSortOrder.values()); - add(comboWeaponSortOrder, + panelMain.add(comboWeaponSortOrder, GBC.eol().insets(15, 9, 15, 1) .fill(GridBagConstraints.HORIZONTAL) .anchor(GridBagConstraints.CENTER).gridy(gridy) @@ -381,10 +387,10 @@ public void sort(Comparator comparator) { WeaponListMouseAdapter mouseAdapter = new WeaponListMouseAdapter(); weaponList.addMouseListener(mouseAdapter); weaponList.addMouseMotionListener(mouseAdapter); - JScrollPane tWeaponScroll = new JScrollPane(weaponList); + tWeaponScroll = new JScrollPane(weaponList); tWeaponScroll.setMinimumSize(new Dimension(200, 100)); tWeaponScroll.setPreferredSize(new Dimension(200, 100)); - add(tWeaponScroll, + panelMain.add(tWeaponScroll, GBC.eol().insets(15, 9, 15, 9) .fill(GridBagConstraints.HORIZONTAL) .anchor(GridBagConstraints.CENTER).gridy(gridy) @@ -407,14 +413,14 @@ public void sort(Comparator comparator) { wBayWeapon.setForeground(Color.WHITE); m_chBayWeapon = new JComboBox<>(); - add(wBayWeapon, GBC.std().insets(15, 1, 1, 1).gridy(gridy).gridx(0)); + panelMain.add(wBayWeapon, GBC.std().insets(15, 1, 1, 1).gridy(gridy).gridx(0)); - add(m_chBayWeapon, GBC.std().fill(GridBagConstraints.HORIZONTAL) + panelMain.add(m_chBayWeapon, GBC.std().fill(GridBagConstraints.HORIZONTAL) .insets(1, 1, 15, 1).gridy(gridy).gridx(1)); gridy++; - add(wAmmo, GBC.std().insets(15, 9, 1, 1).gridy(gridy).gridx(0)); + panelMain.add(wAmmo, GBC.std().insets(15, 9, 1, 1).gridy(gridy).gridx(0)); - add(m_chAmmo, + panelMain.add(m_chAmmo, GBC.eol().fill(GridBagConstraints.HORIZONTAL) .insets(1, 9, 15, 1).gridy(gridy).gridx(1)); gridy++; @@ -427,12 +433,12 @@ public void sort(Comparator comparator) { currentHeatBuildupR.setOpaque(false); currentHeatBuildupR.setForeground(Color.WHITE); - add(currentHeatBuildupL, + panelMain.add(currentHeatBuildupL, GBC.std().fill(GridBagConstraints.HORIZONTAL) .anchor(GridBagConstraints.EAST).insets(9, 1, 1, 9) .gridy(gridy).gridx(0)); - add(currentHeatBuildupR, + panelMain.add(currentHeatBuildupR, GBC.std().fill(GridBagConstraints.HORIZONTAL) .insets(1, 1, 9, 9).gridy(gridy).gridx(1)); gridy++; @@ -470,40 +476,40 @@ public void sort(Comparator comparator) { wDamageTrooperR.setOpaque(false); wDamageTrooperR.setForeground(Color.WHITE); - add(wNameL, + panelMain.add(wNameL, GBC.std().fill(GridBagConstraints.HORIZONTAL) .insets(1, 9, 1, 1).gridy(gridy).gridx(0)); - add(wHeatL, + panelMain.add(wHeatL, GBC.std().fill(GridBagConstraints.HORIZONTAL) .insets(1, 9, 1, 1).gridy(gridy).gridx(1)); - add(wDamL, + panelMain.add(wDamL, GBC.std().fill(GridBagConstraints.HORIZONTAL) .insets(1, 9, 1, 1).gridy(gridy).gridx(2)); - add(wArcHeatL, GBC.std().fill(GridBagConstraints.HORIZONTAL) + panelMain.add(wArcHeatL, GBC.std().fill(GridBagConstraints.HORIZONTAL) .insets(1, 9, 1, 1).gridy(gridy).gridx(3)); - add(wDamageTrooperL, GBC.std().fill(GridBagConstraints.HORIZONTAL) + panelMain.add(wDamageTrooperL, GBC.std().fill(GridBagConstraints.HORIZONTAL) .insets(1, 9, 1, 1).gridy(gridy).gridx(3)); gridy++; - add(wNameR, + panelMain.add(wNameR, GBC.std().fill(GridBagConstraints.HORIZONTAL) .insets(1, 9, 1, 1).gridy(gridy).gridx(0)); - add(wHeatR, + panelMain.add(wHeatR, GBC.std().fill(GridBagConstraints.HORIZONTAL) .insets(1, 9, 1, 1).gridy(gridy).gridx(1)); - add(wDamR, + panelMain.add(wDamR, GBC.std().fill(GridBagConstraints.HORIZONTAL) .insets(1, 9, 1, 1).gridy(gridy).gridx(2)); - add(wArcHeatR, GBC.std().fill(GridBagConstraints.HORIZONTAL) + panelMain.add(wArcHeatR, GBC.std().fill(GridBagConstraints.HORIZONTAL) .insets(1, 9, 1, 1).gridy(gridy).gridx(3)); - add(wDamageTrooperR, GBC.std().fill(GridBagConstraints.HORIZONTAL) + panelMain.add(wDamageTrooperR, GBC.std().fill(GridBagConstraints.HORIZONTAL) .insets(1, 9, 1, 1).gridy(gridy).gridx(3)); gridy++; // Adding range labels @@ -590,103 +596,103 @@ public void sort(Comparator comparator) { wInfantryRange5R.setOpaque(false); wInfantryRange5R.setForeground(Color.WHITE); - add(wMinL, + panelMain.add(wMinL, GBC.std().fill(GridBagConstraints.HORIZONTAL) .insets(1, 9, 9, 1).gridy(gridy).gridx(0)); - add(wShortL, + panelMain.add(wShortL, GBC.std().fill(GridBagConstraints.HORIZONTAL) .insets(1, 9, 9, 1).gridy(gridy).gridx(1)); - add(wMedL, + panelMain.add(wMedL, GBC.std().fill(GridBagConstraints.HORIZONTAL) .insets(1, 9, 9, 1).gridy(gridy).gridx(2)); - add(wLongL, + panelMain.add(wLongL, GBC.std().fill(GridBagConstraints.HORIZONTAL) .insets(1, 9, 9, 1).gridy(gridy).gridx(3)); - add(wExtL, + panelMain.add(wExtL, GBC.std().fill(GridBagConstraints.HORIZONTAL) .insets(1, 9, 9, 1).gridy(gridy).gridx(4)); - add(wInfantryRange0L, GBC.std().fill(GridBagConstraints.HORIZONTAL) + panelMain.add(wInfantryRange0L, GBC.std().fill(GridBagConstraints.HORIZONTAL) .insets(1, 9, 9, 1).gridy(gridy).gridx(0)); - add(wInfantryRange1L, GBC.std().fill(GridBagConstraints.HORIZONTAL) + panelMain.add(wInfantryRange1L, GBC.std().fill(GridBagConstraints.HORIZONTAL) .insets(1, 9, 9, 1).gridy(gridy).gridx(1)); - add(wInfantryRange2L, GBC.std().fill(GridBagConstraints.HORIZONTAL) + panelMain.add(wInfantryRange2L, GBC.std().fill(GridBagConstraints.HORIZONTAL) .insets(1, 9, 9, 1).gridy(gridy).gridx(2)); - add(wInfantryRange3L, GBC.std().fill(GridBagConstraints.HORIZONTAL) + panelMain.add(wInfantryRange3L, GBC.std().fill(GridBagConstraints.HORIZONTAL) .insets(1, 9, 9, 1).gridy(gridy).gridx(3)); - add(wInfantryRange4L, GBC.std().fill(GridBagConstraints.HORIZONTAL) + panelMain.add(wInfantryRange4L, GBC.std().fill(GridBagConstraints.HORIZONTAL) .insets(1, 9, 9, 1).gridy(gridy).gridx(4)); - add(wInfantryRange5L, GBC.std().fill(GridBagConstraints.HORIZONTAL) + panelMain.add(wInfantryRange5L, GBC.std().fill(GridBagConstraints.HORIZONTAL) .insets(1, 9, 9, 1).gridy(gridy).gridx(4)); gridy++; // ---------------- - add(wMinR, + panelMain.add(wMinR, GBC.std().fill(GridBagConstraints.HORIZONTAL) .insets(1, 9, 9, 1).gridy(gridy).gridx(0)); - add(wShortR, + panelMain.add(wShortR, GBC.std().fill(GridBagConstraints.HORIZONTAL) .insets(1, 9, 9, 1).gridy(gridy).gridx(1)); - add(wMedR, + panelMain.add(wMedR, GBC.std().fill(GridBagConstraints.HORIZONTAL) .insets(1, 9, 9, 1).gridy(gridy).gridx(2)); - add(wLongR, + panelMain.add(wLongR, GBC.std().fill(GridBagConstraints.HORIZONTAL) .insets(1, 9, 9, 1).gridy(gridy).gridx(3)); - add(wExtR, + panelMain.add(wExtR, GBC.std().fill(GridBagConstraints.HORIZONTAL) .insets(1, 9, 9, 1).gridy(gridy).gridx(4)); - add(wInfantryRange0R, GBC.std().fill(GridBagConstraints.HORIZONTAL) + panelMain.add(wInfantryRange0R, GBC.std().fill(GridBagConstraints.HORIZONTAL) .insets(1, 9, 9, 1).gridy(gridy).gridx(0)); - add(wInfantryRange1R, GBC.std().fill(GridBagConstraints.HORIZONTAL) + panelMain.add(wInfantryRange1R, GBC.std().fill(GridBagConstraints.HORIZONTAL) .insets(1, 9, 9, 1).gridy(gridy).gridx(1)); - add(wInfantryRange2R, GBC.std().fill(GridBagConstraints.HORIZONTAL) + panelMain.add(wInfantryRange2R, GBC.std().fill(GridBagConstraints.HORIZONTAL) .insets(1, 9, 9, 1).gridy(gridy).gridx(2)); - add(wInfantryRange3R, GBC.std().fill(GridBagConstraints.HORIZONTAL) + panelMain.add(wInfantryRange3R, GBC.std().fill(GridBagConstraints.HORIZONTAL) .insets(1, 9, 9, 1).gridy(gridy).gridx(3)); - add(wInfantryRange4R, GBC.std().fill(GridBagConstraints.HORIZONTAL) + panelMain.add(wInfantryRange4R, GBC.std().fill(GridBagConstraints.HORIZONTAL) .insets(1, 9, 9, 1).gridy(gridy).gridx(4)); - add(wInfantryRange5R, GBC.std().fill(GridBagConstraints.HORIZONTAL) + panelMain.add(wInfantryRange5R, GBC.std().fill(GridBagConstraints.HORIZONTAL) .insets(1, 9, 9, 1).gridy(gridy).gridx(5)); gridy++; // ---------------- - add(wAVL, + panelMain.add(wAVL, GBC.std().fill(GridBagConstraints.HORIZONTAL) .insets(1, 9, 9, 1).gridy(gridy).gridx(0)); - add(wShortAVR, GBC.std().fill(GridBagConstraints.HORIZONTAL) + panelMain.add(wShortAVR, GBC.std().fill(GridBagConstraints.HORIZONTAL) .insets(1, 9, 9, 1).gridy(gridy).gridx(1)); - add(wMedAVR, + panelMain.add(wMedAVR, GBC.std().fill(GridBagConstraints.HORIZONTAL) .insets(1, 9, 9, 1).gridy(gridy).gridx(2)); - add(wLongAVR, + panelMain.add(wLongAVR, GBC.std().fill(GridBagConstraints.HORIZONTAL) .insets(1, 9, 9, 1).gridy(gridy).gridx(3)); - add(wExtAVR, + panelMain.add(wExtAVR, GBC.std().fill(GridBagConstraints.HORIZONTAL) .insets(1, 9, 9, 1).gridy(gridy).gridx(4)); @@ -715,29 +721,29 @@ public void sort(Comparator comparator) { wToHitR.setOpaque(false); wToHitR.setForeground(Color.WHITE); - add(wTargetL, + panelMain.add(wTargetL, GBC.std().fill(GridBagConstraints.HORIZONTAL) .insets(1, 9, 1, 1).gridy(gridy).gridx(0)); - add(wTargetR, + panelMain.add(wTargetR, GBC.eol().fill(GridBagConstraints.HORIZONTAL) .insets(1, 9, 1, 1).gridy(gridy).gridx(1)); gridy++; - add(wRangeL, + panelMain.add(wRangeL, GBC.std().fill(GridBagConstraints.HORIZONTAL) .insets(1, 9, 1, 1).gridy(gridy).gridx(0)); - add(wRangeR, + panelMain.add(wRangeR, GBC.eol().fill(GridBagConstraints.HORIZONTAL) .insets(1, 9, 1, 1).gridy(gridy).gridx(1)); gridy++; - add(wToHitL, + panelMain.add(wToHitL, GBC.std().fill(GridBagConstraints.HORIZONTAL) .insets(1, 9, 1, 1).gridy(gridy).gridx(0)); - add(wToHitR, + panelMain.add(wToHitR, GBC.eol().fill(GridBagConstraints.HORIZONTAL) .insets(1, 9, 1, 1).gridy(gridy).gridx(1)); gridy++; @@ -746,15 +752,21 @@ public void sort(Comparator comparator) { toHitText = new JTextArea("", 2, 20); toHitText.setEditable(false); toHitText.setLineWrap(true); - toHitText.setFont(new Font("SansSerif", Font.PLAIN, 10)); - add(toHitText, + toHitText.setFont(new Font(MMConstants.FONT_SANS_SERIF, Font.PLAIN, 10)); + panelMain.add(toHitText, GBC.eol().fill(GridBagConstraints.BOTH) .insets(15, 9, 15, 9).gridy(gridy).gridx(0) .gridheight(2)); gridy++; addListeners(); - + + adaptToGUIScale(); + GUIPreferences.getInstance().addPreferenceChangeListener(this); + setLayout(new BorderLayout()); + add(panelMain); + panelMain.setOpaque(false); + setBackGround(); onResize(); } @@ -2672,4 +2684,18 @@ public Targetable getPrevTarget() { public void setPrevTarget(Targetable prevTarget) { this.prevTarget = prevTarget; } + + private void adaptToGUIScale() { + UIUtil.adjustContainer(panelMain, UIUtil.FONT_SCALE1); + tWeaponScroll.setMinimumSize(new Dimension(200, UIUtil.scaleForGUI(200))); + tWeaponScroll.setPreferredSize(new Dimension(200, UIUtil.scaleForGUI(200))); + } + + @Override + public void preferenceChange(PreferenceChangeEvent e) { + // Update the text size when the GUI scaling changes + if (e.getName().equals(GUIPreferences.GUI_SCALE)) { + adaptToGUIScale(); + } + } } diff --git a/megamek/src/megamek/client/ui/swing/unitSelector/TWAdvancedSearchPanel.java b/megamek/src/megamek/client/ui/swing/unitSelector/TWAdvancedSearchPanel.java index 2538ea8a78d..087e11f31e4 100644 --- a/megamek/src/megamek/client/ui/swing/unitSelector/TWAdvancedSearchPanel.java +++ b/megamek/src/megamek/client/ui/swing/unitSelector/TWAdvancedSearchPanel.java @@ -19,8 +19,10 @@ */ package megamek.client.ui.swing.unitSelector; +import megamek.MMConstants; import megamek.client.ui.Messages; import megamek.client.ui.swing.table.MegamekTable; +import megamek.client.ui.swing.util.UIUtil; import megamek.common.*; import javax.swing.*; @@ -221,8 +223,6 @@ public TWAdvancedSearchPanel(int year) { // Set up Weapon Class table - scrTableWeaponType.setMinimumSize(new Dimension(850, 150)); - scrTableWeaponType.setPreferredSize(new Dimension(850, 150)); weaponTypesModel = new WeaponClassTableModel(); tblWeaponType = new MegamekTable(weaponTypesModel,WeaponClassTableModel.COL_NAME); TableColumn wpsTypeCol = tblWeaponType.getColumnModel().getColumn(WeaponClassTableModel.COL_QTY); @@ -231,22 +231,14 @@ public TWAdvancedSearchPanel(int year) { weaponTypesSorter = new TableRowSorter<>(weaponTypesModel); tblWeaponType.setRowSorter(weaponTypesSorter); tblWeaponType.addKeyListener(this); - for (int i = 0; i < WeaponClassTableModel.N_COL; i++) { - TableColumn column = tblWeaponType.getColumnModel().getColumn(i); - if ((i == WeaponClassTableModel.COL_QTY)) { - column.setPreferredWidth(40); - } else { - column.setPreferredWidth(310); - } - } - tblWeaponType.setFont(new Font("Monospaced", Font.PLAIN, 12)); + tblWeaponType.setFont(new Font(MMConstants.FONT_MONOSPACED, Font.PLAIN, 12)); tblWeaponType.getSelectionModel().addListSelectionListener(this); + for (int i = 0; i < weaponTypesModel.getColumnCount(); i++) { + tblWeaponType.getColumnModel().getColumn(i).setPreferredWidth(weaponTypesModel.getPreferredWidth(i)); + } scrTableWeaponType.setViewportView(tblWeaponType); - // Setup Weapons Table - scrTableWeapons.setMinimumSize(new Dimension(850, 150)); - scrTableWeapons.setPreferredSize(new Dimension(850, 150)); weaponsModel = new WeaponsTableModel(); tblWeapons = new MegamekTable(weaponsModel, WeaponsTableModel.COL_NAME); TableColumn wpsCol = tblWeapons.getColumnModel().getColumn( @@ -256,27 +248,14 @@ public TWAdvancedSearchPanel(int year) { weaponsSorter = new TableRowSorter<>(weaponsModel); tblWeapons.setRowSorter(weaponsSorter); tblWeapons.addKeyListener(this); - for (int i = 0; i < WeaponsTableModel.N_COL; i++) { - TableColumn column = tblWeapons.getColumnModel().getColumn(i); - if (i == WeaponsTableModel.COL_QTY) { - column.setPreferredWidth(40); - } else if (i == WeaponsTableModel.COL_IS_CLAN) { - column.setPreferredWidth(75); - } else if (i == WeaponsTableModel.COL_NAME) { - column.setPreferredWidth(310); - } else if (i == WeaponsTableModel.COL_LEVEL) { - column.setPreferredWidth(100); - } else { - column.setPreferredWidth(50); - } - } - tblWeapons.setFont(new Font("Monospaced", Font.PLAIN, 12)); + tblWeapons.setFont(new Font(MMConstants.FONT_MONOSPACED, Font.PLAIN, 12)); tblWeapons.getSelectionModel().addListSelectionListener(this); + for (int i = 0; i < weaponsModel.getColumnCount(); i++) { + tblWeapons.getColumnModel().getColumn(i).setPreferredWidth(weaponsModel.getPreferredWidth(i)); + } scrTableWeapons.setViewportView(tblWeapons); // Setup Equipment Table - scrTableEquipment.setMinimumSize(new java.awt.Dimension(850, 150)); - scrTableEquipment.setPreferredSize(new java.awt.Dimension(850, 150)); equipmentModel = new EquipmentTableModel(); tblEquipment = new MegamekTable(equipmentModel, EquipmentTableModel.COL_NAME); @@ -287,22 +266,11 @@ public TWAdvancedSearchPanel(int year) { equipmentSorter = new TableRowSorter<>(equipmentModel); tblEquipment.setRowSorter(equipmentSorter); tblEquipment.addKeyListener(this); - for (int i = 0; i < EquipmentTableModel.N_COL; i++) { - TableColumn column = tblEquipment.getColumnModel().getColumn(i); - if (i == EquipmentTableModel.COL_NAME) { - column.setPreferredWidth(400); - } else if (i == EquipmentTableModel.COL_COST) { - column.setPreferredWidth(175); - } else if (i == EquipmentTableModel.COL_LEVEL) { - column.setPreferredWidth(100); - } else if (i == EquipmentTableModel.COL_QTY) { - column.setPreferredWidth(40); - } else { - column.setPreferredWidth(75); - } - } - tblEquipment.setFont(new Font("Monospaced", Font.PLAIN, 12)); + tblEquipment.setFont(new Font(MMConstants.FONT_MONOSPACED, Font.PLAIN, 12)); tblEquipment.getSelectionModel().addListSelectionListener(this); + for (int i = 0; i < equipmentModel.getColumnCount(); i++) { + tblEquipment.getColumnModel().getColumn(i).setPreferredWidth(equipmentModel.getPreferredWidth(i)); + } scrTableEquipment.setViewportView(tblEquipment); // Populate Tables @@ -328,18 +296,14 @@ public TWAdvancedSearchPanel(int year) { txtEqExp.setEditable(false); txtEqExp.setLineWrap(true); txtEqExp.setWrapStyleWord(true); - Dimension size = new Dimension(325, 50); - txtEqExp.setPreferredSize(size); - expScroller.setPreferredSize(size); - expScroller.setMaximumSize(size); // Layout GridBagConstraints c = new GridBagConstraints(); setLayout(new GridBagLayout()); + c.weighty = 0; + c.fill = GridBagConstraints.NONE; c.anchor = GridBagConstraints.WEST; - c.insets = new Insets(0, 0, 0, 0); - c.insets = new Insets(0, 10, 0, 0); c.gridx = 0; c.gridy = 0; this.add(lblWalk, c); @@ -352,15 +316,12 @@ public TWAdvancedSearchPanel(int year) { this.add(panWalk, c); c.gridx = 3; c.gridy = 0; c.insets = new Insets(0, 40, 0, 0); - c.weighty = 1; c.anchor = GridBagConstraints.WEST; JPanel cockpitPanel = new JPanel(); cockpitPanel.add(cbxEnableCockpitSearch,BorderLayout.WEST); cockpitPanel.add(lblCockpitType,BorderLayout.WEST); cockpitPanel.add(cboCockpitType,BorderLayout.EAST); this.add(cockpitPanel, c); - c.insets = new Insets(0, 0, 0, 0); - c.weighty = 0; c.gridx = 0; c.gridy = 1; c.anchor = GridBagConstraints.WEST; @@ -375,15 +336,12 @@ public TWAdvancedSearchPanel(int year) { this.add(panJump, c); c.anchor = GridBagConstraints.WEST; c.gridx = 3; c.gridy = 1; - c.weighty = 1; c.insets = new Insets(0, 40, 0, 0); JPanel internalsPanel = new JPanel(); internalsPanel.add(cbxEnableInternalsSearch); internalsPanel.add(lblInternalsType); internalsPanel.add(cboInternalsType,BorderLayout.EAST); this.add(internalsPanel, c); - c.weighty = 0; - c.insets = new Insets(0, 0, 0, 0); c.anchor = GridBagConstraints.WEST; c.gridx = 0; c.gridy++; @@ -393,17 +351,14 @@ public TWAdvancedSearchPanel(int year) { c.gridx = 1; this.add(cArmor, c); c.gridx = 3; - c.weighty = 1; c.insets = new Insets(0, 40, 0, 0); JPanel armorPanel = new JPanel(); armorPanel.add(cbxEnableArmorSearch); armorPanel.add(lblArmorType); armorPanel.add(cboArmorType,BorderLayout.EAST); this.add(armorPanel, c); - c.weighty = 0; c.anchor = GridBagConstraints.CENTER; - c.insets = new Insets(16, 0, 0, 0); c.gridx = 0; c.gridy++; this.add(lblTableFilters, c); @@ -424,34 +379,37 @@ public TWAdvancedSearchPanel(int year) { c.gridx = 0; c.gridy++; this.add(lblWeaponClass, c); + c.fill = GridBagConstraints.BOTH; c.insets = new Insets(0, 0, 0, 0); - c.gridwidth = 4; + c.gridwidth = 5; c.gridx = 0; c.gridy++; this.add(scrTableWeaponType, c); c.gridwidth = 1; + c.fill = GridBagConstraints.NONE; c.insets = new Insets(0, 0, 0, 0); c.gridx = 0; c.gridy++; this.add(lblWeapons, c); + c.fill = GridBagConstraints.BOTH; c.insets = new Insets(0, 0, 0, 0); - c.gridwidth = 4; + c.gridwidth = 5; c.gridx = 0; c.gridy++; this.add(scrTableWeapons, c); - c.gridwidth = 1; + c.fill = GridBagConstraints.NONE; c.gridwidth = 1; c.insets = new Insets(16, 0, 0, 0); c.gridx = 0; c.gridy++; this.add(lblEquipment, c); - + c.fill = GridBagConstraints.BOTH; c.insets = new Insets(0, 0, 0, 0); - c.gridwidth = 4; + c.gridwidth = 5; c.gridx = 0; c.gridy++; this.add(scrTableEquipment, c); - c.gridwidth = 1; + c.fill = GridBagConstraints.NONE; c.gridx = 0; c.gridy++; c.gridwidth = 4; JPanel btnPanel = new JPanel(); @@ -468,9 +426,9 @@ public TWAdvancedSearchPanel(int year) { // Filter Expression c.gridx = 0; c.gridy++; this.add(lblEqExpTxt, c); - c.fill = GridBagConstraints.BOTH; c.gridwidth = 4; c.gridx = 1; + c.fill = GridBagConstraints.HORIZONTAL; this.add(expScroller, c); c.fill = GridBagConstraints.NONE; c.insets = new Insets(0, 0, 0, 0); @@ -977,6 +935,17 @@ public int getColumnCount() { return N_COL; } + public int getPreferredWidth(int col) { + switch (col) { + case COL_QTY: + return 40; + case COL_NAME: + return 310; + default: + return 0; + } + } + @Override public String getColumnName(int column) { switch (column) { @@ -1080,6 +1049,31 @@ public int getColumnCount() { return N_COL; } + public int getPreferredWidth(int col) { + switch (col) { + case COL_QTY: + return 40; + case COL_NAME: + return 310; + case COL_IS_CLAN: + return 75; + case COL_DMG: + return 50; + case COL_HEAT: + return 50; + case COL_SHORT: + return 50; + case COL_MED: + return 50; + case COL_LONG: + return 50; + case COL_LEVEL: + return 100; + default: + return 0; + } + } + @Override public String getColumnName(int column) { switch (column) { @@ -1207,6 +1201,23 @@ public int getColumnCount() { return N_COL; } + public int getPreferredWidth(int col) { + switch (col) { + case COL_QTY: + return 40; + case COL_NAME: + return 400; + case COL_IS_CLAN: + return 75; + case COL_COST: + return 175; + case COL_LEVEL: + return 100; + default: + return 0; + } + } + @Override public String getColumnName(int column) { switch (column) { @@ -1579,4 +1590,12 @@ public boolean matches(String name) { } } + public void adaptToGUIScale() { + scrTableWeaponType.setMinimumSize(new Dimension(UIUtil.scaleForGUI(650), UIUtil.scaleForGUI(150))); + scrTableWeaponType.setPreferredSize(new Dimension(UIUtil.scaleForGUI(650), UIUtil.scaleForGUI(150))); + scrTableWeapons.setMinimumSize(new Dimension(UIUtil.scaleForGUI(650), UIUtil.scaleForGUI(350))); + scrTableWeapons.setPreferredSize(new Dimension(UIUtil.scaleForGUI(650), UIUtil.scaleForGUI(150))); + scrTableEquipment.setMinimumSize(new Dimension(UIUtil.scaleForGUI(650), UIUtil.scaleForGUI(350))); + scrTableEquipment.setPreferredSize(new Dimension(UIUtil.scaleForGUI(650), UIUtil.scaleForGUI(150))); + } } diff --git a/megamek/src/megamek/client/ui/swing/util/KeyCommandBind.java b/megamek/src/megamek/client/ui/swing/util/KeyCommandBind.java index 5f24f8abf49..212d3670925 100644 --- a/megamek/src/megamek/client/ui/swing/util/KeyCommandBind.java +++ b/megamek/src/megamek/client/ui/swing/util/KeyCommandBind.java @@ -102,6 +102,7 @@ public enum KeyCommandBind { UNIT_DISPLAY(true, "toggleUnitDisplay", VK_D, CTRL_DOWN_MASK), UNIT_OVERVIEW(true, "toggleUnitOverview", VK_U, CTRL_DOWN_MASK), KEY_BINDS(true, "toggleKeybinds", VK_K, CTRL_DOWN_MASK), + PLANETARY_CONDITIONS(true, "togglePlanetaryConditions", VK_P, CTRL_DOWN_MASK), CLIENT_SETTINGS(true, "clientSettings", VK_C, ALT_DOWN_MASK), INC_GUISCALE(true, "incGuiScale", VK_ADD, CTRL_DOWN_MASK), DEC_GUISCALE(true, "decGuiScale", VK_SUBTRACT, CTRL_DOWN_MASK), diff --git a/megamek/src/megamek/client/ui/swing/util/TurnTimer.java b/megamek/src/megamek/client/ui/swing/util/TurnTimer.java index fdccfec22dd..5ae5ad8e1d9 100644 --- a/megamek/src/megamek/client/ui/swing/util/TurnTimer.java +++ b/megamek/src/megamek/client/ui/swing/util/TurnTimer.java @@ -41,8 +41,8 @@ public class TurnTimer { public TurnTimer(int limit, AbstractPhaseDisplay pD) { phaseDisplay = pD; - // make it minutes here. - timeLimit = limit * 60; + // linit in seconds. + timeLimit = limit; display = new JPanel(); progressBar = new JProgressBar(JProgressBar.HORIZONTAL, 0, timeLimit); @@ -93,14 +93,18 @@ public void startTimer() { public void stopTimer() { display.setVisible(false); - phaseDisplay.getClientgui().getMenuBar().remove(display); + + if (phaseDisplay.getClientgui().getMenuBar() != null) { + phaseDisplay.getClientgui().getMenuBar().remove(display); + } + timer.stop(); } public static TurnTimer init(AbstractPhaseDisplay phaseDisplay, Client client) { // check if there should be a turn timer running if (timerShouldStart(client)) { - Option timer = (Option) client.getGame().getOptions().getOption("turn_timer"); + Option timer = (Option) client.getGame().getOptions().getOption(OptionsConstants.BASE_TURN_TIMER); TurnTimer tt = new TurnTimer(timer.intValue(), phaseDisplay); tt.startTimer(); return tt; @@ -121,7 +125,7 @@ private static boolean timerShouldStart(Client client) { GamePhase phase = client.getGame().getPhase(); // turn timer should only kick in on firing, targeting, movement and physical attack phase - return phase == GamePhase.MOVEMENT || phase == GamePhase.FIRING || phase == GamePhase.PHYSICAL || phase == GamePhase.TARGETING; + return phase.isMovement() || phase.isFiring() || phase.isPhysical() || phase.isTargeting(); } return false; } diff --git a/megamek/src/megamek/client/ui/swing/util/UIUtil.java b/megamek/src/megamek/client/ui/swing/util/UIUtil.java index 9401a025bf4..9b91ae4126a 100644 --- a/megamek/src/megamek/client/ui/swing/util/UIUtil.java +++ b/megamek/src/megamek/client/ui/swing/util/UIUtil.java @@ -13,6 +13,7 @@ */ package megamek.client.ui.swing.util; +import megamek.MMConstants; import megamek.client.ui.Messages; import megamek.client.ui.baseComponents.MMComboBox; import megamek.client.ui.swing.ClientGUI; @@ -26,6 +27,8 @@ import javax.swing.border.Border; import javax.swing.border.EmptyBorder; import javax.swing.border.TitledBorder; +import javax.swing.table.JTableHeader; +import javax.swing.table.TableCellRenderer; import java.awt.*; import java.awt.event.ActionListener; import java.awt.event.FocusEvent; @@ -46,6 +49,7 @@ public final class UIUtil { /** The style = font-size: xx value corresponding to a GUI scale of 1 */ public final static int FONT_SCALE1 = 14; + public final static int FONT_SCALE2 = 17; public final static String ECM_SIGN = " \u24BA "; public final static String LOADED_SIGN = " \u26DF "; public final static String UNCONNECTED_SIGN = " \u26AC"; @@ -353,36 +357,63 @@ public static String scaleMessageForGUI(String str) { } /** Call this for {@link #adjustDialog(Container)} with a dialog as parameter. */ - public static void adjustDialog(JDialog dialog) { - adjustDialog(dialog.getContentPane()); + public static void adjustDialog(JDialog dialog, int fontSize) { + adjustContainer(dialog.getContentPane(), fontSize); + } + + /** calculate the max row height in a table + pad */ + public static int calRowHeights(JTable table, int sf, int pad) + { + int rowHeight = sf; + for (int row = 0; row < table.getRowCount(); row++) { + for (int col = 0; col < table.getColumnCount(); col++) { + // Consider the preferred height of the column + TableCellRenderer renderer = table.getCellRenderer(row, col); + Component comp = table.prepareRenderer(renderer, row, col); + rowHeight = Math.max(rowHeight, comp.getPreferredSize().height); + } + } + // Add a little margin to the rows + return rowHeight + pad; } - + + /** set font size for the TitledBorder */ + public static void setTitledBorder(Border border, int sf) { + if ((border instanceof TitledBorder)) { + ((TitledBorder) border).setTitleFont(((TitledBorder) border).getTitleFont().deriveFont((float) sf)); + } + } + /** * Applies the current gui scale to a given Container. * For a dialog, pass getContentPane(). This can work well for simple dialogs, * but it is of course "experimental". Complex dialogs must be hand-adapted to the * gui scale. */ - public static void adjustDialog(Container contentPane) { - Font scaledFont = getScaledFont(); - Component[] allComps = contentPane.getComponents(); - for (Component comp: allComps) { + public static void adjustContainer(Container parentCon, int fontSize) { + int sf = scaleForGUI(fontSize); + int pad = 3; + + for (Component comp: parentCon.getComponents()) { if ((comp instanceof JButton) || (comp instanceof JLabel) || (comp instanceof JComboBox) || (comp instanceof JTextField) || (comp instanceof JSlider) || (comp instanceof JSpinner) || (comp instanceof JTextArea) || (comp instanceof JTextPane) - || (comp instanceof JToggleButton)) { - comp.setFont(scaledFont.deriveFont(comp.getFont().getStyle())); + || (comp instanceof JToggleButton) || (comp instanceof JTable) || (comp instanceof JList) + || (comp instanceof JEditorPane) || (comp instanceof JTree)) { + if ((comp.getFont() != null) && (sf != comp.getFont().getSize())) { + comp.setFont(comp.getFont().deriveFont((float) sf)); + } } if (comp instanceof JScrollPane && ((JScrollPane) comp).getViewport().getView() instanceof JComponent) { - adjustDialog(((JScrollPane) comp).getViewport()); + JScrollPane scrollPane = (JScrollPane) comp; + Border border = scrollPane.getBorder(); + setTitledBorder(border, sf); + adjustContainer(((JScrollPane) comp).getViewport(), fontSize); } else if (comp instanceof JPanel) { JPanel panel = (JPanel) comp; Border border = panel.getBorder(); - if ((border instanceof TitledBorder)) { - ((TitledBorder) border).setTitleFont(scaledFont); - } - + setTitledBorder(border, sf); if ((border instanceof EmptyBorder)) { Insets i = ((EmptyBorder) border).getBorderInsets(); int top = scaleForGUI(i.top); @@ -391,19 +422,29 @@ public static void adjustDialog(Container contentPane) { int right = scaleForGUI(i.right); panel.setBorder(BorderFactory.createEmptyBorder(top, left, bottom, right)); } - adjustDialog(panel); + adjustContainer(panel, fontSize); } else if (comp instanceof JTabbedPane) { - comp.setFont(scaledFont); + if ((comp.getFont() != null) && (sf != comp.getFont().getSize())) { + comp.setFont(comp.getFont().deriveFont((float) sf)); + } JTabbedPane tabbedPane = (JTabbedPane) comp; for (int i=0; i < tabbedPane.getTabCount();i++) { Component subComp = tabbedPane.getTabComponentAt(i); if (subComp instanceof JPanel) { - adjustDialog((JPanel) subComp); + adjustContainer((JPanel) subComp, fontSize); } } - adjustDialog((JTabbedPane) comp); + adjustContainer((JTabbedPane) comp, fontSize); + } else if (comp instanceof JTable) { + JTable table = (JTable) comp; + table.setRowHeight(calRowHeights(table, sf, pad)); + JTableHeader header = table.getTableHeader(); + if ((header instanceof JTableHeader)) { + header.setFont(comp.getFont().deriveFont((float) sf)); + } + adjustContainer((Container) comp, fontSize); } else if (comp instanceof Container) { - adjustDialog((Container) comp); + adjustContainer((Container) comp, fontSize); } } } @@ -414,7 +455,17 @@ public static void scaleMenu(final JComponent popup) { if ((comp instanceof JMenuItem)) { comp.setFont(getScaledFont()); scaleJMenuItem((JMenuItem) comp); - } + } + } + } + + public static void scaleComp(JComponent comp, int fontSize) { + int sf = scaleForGUI(fontSize); + + if ((comp.getFont() != null) && (sf != comp.getFont().getSize())) { + comp.setFont(comp.getFont().deriveFont((float) sf)); + Border border = comp.getBorder(); + setTitledBorder(border, sf); } } @@ -1064,7 +1115,7 @@ public static JMenuItem menuItem(String text, String cmd, boolean enabled, * size 14 and scaled with the current gui scaling. */ public static Font getScaledFont() { - return new Font("Dialog", Font.PLAIN, scaleForGUI(FONT_SCALE1)); + return new Font(MMConstants.FONT_DIALOG, Font.PLAIN, scaleForGUI(FONT_SCALE1)); } // PRIVATE @@ -1187,4 +1238,13 @@ public static void updateWindowBounds(Window window) { window.setLocation(location); window.setSize(size); } + + /* + * Calculates center of view port for a given point + */ + public static int calculateCenter(int vh, int h, int th, int y) { + y = Math.max(0, y - ((vh - th)/2)); + y = Math.min(y, h - vh); + return y; + } } diff --git a/megamek/src/megamek/client/ui/swing/widget/AeroMapSet.java b/megamek/src/megamek/client/ui/swing/widget/AeroMapSet.java index a1c87ebc337..126c5066d3c 100644 --- a/megamek/src/megamek/client/ui/swing/widget/AeroMapSet.java +++ b/megamek/src/megamek/client/ui/swing/widget/AeroMapSet.java @@ -15,24 +15,16 @@ package megamek.client.ui.swing.widget; -import java.awt.Color; -import java.awt.Font; -import java.awt.FontMetrics; -import java.awt.Image; -import java.awt.Polygon; -import java.util.Vector; - -import javax.swing.JComponent; - +import megamek.MMConstants; import megamek.client.ui.swing.GUIPreferences; import megamek.client.ui.swing.unitDisplay.UnitDisplay; -import megamek.common.Aero; -import megamek.common.Configuration; -import megamek.common.Dropship; -import megamek.common.Entity; -import megamek.common.SmallCraft; +import megamek.common.*; import megamek.common.util.fileUtils.MegaMekFile; +import javax.swing.*; +import java.awt.*; +import java.util.Vector; + /** * Class which keeps set of all areas required to represent ASF unit in * MechDisplay.ArmorPanel class. @@ -67,9 +59,9 @@ public class AeroMapSet implements DisplayMapSet { private Polygon aftArmor = new Polygon(new int[] { 45, 45, 30, 30, 95, 95, 80, 80 }, new int[] { 160, 180, 190, 200, 200, 190, 180, 160 }, 8); - private static final Font FONT_LABEL = new Font("SansSerif", Font.PLAIN, + private static final Font FONT_LABEL = new Font(MMConstants.FONT_SANS_SERIF, Font.PLAIN, GUIPreferences.getInstance().getInt("AdvancedMechDisplayArmorSmallFontSize")); - private static final Font FONT_VALUE = new Font("SansSerif", Font.PLAIN, + private static final Font FONT_VALUE = new Font(MMConstants.FONT_SANS_SERIF, Font.PLAIN, GUIPreferences.getInstance().getInt("AdvancedMechDisplayArmorLargeFontSize")); public AeroMapSet(JComponent c, UnitDisplay unitDisplay) { diff --git a/megamek/src/megamek/client/ui/swing/widget/ArmlessMechMapSet.java b/megamek/src/megamek/client/ui/swing/widget/ArmlessMechMapSet.java index 364454f61c0..07b9fe14f32 100644 --- a/megamek/src/megamek/client/ui/swing/widget/ArmlessMechMapSet.java +++ b/megamek/src/megamek/client/ui/swing/widget/ArmlessMechMapSet.java @@ -15,6 +15,7 @@ */ package megamek.client.ui.swing.widget; +import megamek.MMConstants; import megamek.client.ui.Messages; import megamek.client.ui.swing.GUIPreferences; import megamek.client.ui.swing.unitDisplay.UnitDisplay; @@ -121,9 +122,9 @@ public class ArmlessMechMapSet implements DisplayMapSet { private Image heatImage; - private static final Font FONT_LABEL = new Font("SansSerif", Font.PLAIN, + private static final Font FONT_LABEL = new Font(MMConstants.FONT_SANS_SERIF, Font.PLAIN, GUIPreferences.getInstance().getInt("AdvancedMechDisplayArmorSmallFontSize")); - private static final Font FONT_VALUE = new Font("SansSerif", Font.PLAIN, + private static final Font FONT_VALUE = new Font(MMConstants.FONT_SANS_SERIF, Font.PLAIN, GUIPreferences.getInstance().getInt("AdvancedMechDisplayArmorLargeFontSize")); public ArmlessMechMapSet(JComponent c, UnitDisplay unitDisplay) { diff --git a/megamek/src/megamek/client/ui/swing/widget/BattleArmorMapSet.java b/megamek/src/megamek/client/ui/swing/widget/BattleArmorMapSet.java index c14d753b67b..f30899d1196 100644 --- a/megamek/src/megamek/client/ui/swing/widget/BattleArmorMapSet.java +++ b/megamek/src/megamek/client/ui/swing/widget/BattleArmorMapSet.java @@ -15,6 +15,7 @@ */ package megamek.client.ui.swing.widget; +import megamek.MMConstants; import megamek.client.ui.Messages; import megamek.client.ui.swing.GUIPreferences; import megamek.common.BattleArmor; @@ -50,7 +51,7 @@ public class BattleArmorMapSet implements DisplayMapSet { private int stepY = 53; - private static final Font FONT_VALUE = new Font("SansSerif", Font.PLAIN, + private static final Font FONT_VALUE = new Font(MMConstants.FONT_SANS_SERIF, Font.PLAIN, GUIPreferences.getInstance().getInt("AdvancedMechDisplayArmorLargeFontSize")); /** diff --git a/megamek/src/megamek/client/ui/swing/widget/CapitalFighterMapSet.java b/megamek/src/megamek/client/ui/swing/widget/CapitalFighterMapSet.java index 1ab5f96b596..1098b337b80 100644 --- a/megamek/src/megamek/client/ui/swing/widget/CapitalFighterMapSet.java +++ b/megamek/src/megamek/client/ui/swing/widget/CapitalFighterMapSet.java @@ -14,15 +14,7 @@ */ package megamek.client.ui.swing.widget; -import java.awt.Color; -import java.awt.Font; -import java.awt.FontMetrics; -import java.awt.Graphics; -import java.awt.Image; -import java.util.Vector; - -import javax.swing.JComponent; - +import megamek.MMConstants; import megamek.client.ui.swing.GUIPreferences; import megamek.common.Aero; import megamek.common.Configuration; @@ -30,6 +22,10 @@ import megamek.common.options.OptionsConstants; import megamek.common.util.fileUtils.MegaMekFile; +import javax.swing.*; +import java.awt.*; +import java.util.Vector; + /** * Class which keeps set of all areas required to represent Capital Fighter unit * in MechDisplay.ArmorPanel class. @@ -68,7 +64,7 @@ public class CapitalFighterMapSet implements DisplayMapSet { private int armorRows = 8; private int armorCols = 6; - private static final Font FONT_LABEL = new Font("SansSerif", Font.PLAIN, + private static final Font FONT_LABEL = new Font(MMConstants.FONT_SANS_SERIF, Font.PLAIN, GUIPreferences.getInstance().getInt("AdvancedMechDisplayArmorSmallFontSize")); public CapitalFighterMapSet(JComponent c) { diff --git a/megamek/src/megamek/client/ui/swing/widget/GeneralInfoMapSet.java b/megamek/src/megamek/client/ui/swing/widget/GeneralInfoMapSet.java index 6bed21ead56..6f7581e2032 100644 --- a/megamek/src/megamek/client/ui/swing/widget/GeneralInfoMapSet.java +++ b/megamek/src/megamek/client/ui/swing/widget/GeneralInfoMapSet.java @@ -15,6 +15,7 @@ */ package megamek.client.ui.swing.widget; +import megamek.MMConstants; import megamek.client.ui.Messages; import megamek.client.ui.swing.GUIPreferences; import megamek.common.*; @@ -43,9 +44,9 @@ public class GeneralInfoMapSet implements DisplayMapSet { elevationR, fuelR, curSensorsR, visualRangeR; private PMMultiLineLabel quirksAndPartReps; private Vector bgDrawers = new Vector<>(); - private static final Font FONT_VALUE = new Font("SansSerif", Font.PLAIN, + private static final Font FONT_VALUE = new Font(MMConstants.FONT_SANS_SERIF, Font.PLAIN, GUIPreferences.getInstance().getInt("AdvancedMechDisplayLargeFontSize")); - private static final Font FONT_TITLE = new Font("SansSerif", Font.ITALIC, + private static final Font FONT_TITLE = new Font(MMConstants.FONT_SANS_SERIF, Font.ITALIC, GUIPreferences.getInstance().getInt("AdvancedMechDisplayLargeFontSize")); private int yCoord = 1; diff --git a/megamek/src/megamek/client/ui/swing/widget/InfantryMapSet.java b/megamek/src/megamek/client/ui/swing/widget/InfantryMapSet.java index 6d98a18f1cb..0775e71bcd0 100644 --- a/megamek/src/megamek/client/ui/swing/widget/InfantryMapSet.java +++ b/megamek/src/megamek/client/ui/swing/widget/InfantryMapSet.java @@ -14,6 +14,7 @@ */ package megamek.client.ui.swing.widget; +import megamek.MMConstants; import megamek.client.ui.Messages; import megamek.client.ui.swing.GUIPreferences; import megamek.common.Configuration; @@ -47,7 +48,7 @@ public class InfantryMapSet implements DisplayMapSet { // Set of Background drawers private Vector bgDrawers = new Vector<>(); - private static final Font FONT_VALUE = new Font("SansSerif", Font.PLAIN, + private static final Font FONT_VALUE = new Font(MMConstants.FONT_SANS_SERIF, Font.PLAIN, GUIPreferences.getInstance().getInt("AdvancedMechDisplayArmorMediumFontSize")); public InfantryMapSet(JComponent c) { diff --git a/megamek/src/megamek/client/ui/swing/widget/JumpshipMapSet.java b/megamek/src/megamek/client/ui/swing/widget/JumpshipMapSet.java index d7193364657..d3c2151eead 100644 --- a/megamek/src/megamek/client/ui/swing/widget/JumpshipMapSet.java +++ b/megamek/src/megamek/client/ui/swing/widget/JumpshipMapSet.java @@ -14,15 +14,7 @@ */ package megamek.client.ui.swing.widget; -import java.awt.Color; -import java.awt.Font; -import java.awt.FontMetrics; -import java.awt.Image; -import java.awt.Polygon; -import java.util.Vector; - -import javax.swing.JComponent; - +import megamek.MMConstants; import megamek.client.ui.swing.GUIPreferences; import megamek.client.ui.swing.unitDisplay.UnitDisplay; import megamek.common.Configuration; @@ -31,6 +23,10 @@ import megamek.common.Jumpship; import megamek.common.util.fileUtils.MegaMekFile; +import javax.swing.*; +import java.awt.*; +import java.util.Vector; + /** * Class which keeps set of all areas required to * represent ASF unit in MechDisplay.ArmorPanel class. @@ -70,13 +66,11 @@ public class JumpshipMapSet implements DisplayMapSet{ private Polygon aftArmor = new Polygon (new int[] { 20, 0, 40, 40, 60, 60, 100, 80 }, new int[] { 160, 200, 190, 200, 200, 190, 200, 160 }, 8); - private static final Font FONT_LABEL = new Font("SansSerif", Font.PLAIN, + private static final Font FONT_LABEL = new Font(MMConstants.FONT_SANS_SERIF, Font.PLAIN, GUIPreferences.getInstance().getInt("AdvancedMechDisplayArmorSmallFontSize")); - private static final Font FONT_VALUE = new Font("SansSerif", Font.PLAIN, + private static final Font FONT_VALUE = new Font(MMConstants.FONT_SANS_SERIF, Font.PLAIN, GUIPreferences.getInstance().getInt("AdvancedMechDisplayArmorLargeFontSize")); - - public JumpshipMapSet(JComponent c, UnitDisplay unitDisplay) { this.unitDisplay = unitDisplay; comp = c; diff --git a/megamek/src/megamek/client/ui/swing/widget/LargeSupportTankMapSet.java b/megamek/src/megamek/client/ui/swing/widget/LargeSupportTankMapSet.java index f5dfb9322eb..e8ea622df99 100644 --- a/megamek/src/megamek/client/ui/swing/widget/LargeSupportTankMapSet.java +++ b/megamek/src/megamek/client/ui/swing/widget/LargeSupportTankMapSet.java @@ -14,15 +14,7 @@ */ package megamek.client.ui.swing.widget; -import java.awt.Color; -import java.awt.Font; -import java.awt.FontMetrics; -import java.awt.Image; -import java.awt.Polygon; -import java.util.Vector; - -import javax.swing.JComponent; - +import megamek.MMConstants; import megamek.client.ui.Messages; import megamek.client.ui.swing.GUIPreferences; import megamek.client.ui.swing.unitDisplay.UnitDisplay; @@ -32,6 +24,10 @@ import megamek.common.SupportTank; import megamek.common.util.fileUtils.MegaMekFile; +import javax.swing.*; +import java.awt.*; +import java.util.Vector; + /** * Class which keeps set of all areas required to represent Tank unit in * MechDisplay.ArmorPanel class. @@ -119,9 +115,9 @@ public class LargeSupportTankMapSet implements DisplayMapSet { new int[] { 65, 65, 80, 100, 115, 115 }, new int[] { 125, 142, 165, 165, 142, 125 }, 6); - private static final Font FONT_LABEL = new Font("SansSerif", Font.PLAIN, + private static final Font FONT_LABEL = new Font(MMConstants.FONT_SANS_SERIF, Font.PLAIN, GUIPreferences.getInstance().getInt("AdvancedMechDisplayArmorSmallFontSize")); - private static final Font FONT_VALUE = new Font("SansSerif", Font.PLAIN, + private static final Font FONT_VALUE = new Font(MMConstants.FONT_SANS_SERIF, Font.PLAIN, GUIPreferences.getInstance().getInt("AdvancedMechDisplayArmorLargeFontSize")); public LargeSupportTankMapSet(JComponent c, UnitDisplay unitDisplay) { diff --git a/megamek/src/megamek/client/ui/swing/widget/MechMapSet.java b/megamek/src/megamek/client/ui/swing/widget/MechMapSet.java index 10afa38523e..6e677875c93 100644 --- a/megamek/src/megamek/client/ui/swing/widget/MechMapSet.java +++ b/megamek/src/megamek/client/ui/swing/widget/MechMapSet.java @@ -14,6 +14,7 @@ */ package megamek.client.ui.swing.widget; +import megamek.MMConstants; import megamek.client.ui.Messages; import megamek.client.ui.swing.GUIPreferences; import megamek.client.ui.swing.unitDisplay.UnitDisplay; @@ -144,9 +145,9 @@ public class MechMapSet implements DisplayMapSet { private Image heatImage; - private static final Font FONT_LABEL = new Font("SansSerif", Font.PLAIN, + private static final Font FONT_LABEL = new Font(MMConstants.FONT_SANS_SERIF, Font.PLAIN, GUIPreferences.getInstance().getInt("AdvancedMechDisplayArmorSmallFontSize")); - private static final Font FONT_VALUE = new Font("SansSerif", Font.PLAIN, + private static final Font FONT_VALUE = new Font(MMConstants.FONT_SANS_SERIF, Font.PLAIN, GUIPreferences.getInstance().getInt("AdvancedMechDisplayArmorLargeFontSize")); public MechMapSet(JComponent c, UnitDisplay unitDisplay) { @@ -179,8 +180,7 @@ public void setEntity(Entity e) { a = m.getArmor(i); a0 = m.getOArmor(i); vLabels[i].setValue(m.getArmorString(i)); - WidgetUtils.setAreaColor(areas[i], vLabels[i], (double) a - / (double) a0); + WidgetUtils.setAreaColor(areas[i], vLabels[i], (double) a / (double) a0); if (m.hasRearArmor(i)) { a = m.getArmor(i, true); a0 = m.getOArmor(i, true); diff --git a/megamek/src/megamek/client/ui/swing/widget/PilotMapSet.java b/megamek/src/megamek/client/ui/swing/widget/PilotMapSet.java index a60edc7659e..ad318d9202f 100644 --- a/megamek/src/megamek/client/ui/swing/widget/PilotMapSet.java +++ b/megamek/src/megamek/client/ui/swing/widget/PilotMapSet.java @@ -14,16 +14,7 @@ */ package megamek.client.ui.swing.widget; -import java.awt.Color; -import java.awt.Font; -import java.awt.FontMetrics; -import java.awt.Image; -import java.awt.image.BufferedImage; -import java.util.Enumeration; -import java.util.Vector; - -import javax.swing.JComponent; - +import megamek.MMConstants; import megamek.client.ui.Messages; import megamek.client.ui.swing.GUIPreferences; import megamek.common.Configuration; @@ -34,6 +25,12 @@ import megamek.common.options.OptionsConstants; import megamek.common.util.fileUtils.MegaMekFile; +import javax.swing.*; +import java.awt.*; +import java.awt.image.BufferedImage; +import java.util.Enumeration; +import java.util.Vector; + /** * Set of elements to represent pilot information in MechDisplay */ @@ -48,9 +45,9 @@ public class PilotMapSet implements DisplayMapSet { private PMSimpleLabel pilotR, gunneryR, gunneryLR, gunneryMR, gunneryBR, toughBR, initBR, commandBR, hitsR; private PMSimpleLabel[] advantagesR; private Vector bgDrawers = new Vector<>(); - private static final Font FONT_VALUE = new Font("SansSerif", Font.PLAIN, + private static final Font FONT_VALUE = new Font(MMConstants.FONT_SANS_SERIF, Font.PLAIN, GUIPreferences.getInstance().getInt("AdvancedMechDisplayLargeFontSize")); - private static final Font FONT_TITLE = new Font("SansSerif", Font.ITALIC, + private static final Font FONT_TITLE = new Font(MMConstants.FONT_SANS_SERIF, Font.ITALIC, GUIPreferences.getInstance().getInt("AdvancedMechDisplayLargeFontSize")); private int yCoord = 1; diff --git a/megamek/src/megamek/client/ui/swing/widget/ProtomechMapSet.java b/megamek/src/megamek/client/ui/swing/widget/ProtomechMapSet.java index 94ce9ba9a72..b8b0c3a36d9 100644 --- a/megamek/src/megamek/client/ui/swing/widget/ProtomechMapSet.java +++ b/megamek/src/megamek/client/ui/swing/widget/ProtomechMapSet.java @@ -15,6 +15,7 @@ */ package megamek.client.ui.swing.widget; +import megamek.MMConstants; import megamek.client.ui.swing.GUIPreferences; import megamek.client.ui.swing.unitDisplay.UnitDisplay; import megamek.common.Configuration; @@ -64,7 +65,7 @@ public class ProtomechMapSet implements DisplayMapSet { // Set of Background drawers which will be sent to PicMap component private Vector bgDrawers = new Vector<>(); - private static final Font FONT_VALUE = new Font("SansSerif", Font.PLAIN, + private static final Font FONT_VALUE = new Font(MMConstants.FONT_SANS_SERIF, Font.PLAIN, GUIPreferences.getInstance().getInt("AdvancedMechDisplayArmorLargeFontSize")); /** diff --git a/megamek/src/megamek/client/ui/swing/widget/QuadMapSet.java b/megamek/src/megamek/client/ui/swing/widget/QuadMapSet.java index 8f6fe252a36..8ed29e0f682 100644 --- a/megamek/src/megamek/client/ui/swing/widget/QuadMapSet.java +++ b/megamek/src/megamek/client/ui/swing/widget/QuadMapSet.java @@ -15,6 +15,7 @@ */ package megamek.client.ui.swing.widget; +import megamek.MMConstants; import megamek.client.ui.Messages; import megamek.client.ui.swing.GUIPreferences; import megamek.client.ui.swing.unitDisplay.UnitDisplay; @@ -123,9 +124,9 @@ public class QuadMapSet implements DisplayMapSet { private Image heatImage; - private static final Font FONT_LABEL = new Font("SansSerif", Font.PLAIN, + private static final Font FONT_LABEL = new Font(MMConstants.FONT_SANS_SERIF, Font.PLAIN, GUIPreferences.getInstance().getInt("AdvancedMechDisplayArmorSmallFontSize")); - private static final Font FONT_VALUE = new Font("SansSerif", Font.PLAIN, + private static final Font FONT_VALUE = new Font(MMConstants.FONT_SANS_SERIF, Font.PLAIN, GUIPreferences.getInstance().getInt("AdvancedMechDisplayArmorLargeFontSize")); public QuadMapSet(JComponent c, UnitDisplay unitDisplay) { diff --git a/megamek/src/megamek/client/ui/swing/widget/SpheroidMapSet.java b/megamek/src/megamek/client/ui/swing/widget/SpheroidMapSet.java index 283519a7602..4d290f20ba9 100644 --- a/megamek/src/megamek/client/ui/swing/widget/SpheroidMapSet.java +++ b/megamek/src/megamek/client/ui/swing/widget/SpheroidMapSet.java @@ -14,24 +14,16 @@ */ package megamek.client.ui.swing.widget; -import java.awt.Color; -import java.awt.Font; -import java.awt.FontMetrics; -import java.awt.Image; -import java.awt.Polygon; -import java.util.Vector; - -import javax.swing.JComponent; - +import megamek.MMConstants; import megamek.client.ui.swing.GUIPreferences; import megamek.client.ui.swing.unitDisplay.UnitDisplay; -import megamek.common.Aero; -import megamek.common.Configuration; -import megamek.common.Dropship; -import megamek.common.Entity; -import megamek.common.SmallCraft; +import megamek.common.*; import megamek.common.util.fileUtils.MegaMekFile; +import javax.swing.*; +import java.awt.*; +import java.util.Vector; + /** * Class which keeps set of all areas required to * represent ASF unit in MechDisplay.ArmorPanel class. @@ -66,9 +58,9 @@ public class SpheroidMapSet implements DisplayMapSet{ private Polygon aftArmor = new Polygon (new int[] { 0, 20, 80, 100 }, new int[] { 150, 200, 200, 150 }, 4); - private static final Font FONT_LABEL = new Font("SansSerif", Font.PLAIN, + private static final Font FONT_LABEL = new Font(MMConstants.FONT_SANS_SERIF, Font.PLAIN, GUIPreferences.getInstance().getInt("AdvancedMechDisplayArmorSmallFontSize")); - private static final Font FONT_VALUE = new Font("SansSerif", Font.PLAIN, + private static final Font FONT_VALUE = new Font(MMConstants.FONT_SANS_SERIF, Font.PLAIN, GUIPreferences.getInstance().getInt("AdvancedMechDisplayArmorLargeFontSize")); public SpheroidMapSet(JComponent c, UnitDisplay unitDisplay) { diff --git a/megamek/src/megamek/client/ui/swing/widget/SquadronMapSet.java b/megamek/src/megamek/client/ui/swing/widget/SquadronMapSet.java index 69e602568d7..21733c8a218 100644 --- a/megamek/src/megamek/client/ui/swing/widget/SquadronMapSet.java +++ b/megamek/src/megamek/client/ui/swing/widget/SquadronMapSet.java @@ -14,24 +14,16 @@ */ package megamek.client.ui.swing.widget; -import java.awt.Color; -import java.awt.Font; -import java.awt.FontMetrics; -import java.awt.Graphics; -import java.awt.Image; -import java.util.List; -import java.util.Vector; - -import javax.swing.JComponent; - -import megamek.common.Configuration; -import megamek.common.Entity; -import megamek.common.FighterSquadron; -import megamek.common.IAero; -import megamek.common.Game; +import megamek.MMConstants; +import megamek.common.*; import megamek.common.options.OptionsConstants; import megamek.common.util.fileUtils.MegaMekFile; +import javax.swing.*; +import java.awt.*; +import java.util.List; +import java.util.Vector; + /** * Class which keeps set of all areas required to represent Capital Fighter unit * in MechDisplay.ArmorPanel class. @@ -72,7 +64,7 @@ public class SquadronMapSet implements DisplayMapSet { private int max_size; - private static final Font FONT_LABEL = new Font("SansSerif", Font.PLAIN, 9); + private static final Font FONT_LABEL = new Font(MMConstants.FONT_SANS_SERIF, Font.PLAIN, 9); public SquadronMapSet(JComponent c, Game g) { comp = c; diff --git a/megamek/src/megamek/client/ui/swing/widget/SuperHeavyTankMapSet.java b/megamek/src/megamek/client/ui/swing/widget/SuperHeavyTankMapSet.java index a40f7e14999..2c805d44ba8 100644 --- a/megamek/src/megamek/client/ui/swing/widget/SuperHeavyTankMapSet.java +++ b/megamek/src/megamek/client/ui/swing/widget/SuperHeavyTankMapSet.java @@ -14,15 +14,7 @@ */ package megamek.client.ui.swing.widget; -import java.awt.Color; -import java.awt.Font; -import java.awt.FontMetrics; -import java.awt.Image; -import java.awt.Polygon; -import java.util.Vector; - -import javax.swing.JComponent; - +import megamek.MMConstants; import megamek.client.ui.Messages; import megamek.client.ui.swing.GUIPreferences; import megamek.client.ui.swing.unitDisplay.UnitDisplay; @@ -31,6 +23,10 @@ import megamek.common.SuperHeavyTank; import megamek.common.util.fileUtils.MegaMekFile; +import javax.swing.*; +import java.awt.*; +import java.util.Vector; + /** * Class which keeps set of all areas required to represent Tank unit in * MechDisplay.ArmorPanel class. @@ -118,9 +114,9 @@ public class SuperHeavyTankMapSet implements DisplayMapSet { new int[] { 65, 65, 80, 100, 115, 115 }, new int[] { 125, 142, 165, 165, 142, 125 }, 6); - private static final Font FONT_LABEL = new Font("SansSerif", Font.PLAIN, + private static final Font FONT_LABEL = new Font(MMConstants.FONT_SANS_SERIF, Font.PLAIN, GUIPreferences.getInstance().getInt("AdvancedMechDisplayArmorSmallFontSize")); - private static final Font FONT_VALUE = new Font("SansSerif", Font.PLAIN, + private static final Font FONT_VALUE = new Font(MMConstants.FONT_SANS_SERIF, Font.PLAIN, GUIPreferences.getInstance().getInt("AdvancedMechDisplayArmorLargeFontSize")); public SuperHeavyTankMapSet(JComponent c, UnitDisplay unitDisplay) { diff --git a/megamek/src/megamek/client/ui/swing/widget/TankMapSet.java b/megamek/src/megamek/client/ui/swing/widget/TankMapSet.java index fb3743583a0..1b56ae48501 100644 --- a/megamek/src/megamek/client/ui/swing/widget/TankMapSet.java +++ b/megamek/src/megamek/client/ui/swing/widget/TankMapSet.java @@ -14,6 +14,7 @@ */ package megamek.client.ui.swing.widget; +import megamek.MMConstants; import megamek.client.ui.Messages; import megamek.client.ui.swing.GUIPreferences; import megamek.client.ui.swing.unitDisplay.UnitDisplay; @@ -84,9 +85,9 @@ public class TankMapSet implements DisplayMapSet { new int[] { 39, 39, 54, 74, 89, 89 }, new int[] { 139, 160, 187, 187, 160, 139 }, 6); - private static final Font FONT_LABEL = new Font("SansSerif", Font.PLAIN, + private static final Font FONT_LABEL = new Font(MMConstants.FONT_SANS_SERIF, Font.PLAIN, GUIPreferences.getInstance().getInt("AdvancedMechDisplayArmorSmallFontSize")); - private static final Font FONT_VALUE = new Font("SansSerif", Font.PLAIN, + private static final Font FONT_VALUE = new Font(MMConstants.FONT_SANS_SERIF, Font.PLAIN, GUIPreferences.getInstance().getInt("AdvancedMechDisplayArmorLargeFontSize")); public TankMapSet(JComponent c, UnitDisplay unitDisplay) { diff --git a/megamek/src/megamek/client/ui/swing/widget/TripodMechMapSet.java b/megamek/src/megamek/client/ui/swing/widget/TripodMechMapSet.java index 3817799f54d..0deb75cc66e 100644 --- a/megamek/src/megamek/client/ui/swing/widget/TripodMechMapSet.java +++ b/megamek/src/megamek/client/ui/swing/widget/TripodMechMapSet.java @@ -15,6 +15,7 @@ */ package megamek.client.ui.swing.widget; +import megamek.MMConstants; import megamek.client.ui.Messages; import megamek.client.ui.swing.GUIPreferences; import megamek.client.ui.swing.unitDisplay.UnitDisplay; @@ -152,9 +153,9 @@ public class TripodMechMapSet implements DisplayMapSet { private Image heatImage; - private static final Font FONT_LABEL = new Font("SansSerif", Font.PLAIN, + private static final Font FONT_LABEL = new Font(MMConstants.FONT_SANS_SERIF, Font.PLAIN, GUIPreferences.getInstance().getInt("AdvancedMechDisplayArmorSmallFontSize")); - private static final Font FONT_VALUE = new Font("SansSerif", Font.PLAIN, + private static final Font FONT_VALUE = new Font(MMConstants.FONT_SANS_SERIF, Font.PLAIN, GUIPreferences.getInstance().getInt("AdvancedMechDisplayArmorLargeFontSize")); public TripodMechMapSet(JComponent c, UnitDisplay unitDisplay) { diff --git a/megamek/src/megamek/client/ui/swing/widget/VTOLMapSet.java b/megamek/src/megamek/client/ui/swing/widget/VTOLMapSet.java index 4f71771c475..512c9a124d2 100644 --- a/megamek/src/megamek/client/ui/swing/widget/VTOLMapSet.java +++ b/megamek/src/megamek/client/ui/swing/widget/VTOLMapSet.java @@ -14,15 +14,7 @@ */ package megamek.client.ui.swing.widget; -import java.awt.Color; -import java.awt.Font; -import java.awt.FontMetrics; -import java.awt.Image; -import java.awt.Polygon; -import java.util.Vector; - -import javax.swing.JComponent; - +import megamek.MMConstants; import megamek.client.ui.Messages; import megamek.client.ui.swing.GUIPreferences; import megamek.client.ui.swing.unitDisplay.UnitDisplay; @@ -32,6 +24,10 @@ import megamek.common.VTOL; import megamek.common.util.fileUtils.MegaMekFile; +import javax.swing.*; +import java.awt.*; +import java.util.Vector; + /** * Class which keeps set of all areas required to represent VTOL unit in * MechDisplay.ArmorPanel class. @@ -117,9 +113,9 @@ public class VTOLMapSet implements DisplayMapSet { private Polygon rotorIS = new Polygon(new int[] { 45, 45, 105, 105 }, new int[] { 90, 75, 75, 90 }, 4); - private static final Font FONT_LABEL = new Font("SansSerif", Font.PLAIN, + private static final Font FONT_LABEL = new Font(MMConstants.FONT_SANS_SERIF, Font.PLAIN, GUIPreferences.getInstance().getInt("AdvancedMechDisplayArmorSmallFontSize")); - private static final Font FONT_VALUE = new Font("SansSerif", Font.PLAIN, + private static final Font FONT_VALUE = new Font(MMConstants.FONT_SANS_SERIF, Font.PLAIN, GUIPreferences.getInstance().getInt("AdvancedMechDisplayArmorLargeFontSize")); public VTOLMapSet(JComponent c, UnitDisplay unitDisplay) { diff --git a/megamek/src/megamek/client/ui/swing/widget/WarshipMapSet.java b/megamek/src/megamek/client/ui/swing/widget/WarshipMapSet.java index e7de82e54f9..0271a30d5ae 100644 --- a/megamek/src/megamek/client/ui/swing/widget/WarshipMapSet.java +++ b/megamek/src/megamek/client/ui/swing/widget/WarshipMapSet.java @@ -14,15 +14,7 @@ */ package megamek.client.ui.swing.widget; -import java.awt.Color; -import java.awt.Font; -import java.awt.FontMetrics; -import java.awt.Image; -import java.awt.Polygon; -import java.util.Vector; - -import javax.swing.JComponent; - +import megamek.MMConstants; import megamek.client.ui.swing.GUIPreferences; import megamek.client.ui.swing.unitDisplay.UnitDisplay; import megamek.common.Configuration; @@ -31,6 +23,10 @@ import megamek.common.Jumpship; import megamek.common.util.fileUtils.MegaMekFile; +import javax.swing.*; +import java.awt.*; +import java.util.Vector; + /** * Class which keeps set of all areas required to * represent ASF unit in MechDisplay.ArmorPanel class. @@ -70,9 +66,9 @@ public class WarshipMapSet implements DisplayMapSet { private Polygon aftArmor = new Polygon (new int[] { 0, -10, 40, 40, 60, 60, 110, 100 }, new int[] { 150, 200, 190, 200, 200, 190, 200, 150 }, 8); - private static final Font FONT_LABEL = new Font("SansSerif", Font.PLAIN, + private static final Font FONT_LABEL = new Font(MMConstants.FONT_SANS_SERIF, Font.PLAIN, GUIPreferences.getInstance().getInt("AdvancedMechDisplayArmorSmallFontSize")); - private static final Font FONT_VALUE = new Font("SansSerif", Font.PLAIN, + private static final Font FONT_VALUE = new Font(MMConstants.FONT_SANS_SERIF, Font.PLAIN, GUIPreferences.getInstance().getInt("AdvancedMechDisplayArmorLargeFontSize")); public WarshipMapSet(JComponent c, UnitDisplay unitDisplay) { diff --git a/megamek/src/megamek/common/Aero.java b/megamek/src/megamek/common/Aero.java index 82ab9124474..c1f8ff8f82e 100644 --- a/megamek/src/megamek/common/Aero.java +++ b/megamek/src/megamek/common/Aero.java @@ -17,7 +17,6 @@ import megamek.common.battlevalue.AeroBVCalculator; import megamek.common.cost.AeroCostCalculator; import megamek.common.enums.AimingMode; -import megamek.common.enums.GamePhase; import megamek.common.options.OptionsConstants; import org.apache.logging.log4j.LogManager; @@ -2296,7 +2295,7 @@ public boolean canLoad(Entity unit, boolean checkFalse) { // capital fighters can load other capital fighters (becoming squadrons) // but not in the deployment phase if (isCapitalFighter() && !unit.isEnemyOf(this) && unit.isCapitalFighter() && (getId() != unit.getId()) - && (game.getPhase() != GamePhase.DEPLOYMENT)) { + && !getGame().getPhase().isDeployment()) { return true; } diff --git a/megamek/src/megamek/common/BattleArmor.java b/megamek/src/megamek/common/BattleArmor.java index 41ae9ea6305..a81b2e13755 100644 --- a/megamek/src/megamek/common/BattleArmor.java +++ b/megamek/src/megamek/common/BattleArmor.java @@ -589,19 +589,25 @@ public String getMovementAbbr(EntityMovementType mtype) { @Override public HitData rollHitLocation(int table, int side, int aimedLocation, AimingMode aimingMode, int cover) { + return rollHitLocation(side, aimedLocation, aimingMode, false); + } + /** + * Battle Armor units can only get hit in undestroyed troopers. + * + * @param isAttackingConvInfantry Set to true when attacked by CI, as these cannot score TacOps crits + */ + public HitData rollHitLocation(int side, int aimedLocation, AimingMode aimingMode, + boolean isAttackingConvInfantry) { // If this squad was killed, target trooper 1 (just because). if (isDoomed()) { return new HitData(1); } if ((aimedLocation != LOC_NONE) && !aimingMode.isNone()) { - int roll = Compute.d6(2); - if ((5 < roll) && (roll < 9)) { - return new HitData(aimedLocation, side == ToHitData.SIDE_REAR, - true); + return new HitData(aimedLocation, side == ToHitData.SIDE_REAR, true); } } @@ -612,8 +618,7 @@ public HitData rollHitLocation(int table, int side, int aimedLocation, AimingMod // Remember that there's one more location than the number of troopers. // In http://forums.classicbattletech.com/index.php/topic,43203.0.html, // "previously destroyed includes the current phase" for rolling hits on - // a squad, - // modifying previous ruling in the AskThePM FAQ. + // a squad, modifying previous ruling in the AskThePM FAQ. while ((loc >= locations()) || (IArmorState.ARMOR_NA == this.getInternal(loc)) || (IArmorState.ARMOR_DESTROYED == this.getInternal(loc)) @@ -621,16 +626,13 @@ public HitData rollHitLocation(int table, int side, int aimedLocation, AimingMod loc = Compute.d6(); } - int critLocation = Compute.d6(); - // TacOps p. 108 Trooper takes a crit if a second roll is the same - // location as the first. + // TO:AR p.108: Trooper takes a crit if a second roll is the same location as the first. if (game.getOptions().booleanOption(OptionsConstants.ADVCOMBAT_TACOPS_BA_CRITICALS) - && (loc == critLocation)) { + && (loc == Compute.d6()) && !isAttackingConvInfantry) { return new HitData(loc, false, HitData.EFFECT_CRITICAL); } // Hit that trooper. return new HitData(loc); - } @Override @@ -1048,6 +1050,12 @@ public int getLongStealthMod() { return longStealthMod; } + // Only for ground vehicles and certain infantry + @Override + public boolean isEligibleForPavementBonus() { + return false; + } + /** * Determine if this unit has an active stealth system. *

diff --git a/megamek/src/megamek/common/Bay.java b/megamek/src/megamek/common/Bay.java index 4ddfe375575..2ca246de34f 100644 --- a/megamek/src/megamek/common/Bay.java +++ b/megamek/src/megamek/common/Bay.java @@ -14,11 +14,11 @@ */ package megamek.common; -import megamek.common.enums.GamePhase; - import java.util.ArrayList; import java.util.List; +import java.util.Objects; import java.util.Vector; +import java.util.stream.Collectors; /** * Represents a volume of space set aside for carrying cargo of some sort @@ -220,7 +220,7 @@ public void load(Entity unit) throws IllegalArgumentException { } currentSpace -= spaceForUnit(unit); - if ((unit.game.getPhase() != GamePhase.DEPLOYMENT) && (unit.game.getPhase() != GamePhase.LOUNGE)) { + if (!unit.getGame().getPhase().isDeployment() && !unit.getGame().getPhase().isLounge()) { loadedThisTurn += 1; } @@ -239,17 +239,12 @@ public void load(Entity unit) throws IllegalArgumentException { @Override public Vector getLoadedUnits() { // Return a copy of our list of troops. - Vector loaded = new Vector<>(); - for (int unit : troops) { - Entity entity = game.getEntity(unit); - - if (entity != null) { - loaded.add(game.getEntity(unit)); - } - } - return loaded; + return troops.stream() + .map(unit -> game.getEntity(unit)) + .filter(Objects::nonNull) + .collect(Collectors.toCollection(Vector::new)); } - + /** * Generate a raw list of the Ids stored in troops. * Used by MHQ in cases where we can't get the entities via Game diff --git a/megamek/src/megamek/common/BoardDimensions.java b/megamek/src/megamek/common/BoardDimensions.java index 12785e41e1c..e7ca976c67d 100644 --- a/megamek/src/megamek/common/BoardDimensions.java +++ b/megamek/src/megamek/common/BoardDimensions.java @@ -1,111 +1,67 @@ -/** - * A class for representing board sizes. +/* + * Copyright (c) 2013 - Edward Cullen (eddy@obsessedcomputers.co.uk) + * Copyright (c) 2022 - The MegaMek Team. All Rights Reserved. * - * Copyright © 2013 Edward Cullen (eddy@obsessedcomputers.co.uk) + * This file is part of MegaMek. * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License, - * version 2, as published by the Free Software Foundation. + * MegaMek 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 3 of the License, or + * (at your option) any later version. * - * This program is distributed in the hope that it will be useful, + * MegaMek 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 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, it is available online at: - * http://www.gnu.org/licenses/gpl-2.0.html + * along with MegaMek. If not, see . */ package megamek.common; import java.io.Serializable; +import java.util.Objects; /** * Type-safe, immutable, dimensions class for handling board sizes. * * @author Edward Cullen + * @author Simon (Juliez) */ -public class BoardDimensions implements Cloneable, Serializable, - Comparable { +public class BoardDimensions implements Serializable, Comparable { - /** - * See {@link java.io.Serializable}. - */ private static final long serialVersionUID = -3562335656969231217L; /** * Construct a new BoardDimensions object. * - * @param width - * The width. - * @param height - * The height. - * @throws IllegalArgumentException - * If either width or height is less than 1. + * @param width The width + * @param height The height + * @throws IllegalArgumentException If either width or height is less than 1. */ public BoardDimensions(final int width, final int height) { if ((width < 1) || (height < 1)) { - throw new IllegalArgumentException( - "width and height must be positive non-zero values"); + throw new IllegalArgumentException("width and height must be positive non-zero values"); } - w = width; h = height; } - /** - * Copy constructor. - * - * @param old - * The instance to copy. - */ - public BoardDimensions(final BoardDimensions old) { - if (old == null) { - throw new IllegalArgumentException( - "must provide instance to copy constructor"); - } - w = old.w; - h = old.h; - } - - /** - * The width. - * - * @return The width. - */ + /** @return The board width. */ public int width() { return w; } - /** - * The height. - * - * @return The height. - */ + /** @return The board height. */ public int height() { return h; } - /** - * The total number of hexes in the board. - * - * @return The total number of hexes in the board. - */ + /** @return The total number of hexes in the board. */ public long numHexes() { return (long) width() * height(); } - /** - * {@inheritDoc} - */ - @Override - public BoardDimensions clone() { - return new BoardDimensions(this); - } - - /** - * {@inheritDoc} - */ @Override public boolean equals(final Object obj) { boolean result; @@ -120,51 +76,24 @@ public boolean equals(final Object obj) { return result; } - /** - * {@inheritDoc} - */ @Override public int hashCode() { - final int prime = 31; - int result = 1; - result = (prime * result) + h; - result = (prime * result) + w; - return result; + return Objects.hash(w, h); } - /** - * Return the dimensions this object represents in the form "WIDTHxHEIGHT". - * - * @return A String! - */ @Override public String toString() { - return w + "x" + h; + return w + " x " + h; } /** - * Compares dimensions based width, falling back on height if the widths - * equal + * Compares BoardDimensions based on width, falling back on height if the widths are equal */ @Override public int compareTo(final BoardDimensions o) { - int result = 0; - - if (width() < o.width()) { - result = -1; - } else if (width() > o.width()) { - result = 1; - } else { - // width is the same, next consider height - if (height() < o.height()) { - result = -1; - } else if (height() > o.height()) { - result = 1; - } - } - return result; + return (width() - o.width() != 0) ? width() - o.width() : height() - o.height(); } private final int w; private final int h; -} +} \ No newline at end of file diff --git a/megamek/src/megamek/common/CompositeTechLevel.java b/megamek/src/megamek/common/CompositeTechLevel.java index d1ec1a05559..14c6f69d0a9 100644 --- a/megamek/src/megamek/common/CompositeTechLevel.java +++ b/megamek/src/megamek/common/CompositeTechLevel.java @@ -307,7 +307,7 @@ private void addExtinctionRange(int start, int end) { extinct = merged; } - private static class DateRange implements Serializable, Comparable { + public static class DateRange implements Serializable, Comparable { private static final long serialVersionUID = 3144194494591950878L; Integer start = null; diff --git a/megamek/src/megamek/common/Compute.java b/megamek/src/megamek/common/Compute.java index f305776781e..af33251ae20 100644 --- a/megamek/src/megamek/common/Compute.java +++ b/megamek/src/megamek/common/Compute.java @@ -6021,10 +6021,11 @@ public static Coords scatterDiveBombs(Coords coords, int moF) { * TW pg 246. The scatter only happens in the "front" three facings. * * @param coords The Coords to scatter from - * @param facing + * @param facing Direction we were going at the time the bomb was dropped + * @param moF How badly we failed * @return the Coords scattered to and distance (moF) */ - public static Coords scatterAltitudeBombs(Coords coords, int facing) { + public static Coords scatterAltitudeBombs(Coords coords, int facing, int moF) { int dir = 0; int scatterDirection = Compute.d6(1); switch (scatterDirection) { @@ -6041,8 +6042,8 @@ public static Coords scatterAltitudeBombs(Coords coords, int facing) { dir = (facing + 1) % 6; break; } - int dist = Compute.d6(1); - return coords.translated(dir, dist); + + return coords.translated(dir, moF); } /** diff --git a/megamek/src/megamek/common/Dropship.java b/megamek/src/megamek/common/Dropship.java index e69644d51e9..5b08ed0ed37 100644 --- a/megamek/src/megamek/common/Dropship.java +++ b/megamek/src/megamek/common/Dropship.java @@ -14,7 +14,6 @@ import megamek.client.ui.swing.calculationReport.CalculationReport; import megamek.common.battlevalue.DropShipBVCalculator; import megamek.common.cost.DropShipCostCalculator; -import megamek.common.enums.GamePhase; import megamek.common.options.OptionsConstants; import java.util.HashMap; @@ -621,7 +620,7 @@ public boolean usesWeaponBays() { if (null == game) { return true; } - return (isAirborne() || isSpaceborne() || game.getPhase() == GamePhase.LOUNGE); + return (isAirborne() || isSpaceborne() || game.getPhase().isLounge()); } @Override diff --git a/megamek/src/megamek/common/Entity.java b/megamek/src/megamek/common/Entity.java index af419af26bc..73f815f1bc5 100644 --- a/megamek/src/megamek/common/Entity.java +++ b/megamek/src/megamek/common/Entity.java @@ -3901,12 +3901,10 @@ public int getFirstWeapon() { // we can't use during this phase... do we? for (Mounted mounted : getWeaponList()) { // TAG only in the correct phase... - if ((mounted.getType().hasFlag(WeaponType.F_TAG) && (game - .getPhase() != GamePhase.OFFBOARD)) - || (!mounted.getType().hasFlag(WeaponType.F_TAG) && (game - .getPhase() == GamePhase.OFFBOARD)) - //No AMS, unless it's in 'weapon' mode - || (mounted.getType().hasFlag(WeaponType.F_AMS) && !mounted.curMode().equals(Weapon.MODE_AMS_MANUAL))) { + if ((mounted.getType().hasFlag(WeaponType.F_TAG) && !getGame().getPhase().isOffboard()) + || (!mounted.getType().hasFlag(WeaponType.F_TAG) && getGame().getPhase().isOffboard()) + // No AMS, unless it's in 'weapon' mode + || (mounted.getType().hasFlag(WeaponType.F_AMS) && !mounted.curMode().equals(Weapon.MODE_AMS_MANUAL))) { continue; } @@ -3964,24 +3962,20 @@ public boolean isWeaponValidForPhase(Mounted mounted) { || (mounted.getLinked().getUsableShotsLeft() > 0))) { // TAG only in the correct phase... - if ((mounted.getType().hasFlag(WeaponType.F_TAG) - && (game.getPhase() != GamePhase.OFFBOARD)) - || (!mounted.getType().hasFlag(WeaponType.F_TAG) - && (game.getPhase() - == GamePhase.OFFBOARD))) { + if ((mounted.getType().hasFlag(WeaponType.F_TAG) && !getGame().getPhase().isOffboard()) + || (!mounted.getType().hasFlag(WeaponType.F_TAG) && getGame().getPhase().isOffboard())) { return false; } // Artillery or Bearings-only missiles only in the targeting phase... - if (!(mounted.getType().hasFlag(WeaponType.F_ARTILLERY) - || mounted.isInBearingsOnlyMode() - || (this.getAltitude() == 0 - && mounted.getType() instanceof CapitalMissileWeapon)) - && (game.getPhase() == GamePhase.TARGETING)) { + if (getGame().getPhase().isTargeting() + && !(mounted.getType().hasFlag(WeaponType.F_ARTILLERY) + || mounted.isInBearingsOnlyMode() + || ((this.getAltitude() == 0) && (mounted.getType() instanceof CapitalMissileWeapon)))) { return false; } // No Bearings-only missiles in the firing phase - if (mounted.isInBearingsOnlyMode() && game.getPhase() == GamePhase.FIRING) { + if (mounted.isInBearingsOnlyMode() && getGame().getPhase().isFiring()) { return false; } @@ -7001,7 +6995,7 @@ TargetRoll.AUTOMATIC_FAIL, getCrew().getPiloting() } if (game.getOptions().booleanOption(OptionsConstants.ADVANCED_TACOPS_FATIGUE) - && crew.isPilotingFatigued()) { + && crew.isPilotingFatigued()) { roll.addModifier(1, "fatigue"); } @@ -7009,7 +7003,7 @@ TargetRoll.AUTOMATIC_FAIL, getCrew().getPiloting() roll.addModifier(taserInterference, "taser interference"); } - if ((game.getPhase() == GamePhase.MOVEMENT) && isPowerReverse()) { + if (getGame().getPhase().isMovement() && isPowerReverse()) { roll.addModifier(1, "power reverse"); } @@ -7035,10 +7029,10 @@ public PilotingRollData addConditionBonuses(PilotingRollData roll, PlanetaryConditions conditions = game.getPlanetaryConditions(); // check light conditions for "running" entities if ((moveType == EntityMovementType.MOVE_RUN) - || (moveType == EntityMovementType.MOVE_SPRINT) - || (moveType == EntityMovementType.MOVE_VTOL_RUN) - || (moveType == EntityMovementType.MOVE_OVER_THRUST) - || (moveType == EntityMovementType.MOVE_VTOL_SPRINT)) { + || (moveType == EntityMovementType.MOVE_SPRINT) + || (moveType == EntityMovementType.MOVE_VTOL_RUN) + || (moveType == EntityMovementType.MOVE_OVER_THRUST) + || (moveType == EntityMovementType.MOVE_VTOL_SPRINT)) { int lightPenalty = conditions.getLightPilotPenalty(); if (lightPenalty > 0) { roll.addModifier(lightPenalty, @@ -8097,8 +8091,10 @@ public void load(Entity unit, boolean checkElev, int bayNumber) { while (iter.hasMoreElements()) { Transporter next = iter.nextElement(); if (next.canLoad(unit) - && (!checkElev || (unit.getElevation() == getElevation())) - && ((bayNumber == -1) || (((Bay) next).getBayNumber() == bayNumber))) { + && (!checkElev || (unit.getElevation() == getElevation())) + && ((bayNumber == -1) + || ((next instanceof Bay) && (((Bay) next).getBayNumber() == bayNumber)) + || ((next instanceof DockingCollar) && (((DockingCollar) next).getCollarNumber() == bayNumber)))) { next.load(unit); unit.setTargetBay(-1); // Reset the target bay for later. return; @@ -8106,8 +8102,7 @@ public void load(Entity unit, boolean checkElev, int bayNumber) { } // If we got to this point, then we can't load the unit. - throw new IllegalArgumentException(getShortName() + " can not load " - + unit.getShortName()); + throw new IllegalArgumentException(getShortName() + " can not load " + unit.getShortName()); } public void load(Entity unit, boolean checkElev) { @@ -8143,7 +8138,7 @@ public void recover(Entity unit) { choice = 2; } if (nextbay instanceof SmallCraftBay) { - choice = 1; + choice = 1; } } } @@ -9740,13 +9735,12 @@ && isEligibleForArtyAutoHitHexes()) { } // Hidden units are always eligible for PRE phases - if ((phase == GamePhase.PREMOVEMENT) || (phase == GamePhase.PREFIRING)) { + if (phase.isPremovement() || phase.isPrefiring()) { return isHidden(); } // Hidden units shouldn't be counted for turn order, unless deploying or firing (spotting) - if (isHidden() && (phase != GamePhase.DEPLOYMENT) - && (phase != GamePhase.FIRING)) { + if (isHidden() && !phase.isDeployment() && !phase.isFiring()) { return false; } @@ -9774,9 +9768,7 @@ && isEligibleForArtyAutoHitHexes()) { * future */ public boolean canAssist(GamePhase phase) { - if ((phase != GamePhase.PHYSICAL) - && (phase != GamePhase.FIRING) - && (phase != GamePhase.OFFBOARD)) { + if (!phase.isPhysical() && !phase.isFiring() && !phase.isOffboard()) { return false; } // if you're charging or finding a club, it's already declared @@ -15251,8 +15243,7 @@ public int modifyPhysicalDamageForMeleeSpecialist() { return 1; } - - + // Getters and setters for sensor contacts and firing solutions. Currently, only used in space combat /** * Retrieves the IDs of all entities that this entity has detected with sensors @@ -15524,4 +15515,9 @@ public boolean hasMulId() { *

This method does nothing by default and must be overridden for unit types that get Clan CASE. */ public void addClanCase() { } + + /** @return True for unit types that have an automatic external searchlight (Meks and Tanks). */ + public boolean getsAutoExternalSearchlight() { + return false; + } } diff --git a/megamek/src/megamek/common/EntityMovementMode.java b/megamek/src/megamek/common/EntityMovementMode.java index 7942a4e3fd5..bdc2ad19c44 100644 --- a/megamek/src/megamek/common/EntityMovementMode.java +++ b/megamek/src/megamek/common/EntityMovementMode.java @@ -20,7 +20,6 @@ package megamek.common; import megamek.MegaMek; -import megamek.common.util.EncodeControl; import org.apache.logging.log4j.LogManager; import java.util.List; @@ -67,7 +66,7 @@ public enum EntityMovementMode { //region Constructors EntityMovementMode(final String name) { final ResourceBundle resources = ResourceBundle.getBundle("megamek.common.messages", - MegaMek.getMMOptions().getLocale(), new EncodeControl()); + MegaMek.getMMOptions().getLocale()); this.name = resources.getString(name); } //endregion Constructors diff --git a/megamek/src/megamek/common/EquipmentMessages.java b/megamek/src/megamek/common/EquipmentMessages.java index 62a4d4fe649..37c304a9b10 100644 --- a/megamek/src/megamek/common/EquipmentMessages.java +++ b/megamek/src/megamek/common/EquipmentMessages.java @@ -14,7 +14,6 @@ package megamek.common; import megamek.MegaMek; -import megamek.common.util.EncodeControl; import java.text.MessageFormat; import java.util.MissingResourceException; @@ -22,7 +21,7 @@ public class EquipmentMessages { private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle.getBundle("megamek.common.equipmentmessages", - MegaMek.getMMOptions().getLocale(), new EncodeControl()); + MegaMek.getMMOptions().getLocale()); private EquipmentMessages() { diff --git a/megamek/src/megamek/common/EquipmentType.java b/megamek/src/megamek/common/EquipmentType.java index 501595ff4d6..73d307a2742 100644 --- a/megamek/src/megamek/common/EquipmentType.java +++ b/megamek/src/megamek/common/EquipmentType.java @@ -1419,20 +1419,8 @@ public String toString() { return "EquipmentType: " + name; } - protected static GameOptions getGameOptions() { - if (Server.getServerInstance() == null) { - return null; - } else if (Server.getServerInstance().getGame() == null) { - return null; - } - return Server.getServerInstance().getGame().getOptions(); - } - public String getShortName() { - if (shortName.isBlank()) { - return getName(); - } - return shortName; + return shortName.isBlank() ? getName() : shortName; } public String getShortName(double size) { diff --git a/megamek/src/megamek/common/FighterSquadron.java b/megamek/src/megamek/common/FighterSquadron.java index 9463fc4911b..7abba14f65b 100644 --- a/megamek/src/megamek/common/FighterSquadron.java +++ b/megamek/src/megamek/common/FighterSquadron.java @@ -14,7 +14,6 @@ import megamek.client.ui.swing.calculationReport.CalculationReport; import megamek.common.cost.CostCalculator; import megamek.common.enums.AimingMode; -import megamek.common.enums.GamePhase; import megamek.common.options.OptionsConstants; import org.apache.logging.log4j.LogManager; @@ -678,7 +677,8 @@ public void load(Entity unit, boolean checkFalse) throws IllegalArgumentExceptio // Add the unit to our squadron. fighters.addElement(unit.getId()); } - if (game.getPhase() != GamePhase.LOUNGE) { + + if (!getGame().getPhase().isLounge()) { computeSquadronBombLoadout(); // updateWeaponGroups() and loadAllWeapons() are called in // computeSquadronBombLoadout() @@ -711,7 +711,7 @@ public void load(Entity unit, boolean checkFalse, int bayNumber) { public boolean unload(Entity unit) { // Remove the unit if we are carrying it. boolean success = fighters.removeElement(unit.getId()); - if (game.getPhase() != GamePhase.LOUNGE) { + if (!getGame().getPhase().isLounge()) { computeSquadronBombLoadout(); // updateWeaponGroups() and loadAllWeapons() are called in // computeSquadronBombLoadout() diff --git a/megamek/src/megamek/common/Game.java b/megamek/src/megamek/common/Game.java index 52ed4638ffe..6c528ecee4e 100644 --- a/megamek/src/megamek/common/Game.java +++ b/megamek/src/megamek/common/Game.java @@ -58,6 +58,10 @@ public class Game extends AbstractGame implements Serializable { */ public final Version version = MMConstants.VERSION; + private Vector players = new Vector<>(); + private Hashtable playerIds = new Hashtable<>(); + private Vector teams = new Vector<>(); + private GameOptions options = new GameOptions(); private Board board = new Board(); diff --git a/megamek/src/megamek/common/Infantry.java b/megamek/src/megamek/common/Infantry.java index 3e0146996e3..17cc5cef186 100644 --- a/megamek/src/megamek/common/Infantry.java +++ b/megamek/src/megamek/common/Infantry.java @@ -723,15 +723,12 @@ protected int doBattleValueCalculation(boolean ignoreC3, boolean ignoreSkill, Ca public Vector victoryReport() { Vector vDesc = new Vector<>(); - Report r = new Report(7025); - r.type = Report.PUBLIC; + Report r = new Report(7025, Report.PUBLIC); r.addDesc(this); vDesc.addElement(r); - r = new Report(7041); - r.type = Report.PUBLIC; + r = new Report(7041, Report.PUBLIC); r.add(getCrew().getGunnery()); - r.newlines = 0; vDesc.addElement(r); r = new Report(7070, Report.PUBLIC); @@ -1031,13 +1028,13 @@ public boolean canAssaultDrop() { @Override public boolean isEligibleFor(GamePhase phase) { - if ((turnsLayingExplosives > 0) && (phase != GamePhase.PHYSICAL)) { + if ((turnsLayingExplosives > 0) && !phase.isPhysical()) { return false; - } - if ((dugIn != DUG_IN_COMPLETE) && (dugIn != DUG_IN_NONE)) { + } else if ((dugIn != DUG_IN_COMPLETE) && (dugIn != DUG_IN_NONE)) { return false; + } else { + return super.isEligibleFor(phase); } - return super.isEligibleFor(phase); } @Override @@ -1497,6 +1494,16 @@ public boolean isSquad() { return squadCount == 1; } + @Override + public boolean isEligibleForPavementBonus() { + if ((game != null) + && game.getOptions().booleanOption(OptionsConstants.ADVANCED_TACOPS_INF_PAVE_BONUS)) { + return movementMode == EntityMovementMode.TRACKED || movementMode == EntityMovementMode.WHEELED || movementMode == EntityMovementMode.INF_MOTORIZED || movementMode == EntityMovementMode.HOVER; + } else { + return false; + } + } + @Override public void setMovementMode(EntityMovementMode movementMode) { super.setMovementMode(movementMode); diff --git a/megamek/src/megamek/common/Mech.java b/megamek/src/megamek/common/Mech.java index 987f891c52d..c9cee154207 100644 --- a/megamek/src/megamek/common/Mech.java +++ b/megamek/src/megamek/common/Mech.java @@ -6544,4 +6544,9 @@ public boolean isMek() { public boolean isIndustrialMek() { return isIndustrial(); } + + @Override + public boolean getsAutoExternalSearchlight() { + return true; + } } diff --git a/megamek/src/megamek/common/MechSummaryCache.java b/megamek/src/megamek/common/MechSummaryCache.java index 7003bce89b6..147e7f15f90 100644 --- a/megamek/src/megamek/common/MechSummaryCache.java +++ b/megamek/src/megamek/common/MechSummaryCache.java @@ -158,8 +158,8 @@ private void block() { synchronized (lock) { try { lock.wait(); - } catch (Exception e) { - // Ignore + } catch (Exception ignored) { + } } } @@ -232,10 +232,10 @@ public void loadMechData(boolean ignoreUnofficial) { fin.close(); istream.close(); } - } catch (Exception e) { + } catch (Exception ex) { loadReport.append(" Unable to load unit cache: ") - .append(e.getMessage()).append("\n"); - LogManager.getLogger().error(loadReport.toString(), e); + .append(ex.getMessage()).append("\n"); + LogManager.getLogger().error(loadReport.toString(), ex); } } @@ -639,7 +639,7 @@ private boolean loadMechsFromDirectory(Vector vMechs, .append(failedEquipment.next()).append("\n"); } } - } catch (EntityLoadingException ex) { + } catch (Exception ex) { loadReport.append(" Loading from ").append(f).append("\n"); loadReport.append("*** Unable to load file: "); StringWriter stringWriter = new StringWriter(); @@ -680,8 +680,8 @@ private boolean loadMechsFromZipFile(Vector vMechs, try { zFile.close(); return false; - } catch (IOException e) { - LogManager.getLogger().error("", e); + } catch (Exception ex) { + LogManager.getLogger().error("", ex); } } ZipEntry zEntry = (ZipEntry) i.nextElement(); @@ -773,7 +773,7 @@ private void addLookupNames() { } } } - } catch (IOException ex) { + } catch (Exception ex) { LogManager.getLogger().error("", ex); } } diff --git a/megamek/src/megamek/common/Messages.java b/megamek/src/megamek/common/Messages.java index 11be48a2d3d..0a02d2a6120 100644 --- a/megamek/src/megamek/common/Messages.java +++ b/megamek/src/megamek/common/Messages.java @@ -14,7 +14,6 @@ package megamek.common; import megamek.MegaMek; -import megamek.common.util.EncodeControl; import java.text.MessageFormat; import java.util.MissingResourceException; @@ -22,7 +21,7 @@ public class Messages { private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle.getBundle("megamek.common.messages", - MegaMek.getMMOptions().getLocale(), new EncodeControl()); + MegaMek.getMMOptions().getLocale()); private Messages() { diff --git a/megamek/src/megamek/common/PlanetaryConditions.java b/megamek/src/megamek/common/PlanetaryConditions.java index 4bca4e7510e..dd349fd1f30 100644 --- a/megamek/src/megamek/common/PlanetaryConditions.java +++ b/megamek/src/megamek/common/PlanetaryConditions.java @@ -34,9 +34,21 @@ public class PlanetaryConditions implements Serializable { public static final int L_FULL_MOON = 2; public static final int L_MOONLESS = 3; public static final int L_PITCH_BLACK = 4; - private static String[] lightNames = { "Daylight", "Dusk", "Full Moon Night", "Moonless Night", - "Pitch Black" }; + private static final String MSG_NAME_LIGHT_DAYLIGHT = Messages.getString("PlanetaryConditions.DisplayableName.Light.Daylight"); + private static final String MSG_NAME_LIGHT_DUSK = Messages.getString("PlanetaryConditions.DisplayableName.Light.Dusk"); + private static final String MSG_NAME_LIGHT_FULLMOONNIGHT = Messages.getString("PlanetaryConditions.DisplayableName.Light.Full Moon Night"); + private static final String MSG_NAME_LIGHT_MOONLESSNIGHT = Messages.getString("PlanetaryConditions.DisplayableName.Light.Moonless Night"); + private static final String MSG_NAME_LIGHT_PITCHBLACK = Messages.getString("PlanetaryConditions.DisplayableName.Light.Pitch Black"); + private static String[] lightNames = { MSG_NAME_LIGHT_DAYLIGHT, MSG_NAME_LIGHT_DUSK, MSG_NAME_LIGHT_FULLMOONNIGHT, + MSG_NAME_LIGHT_MOONLESSNIGHT, MSG_NAME_LIGHT_PITCHBLACK }; public static final int L_SIZE = lightNames.length; + private static final String MSG_INDICATOR_LIGHT_DAY = Messages.getString("PlanetaryConditions.Indicator.Light.Day"); + private static final String MSG_INDICATOR_LIGHT_DUSK = Messages.getString("PlanetaryConditions.Indicator.Light.Dusk"); + private static final String MSG_INDICATOR_LIGHT_FULL_MOON = Messages.getString("PlanetaryConditions.Indicator.Light.FullMoon"); + private static final String MSG_INDICATOR_LIGHT_MOONLESS = Messages.getString("PlanetaryConditions.Indicator.Light.Moonless"); + private static final String MSG_INDICATOR_LIGHT_PITCH_BLACK = Messages.getString("PlanetaryConditions.Indicator.Light.PitchBlack"); + private static String[] lightIndicators = { MSG_INDICATOR_LIGHT_DAY, MSG_INDICATOR_LIGHT_DUSK, MSG_INDICATOR_LIGHT_FULL_MOON, + MSG_INDICATOR_LIGHT_MOONLESS, MSG_INDICATOR_LIGHT_PITCH_BLACK }; // Weather public static final int WE_NONE = 0; @@ -55,10 +67,39 @@ public class PlanetaryConditions implements Serializable { public static final int WE_HEAVY_HAIL = 13;// NYI public static final int WE_LIGHTNING_STORM = 14;// NYI // public static final int WE_BLIZZARD = 11; does not exist anymore - private static String[] weatherNames = { "Clear", "Light Rain", "Moderate Rain", "Heavy Rain", "Gusting Rain", "Torrential Downpour", - "Light Snowfall", "Moderate Snowfall", "Snow Flurries", "Heavy Snowfall", "Sleet", - "Ice Storm" };//, "Light Hail", "Heavy Hail", "Lightning Storm" }; + private static final String MSG_NAME_WEATHER_CLEAR = Messages.getString("PlanetaryConditions.DisplayableName.Weather.Clear"); + private static final String MSG_NAME_WEATHER_LIGHTRAIN = Messages.getString("PlanetaryConditions.DisplayableName.Weather.Light Rain"); + private static final String MSG_NAME_WEATHER_MODRAIN = Messages.getString("PlanetaryConditions.DisplayableName.Weather.Moderate Rain"); + private static final String MSG_NAME_WEATHER_HEAVYGRAIN = Messages.getString("PlanetaryConditions.DisplayableName.Weather.Heavy Rain"); + private static final String MSG_NAME_WEATHER_GUSTINGRAIN = Messages.getString("PlanetaryConditions.DisplayableName.Weather.Gusting Rain"); + private static final String MSG_NAME_WEATHER_TORRDOWNPOUR = Messages.getString("PlanetaryConditions.DisplayableName.Weather.Torrential Downpour"); + private static final String MSG_NAME_WEATHER_LIGHTSNOWFALL = Messages.getString("PlanetaryConditions.DisplayableName.Weather.Light Snowfall"); + private static final String MSG_NAME_WEATHER_MODSNOWFALL = Messages.getString("PlanetaryConditions.DisplayableName.Weather.Moderate Snowfall"); + private static final String MSG_NAME_WEATHER_SNOWFLUFFIES = Messages.getString("PlanetaryConditions.DisplayableName.Weather.Snow Flurries"); + private static final String MSG_NAME_WEATHER_HEAVYSNOWFALL = Messages.getString("PlanetaryConditions.DisplayableName.Weather.Heavy Snowfall"); + private static final String MSG_NAME_WEATHER_SLEET = Messages.getString("PlanetaryConditions.DisplayableName.Weather.Sleet"); + private static final String MSG_NAME_WEATHER_ICESTORM = Messages.getString("PlanetaryConditions.DisplayableName.Weather.Ice Storm"); + private static String[] weatherNames = { MSG_NAME_WEATHER_CLEAR, MSG_NAME_WEATHER_LIGHTRAIN, MSG_NAME_WEATHER_MODRAIN, + MSG_NAME_WEATHER_HEAVYGRAIN, MSG_NAME_WEATHER_GUSTINGRAIN, MSG_NAME_WEATHER_TORRDOWNPOUR, + MSG_NAME_WEATHER_LIGHTSNOWFALL, MSG_NAME_WEATHER_MODSNOWFALL, MSG_NAME_WEATHER_SNOWFLUFFIES, + MSG_NAME_WEATHER_HEAVYSNOWFALL, MSG_NAME_WEATHER_SLEET, MSG_NAME_WEATHER_ICESTORM };//, "Light Hail", "Heavy Hail", "Lightning Storm" }; public static final int WE_SIZE = weatherNames.length; + private static final String MSG_INDICATOR_WEATHER_NONE = Messages.getString("PlanetaryConditions.Indicator.Weather.None"); + private static final String MSG_INDICATOR_WEATHER_LIGHT_RAIN = Messages.getString("PlanetaryConditions.Indicator.Weather.LightRain"); + private static final String MSG_INDICATOR_WEATHER_MOD_RAIN = Messages.getString("PlanetaryConditions.Indicator.Weather.ModRain"); + private static final String MSG_INDICATOR_WEATHER_HEAVY_RAIN = Messages.getString("PlanetaryConditions.Indicator.Weather.HeavyRain"); + private static final String MSG_INDICATOR_WEATHER_GUSTING_RAIN = Messages.getString("PlanetaryConditions.Indicator.Weather.GustingRain"); + private static final String MSG_INDICATOR_WEATHER_DOWNPOUR = Messages.getString("PlanetaryConditions.Indicator.Weather.Downpour"); + private static final String MSG_INDICATOR_WEATHER_LIGHT_SNOW = Messages.getString("PlanetaryConditions.Indicator.Weather.LightSnow"); + private static final String MSG_INDICATOR_WEATHER_MOD_SNOW = Messages.getString("PlanetaryConditions.Indicator.Weather.ModSnow"); + private static final String MSG_INDICATOR_WEATHER_SNOW_FLURRIES = Messages.getString("PlanetaryConditions.Indicator.Weather.SnowFlurries"); + private static final String MSG_INDICATOR_WEATHER_HEAVY_SNOW = Messages.getString("PlanetaryConditions.Indicator.Weather.HeavySnow"); + private static final String MSG_INDICATOR_WEATHER_SLEET = Messages.getString("PlanetaryConditions.Indicator.Weather.Sleet"); + private static final String MSG_INDICATOR_WEATHER_ICE_STORM = Messages.getString("PlanetaryConditions.Indicator.Weather.IceStorm"); + private static String[] weatherIndicators = { MSG_INDICATOR_WEATHER_NONE, MSG_INDICATOR_WEATHER_LIGHT_RAIN, MSG_INDICATOR_WEATHER_MOD_RAIN, + MSG_INDICATOR_WEATHER_HEAVY_RAIN, MSG_INDICATOR_WEATHER_GUSTING_RAIN, MSG_INDICATOR_WEATHER_DOWNPOUR, + MSG_INDICATOR_WEATHER_LIGHT_SNOW, MSG_INDICATOR_WEATHER_MOD_SNOW, MSG_INDICATOR_WEATHER_SNOW_FLURRIES, + MSG_INDICATOR_WEATHER_HEAVY_SNOW, MSG_INDICATOR_WEATHER_SLEET, MSG_INDICATOR_WEATHER_ICE_STORM}; // Wind public static final int WI_NONE = 0; @@ -68,15 +109,55 @@ public class PlanetaryConditions implements Serializable { public static final int WI_STORM = 4; public static final int WI_TORNADO_F13 = 5; public static final int WI_TORNADO_F4 = 6; - - private static String[] windNames = { "Calm", "Light Gale", "Moderate Gale", "Strong Gale", "Storm", "Tornado F1-F3", "Tornado F4" }; + private static final String MSG_NAME_WINDSTRENGTH_LIGHT_CALM = Messages.getString("PlanetaryConditions.DisplayableName.WindStrength.Calm"); + private static final String MSG_NAME_WINDSTRENGTH_LIGHT_GALE = Messages.getString("PlanetaryConditions.DisplayableName.WindStrength.Light Gale"); + private static final String MSG_NAME_WINDSTRENGTH_MOD_GALE = Messages.getString("PlanetaryConditions.DisplayableName.WindStrength.Moderate Gale"); + private static final String MSG_NAME_WINDSTRENGTH_STRONG_GALE = Messages.getString("PlanetaryConditions.DisplayableName.WindStrength.Strong Gale"); + private static final String MSG_NAME_WINDSTRENGTH_STORM = Messages.getString("PlanetaryConditions.DisplayableName.WindStrength.Storm"); + private static final String MSG_NAME_WINDSTRENGTH_TORNADO_F13 = Messages.getString("PlanetaryConditions.DisplayableName.WindStrength.Tornado F1-F3"); + private static final String MSG_NAME_WINDSTRENGTH_TORNADO_F4 = Messages.getString("PlanetaryConditions.DisplayableName.WindStrength.Tornado F4"); + private static String[] windNames = { MSG_NAME_WINDSTRENGTH_LIGHT_CALM, MSG_NAME_WINDSTRENGTH_LIGHT_GALE, + MSG_NAME_WINDSTRENGTH_MOD_GALE, MSG_NAME_WINDSTRENGTH_STRONG_GALE, + MSG_NAME_WINDSTRENGTH_STORM, MSG_NAME_WINDSTRENGTH_TORNADO_F13, + MSG_NAME_WINDSTRENGTH_TORNADO_F4 }; public static final int WI_SIZE = windNames.length; + private static final String MSG_INDICATOR_WINDSTRENGTH_LIGHT_CALM = Messages.getString("PlanetaryConditions.Indicator.WindStrength.Calm"); + private static final String MSG_INDICATOR_WINDSTRENGTH_LIGHT_GALE = Messages.getString("PlanetaryConditions.Indicator.WindStrength.LightGale"); + private static final String MSG_INDICATOR_WINDSTRENGTH_MOD_GALE = Messages.getString("PlanetaryConditions.Indicator.WindStrength.ModGale"); + private static final String MSG_INDICATOR_WINDSTRENGTH_STRONG_GALE = Messages.getString("PlanetaryConditions.Indicator.WindStrength.StrongGale"); + private static final String MSG_INDICATOR_WINDSTRENGTH_STORM = Messages.getString("PlanetaryConditions.Indicator.WindStrength.Storm"); + private static final String MSG_INDICATOR_WINDSTRENGTH_TORNADO_F13 = Messages.getString("PlanetaryConditions.Indicator.WindStrength.TornadoF13"); + private static final String MSG_INDICATOR_WINDSTRENGTH_TORNADO_F4 = Messages.getString("PlanetaryConditions.Indicator.WindStrength.TornadoF4"); + private static String[] windStrengthIndicators = { MSG_INDICATOR_WINDSTRENGTH_LIGHT_CALM, MSG_INDICATOR_WINDSTRENGTH_LIGHT_GALE, + MSG_INDICATOR_WINDSTRENGTH_MOD_GALE, MSG_INDICATOR_WINDSTRENGTH_STRONG_GALE, + MSG_INDICATOR_WINDSTRENGTH_STORM, MSG_INDICATOR_WINDSTRENGTH_TORNADO_F13, + MSG_INDICATOR_WINDSTRENGTH_TORNADO_F4 }; // wind direction - private static String[] dirNames = { "North", "Northeast", "Southeast", "South", "Southwest", "Northwest", "RandomWindDirection" }; + private static final String MSG_NAME_WINDDIRECTION_NORTH = Messages.getString("PlanetaryConditions.DisplayableName.WindDirection.North"); + private static final String MSG_NAME_WINDDIRECTION_NORTHEAST = Messages.getString("PlanetaryConditions.DisplayableName.WindDirection.Northeast"); + private static final String MSG_NAME_WINDDIRECTION_SOUTHEAST = Messages.getString("PlanetaryConditions.DisplayableName.WindDirection.Southeast"); + private static final String MSG_NAME_WINDDIRECTION_SOUTH = Messages.getString("PlanetaryConditions.DisplayableName.WindDirection.South"); + private static final String MSG_NAME_WINDDIRECTION_SOUTHWEST = Messages.getString("PlanetaryConditions.DisplayableName.WindDirection.Southwest"); + private static final String MSG_NAME_WINDDIRECTION_NORTHWEST = Messages.getString("PlanetaryConditions.DisplayableName.WindDirection.Northwest"); + private static final String MSG_NAME_WINDDIRECTION_RANDOM = Messages.getString("PlanetaryConditions.DisplayableName.WindDirection.RandomWindDirection"); + // no east and west, because the map uses 6 side hex tiles. east and west are skipped. + private static String[] dirNames = { MSG_NAME_WINDDIRECTION_NORTH, MSG_NAME_WINDDIRECTION_NORTHEAST, + MSG_NAME_WINDDIRECTION_SOUTHEAST, MSG_NAME_WINDDIRECTION_SOUTH, MSG_NAME_WINDDIRECTION_SOUTHWEST, + MSG_NAME_WINDDIRECTION_NORTHWEST, MSG_NAME_WINDDIRECTION_RANDOM }; public static final int DIR_SIZE = dirNames.length; public static final int DIR_RANDOM = 6; - + private static final String MSG_INDICATOR_WINDDIRECTION_NORTH = Messages.getString("PlanetaryConditions.Indicator.WindDirection.North"); + private static final String MSG_INDICATOR_WINDDIRECTION_NORTHEAST = Messages.getString("PlanetaryConditions.Indicator.WindDirection.Northeast"); + private static final String MSG_INDICATOR_WINDDIRECTION_SOUTHEAST = Messages.getString("PlanetaryConditions.Indicator.WindDirection.Southeast"); + private static final String MSG_INDICATOR_WINDDIRECTION_SOUTH = Messages.getString("PlanetaryConditions.Indicator.WindDirection.South"); + private static final String MSG_INDICATOR_WINDDIRECTION_SOUTHWEST = Messages.getString("PlanetaryConditions.Indicator.WindDirection.Southwest"); + private static final String MSG_INDICATOR_WINDDIRECTION_NORTHWEST = Messages.getString("PlanetaryConditions.Indicator.WindDirection.Northwest"); + private static final String MSG_INDICATOR_WINDDIRECTION_RANDOM = Messages.getString("PlanetaryConditions.Indicator.WindDirection.RandomWindDirection"); + // no east and west, because the map uses 6 side hex tiles. east and west are skipped. + private static String[] windDirectionIndicators = { MSG_INDICATOR_WINDDIRECTION_NORTH, MSG_INDICATOR_WINDDIRECTION_NORTHEAST, + MSG_INDICATOR_WINDDIRECTION_SOUTHEAST, MSG_INDICATOR_WINDDIRECTION_SOUTH, MSG_INDICATOR_WINDDIRECTION_SOUTHWEST, + MSG_INDICATOR_WINDDIRECTION_NORTHWEST, MSG_INDICATOR_WINDDIRECTION_RANDOM }; // atmospheric pressure public static final int ATMO_VACUUM = 0; @@ -85,20 +166,45 @@ public class PlanetaryConditions implements Serializable { public static final int ATMO_STANDARD = 3; public static final int ATMO_HIGH = 4; public static final int ATMO_VHIGH = 5; - - public static String[] atmoNames = { "Vacuum", "Trace", "Thin", "Standard", "High", "Very High" }; + private static final String MSG_NAME_ATMOSPHERE_VACUUM = Messages.getString("PlanetaryConditions.DisplayableName.Atmosphere.Vacuum"); + private static final String MSG_NAME_ATMOSPHERE_TRACE = Messages.getString("PlanetaryConditions.DisplayableName.Atmosphere.Trace"); + private static final String MSG_NAME_ATMOSPHERE_THIN = Messages.getString("PlanetaryConditions.DisplayableName.Atmosphere.Thin"); + private static final String MSG_NAME_ATMOSPHERE_STANDARD = Messages.getString("PlanetaryConditions.DisplayableName.Atmosphere.Standard"); + private static final String MSG_NAME_ATMOSPHERE_HIGH = Messages.getString("PlanetaryConditions.DisplayableName.Atmosphere.High"); + private static final String MSG_NAME_ATMOSPHERE_VHIGH = Messages.getString("PlanetaryConditions.DisplayableName.Atmosphere.Very High"); + public static String[] atmoNames = { MSG_NAME_ATMOSPHERE_VACUUM, MSG_NAME_ATMOSPHERE_TRACE, MSG_NAME_ATMOSPHERE_THIN, + MSG_NAME_ATMOSPHERE_STANDARD, MSG_NAME_ATMOSPHERE_HIGH, MSG_NAME_ATMOSPHERE_VHIGH }; public static final int ATMO_SIZE = atmoNames.length; + private static final String MSG_INDICATOR_ATMOSPHERE_VACUUM = Messages.getString("PlanetaryConditions.Indicator.Atmosphere.Vacuum"); + private static final String MSG_INDICATOR_ATMOSPHERE_TRACE = Messages.getString("PlanetaryConditions.Indicator.Atmosphere.Trace"); + private static final String MSG_INDICATOR_ATMOSPHERE_THIN = Messages.getString("PlanetaryConditions.Indicator.Atmosphere.Thin"); + private static final String MSG_INDICATOR_ATMOSPHERE_STANDARD = Messages.getString("PlanetaryConditions.Indicator.Atmosphere.Standard"); + private static final String MSG_INDICATOR_ATMOSPHERE_HIGH = Messages.getString("PlanetaryConditions.Indicator.Atmosphere.High"); + private static final String MSG_INDICATOR_ATMOSPHERE_VHIGH = Messages.getString("PlanetaryConditions.Indicator.Atmosphere.VHigh"); + private static String[] atmosphereIndicators = { MSG_INDICATOR_ATMOSPHERE_VACUUM, MSG_INDICATOR_ATMOSPHERE_TRACE, MSG_INDICATOR_ATMOSPHERE_THIN, + MSG_INDICATOR_ATMOSPHERE_STANDARD ,MSG_INDICATOR_ATMOSPHERE_HIGH ,MSG_INDICATOR_ATMOSPHERE_VHIGH }; // fog public static final int FOG_NONE = 0; public static final int FOG_LIGHT = 1; public static final int FOG_HEAVY = 2; - - private static String[] fogNames = { "None", "Light Fog", "Heavy Fog" }; + private static final String MSG_NAME_FOG_NONE = Messages.getString("PlanetaryConditions.DisplayableName.Fog.None"); + private static final String MSG_NAME_FOG_LIGHT = Messages.getString("PlanetaryConditions.DisplayableName.Fog.Light Fog"); + private static final String MSG_NAME_FOG_HEAVY = Messages.getString("PlanetaryConditions.DisplayableName.Fog.Heavy Fog"); + private static String[] fogNames = { MSG_NAME_FOG_NONE, MSG_NAME_FOG_LIGHT, MSG_NAME_FOG_HEAVY }; public static final int FOG_SIZE = fogNames.length; + private static final String MSG_INDICATOR_FOG_NONE = Messages.getString("PlanetaryConditions.Indicator.Fog.None"); + private static final String MSG_INDICATOR_FOG_LIGHT = Messages.getString("PlanetaryConditions.Indicator.Fog.Light"); + private static final String MSG_INDICATOR_FOG_HEAVY = Messages.getString("PlanetaryConditions.Indicator.Fog.Heavy"); + private static String[] fogIndicators = { MSG_INDICATOR_FOG_NONE, MSG_INDICATOR_FOG_LIGHT, MSG_INDICATOR_FOG_HEAVY }; // misc private boolean blowingSand = false; + private static final String MSG_NAME_BLOWINGSAND_TRUE = Messages.getString("PlanetaryConditions.DisplayableName.SandBlowing.true"); + private static final String MSG_NAME_BLOWINGSAND_FALSE = Messages.getString("PlanetaryConditions.DisplayableName.SandBlowing.false"); + private static final String MSG_INDICATOR_BLOWINGSAND_TRUE = Messages.getString("PlanetaryConditions.Indicator.SandBlowing.true"); + private static final String MSG_INDICATOR_BLOWINGSAND_FALSE = Messages.getString("PlanetaryConditions.Indicator.SandBlowing.false"); + private boolean sandStorm = false; private boolean runOnce = false; @@ -115,8 +221,20 @@ public class PlanetaryConditions implements Serializable { private int fog = FOG_NONE; private int temperature = 25; private int oldTemperature = 25; + private static final String MSG_NAME_TEMPERATURE_COLD = Messages.getString("PlanetaryConditions.DisplayableName.Temperature.ExtremeCold"); + private static final String MSG_NAME_TEMPERATURE_HEAT = Messages.getString("PlanetaryConditions.DisplayableName.Temperature.ExtremeHeat"); + private static final String MSG_INDICATOR_TEMPERATURE_COLD = Messages.getString("PlanetaryConditions.Indicator.Temperature.ExtremeCold"); + private static final String MSG_INDICATOR_TEMPERATURE_HEAT= Messages.getString("PlanetaryConditions.Indicator.Temperature.ExtremeHeat"); + private static final String MSG_INDICATOR_TEMPERATURE_NORMAL = Messages.getString("PlanetaryConditions.Indicator.Temperature.Normal"); private float gravity = (float) 1.0; + private static final String MSG_INDICATOR_GRAVITY_LOW= Messages.getString("PlanetaryConditions.Indicator.Gravity.Low"); + private static final String MSG_INDICATOR_GRAVITY_NORMAL = Messages.getString("PlanetaryConditions.Indicator.Gravity.Normal"); + private static final String MSG_INDICATOR_GRAVITY_HIGH = Messages.getString("PlanetaryConditions.Indicator.Gravity.High"); private boolean emi = false; + private static final String MSG_NAME_EMI_TRUE = Messages.getString("PlanetaryConditions.DisplayableName.EMI.true"); + private static final String MSG_NAME_EMI_FALSE = Messages.getString("PlanetaryConditions.DisplayableName.EMI.false"); + private static final String MSG_INDICATOR_EMI_TRUE = Messages.getString("PlanetaryConditions.Indicator.EMI.true"); + private static final String MSG_INDICATOR_EMI_FALSE = Messages.getString("PlanetaryConditions.Indicator.EMI.false"); private boolean terrainAffected = true; private int maxWindStrength = PlanetaryConditions.WI_TORNADO_F4; private int minWindStrength = PlanetaryConditions.WI_NONE; @@ -156,23 +274,23 @@ public Object clone() { public static String getLightDisplayableName(int type) { if ((type >= 0) && (type < L_SIZE)) { - return Messages.getString("PlanetaryConditions." + lightNames[type]); + return lightNames[type]; } throw new IllegalArgumentException("Unknown light condition"); } public static String getWeatherDisplayableName(int type) { if ((type >= 0) && (type < WE_SIZE)) { - return Messages.getString("PlanetaryConditions." + weatherNames[type]); + return weatherNames[type]; } throw new IllegalArgumentException("Unknown weather condition"); } public static String getTemperatureDisplayableName(int temp) { if (isExtremeTemperature(temp) && (temp > 0)) { - return String.format("%d (%s)", temp, Messages.getString("PlanetaryConditions.ExtremeHeat")); + return String.format("%d (%s)", temp, MSG_NAME_TEMPERATURE_HEAT); } else if (isExtremeTemperature(temp) && (temp <= 0)) { - return String.format("%d (%s)", temp, Messages.getString("PlanetaryConditions.ExtremeCold")); + return String.format("%d (%s)", temp, MSG_NAME_TEMPERATURE_COLD); } else { return String.valueOf(temp); } @@ -180,28 +298,28 @@ public static String getTemperatureDisplayableName(int temp) { public static String getWindDirDisplayableName(int type) { if ((type >= 0) && (type < DIR_SIZE)) { - return Messages.getString("PlanetaryConditions." + dirNames[type]); + return dirNames[type]; } throw new IllegalArgumentException("Unknown wind direction"); } public static String getWindDisplayableName(int type) { if ((type >= 0) && (type < WI_SIZE)) { - return Messages.getString("PlanetaryConditions." + windNames[type]); + return windNames[type]; } throw new IllegalArgumentException("Unknown wind condition"); } public static String getAtmosphereDisplayableName(int type) { if ((type >= 0) && (type < ATMO_SIZE)) { - return Messages.getString("PlanetaryConditions." + atmoNames[type]); + return atmoNames[type]; } throw new IllegalArgumentException("Unknown atmospheric pressure condition"); } public static String getFogDisplayableName(int type) { if ((type >= 0) && (type < FOG_SIZE)) { - return Messages.getString("PlanetaryConditions." + fogNames[type]); + return fogNames[type]; } throw new IllegalArgumentException("Unknown fog condition"); } @@ -1046,4 +1164,117 @@ private void doSandStormCheck() { public void setRunOnce(boolean run) { runOnce = run; } + + public boolean isExtremeTemperatureHeat() { + return (isExtremeTemperature() && (temperature > 0)); + } + + public boolean isExtremeTemperatureCold() { + return (isExtremeTemperature() && (temperature < 0)); + } + + public String getLightIndicator(int type) { + if ((type >= 0) && (type < L_SIZE)) { + return lightIndicators[type]; + } + throw new IllegalArgumentException("Unknown light Indicator"); + } + + public String getLightIndicator() { + return getLightIndicator(lightConditions); + } + + public String getFogIndicator(int type) { + if ((type >= 0) && (type < FOG_SIZE)) { + return fogIndicators[type]; + } + throw new IllegalArgumentException("Unknown Fog Indicator"); + } + + public String getFogIndicator() { + return getFogIndicator(fog); + } + + public String getWindStrengthIndicator(int type) { + if ((type >= 0) && (type < WI_SIZE)) { + return windStrengthIndicators[type]; + } + throw new IllegalArgumentException("Unknown Wind Strength Indicator"); + } + + public String getWindStrengthIndicator() { + return getWindStrengthIndicator(windStrength); + } + + public String getWindDirectionIndicator(int type) { + if ((type >= 0) && (type < DIR_SIZE)) { + return windDirectionIndicators[type]; + } + throw new IllegalArgumentException("Unknown Wind Direction Indicator"); + } + + public String getWindDirectionIndicator() { + return getWindDirectionIndicator(windDirection); + } + + public String getWeatherIndicator(int type) { + if ((type >= 0) && (type < WE_SIZE)) { + return weatherIndicators[type]; + } + throw new IllegalArgumentException("Unknown Weather Indicator"); + } + + public String getWeatherIndicator() { + return getWeatherIndicator(weatherConditions); + } + + public String getAtmosphereIndicator(int type) { + if ((type >= 0) && (type < ATMO_SIZE)) { + return atmosphereIndicators[type]; + } + throw new IllegalArgumentException("Unknown Atmosphere Indicator"); + } + + public String getAtmosphereIndicator() { + return getAtmosphereIndicator(atmosphere); + } + + public String getGravityIndicator() { + if (gravity > 1.0) { + return MSG_INDICATOR_GRAVITY_HIGH; + } + else if ((gravity < 1.0)) { + return MSG_INDICATOR_GRAVITY_LOW; + } + + return MSG_INDICATOR_GRAVITY_NORMAL; + } + + public String getTemperatureIndicator() { + if (isExtremeTemperatureHeat()) { + return MSG_INDICATOR_TEMPERATURE_HEAT; + } + else if (isExtremeTemperatureCold()) { + return MSG_INDICATOR_TEMPERATURE_COLD; + } + + return MSG_INDICATOR_TEMPERATURE_NORMAL; + } + + public String getEMIIndicator() { + return hasEMI() ? MSG_INDICATOR_EMI_TRUE : MSG_INDICATOR_EMI_FALSE; + } + + public String getSandBlowingIndicator() { + return hasEMI() ? MSG_INDICATOR_BLOWINGSAND_TRUE : MSG_INDICATOR_BLOWINGSAND_FALSE; + } + + public String getEMIDisplayableValue() { + return hasEMI() ? MSG_NAME_EMI_TRUE : MSG_NAME_EMI_FALSE; + } + + public String getSandBlowingDisplayableValue() { + return isSandBlowing() ? MSG_NAME_BLOWINGSAND_TRUE : MSG_NAME_BLOWINGSAND_FALSE; + } + } diff --git a/megamek/src/megamek/common/Player.java b/megamek/src/megamek/common/Player.java index d19e530fb46..dc2623e863d 100644 --- a/megamek/src/megamek/common/Player.java +++ b/megamek/src/megamek/common/Player.java @@ -14,7 +14,6 @@ package megamek.common; import megamek.client.ui.swing.util.PlayerColour; -import megamek.common.enums.GamePhase; import megamek.common.event.GamePlayerChangeEvent; import megamek.common.icons.Camouflage; import megamek.common.options.OptionsConstants; @@ -272,7 +271,7 @@ public void setGameMaster(boolean gameMaster) { /** @return true if {@link #observer} flag is true and not in VICTORY phase*/ public boolean isObserver() { - if ((game != null) && (game.getPhase() == GamePhase.VICTORY)) { + if ((game != null) && game.getPhase().isVictory()) { return false; } return observer; diff --git a/megamek/src/megamek/common/ReportMessages.java b/megamek/src/megamek/common/ReportMessages.java index f7b05579630..b0f82998381 100755 --- a/megamek/src/megamek/common/ReportMessages.java +++ b/megamek/src/megamek/common/ReportMessages.java @@ -14,7 +14,6 @@ package megamek.common; import megamek.MegaMek; -import megamek.common.util.EncodeControl; import java.text.MessageFormat; import java.util.MissingResourceException; @@ -22,7 +21,7 @@ public class ReportMessages { private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle.getBundle("megamek.common.report-messages", - MegaMek.getMMOptions().getLocale(), new EncodeControl()); + MegaMek.getMMOptions().getLocale()); private ReportMessages() { } diff --git a/megamek/src/megamek/common/SmallCraft.java b/megamek/src/megamek/common/SmallCraft.java index f022ec4bdb5..f2aa4b5d641 100644 --- a/megamek/src/megamek/common/SmallCraft.java +++ b/megamek/src/megamek/common/SmallCraft.java @@ -904,4 +904,9 @@ protected int calculateWalk() { public boolean isLargeAerospace() { return true; } + + @Override + public int getLandingLength() { + return 8; + } } \ No newline at end of file diff --git a/megamek/src/megamek/common/Tank.java b/megamek/src/megamek/common/Tank.java index 174851a5bad..4cf67bd1a60 100644 --- a/megamek/src/megamek/common/Tank.java +++ b/megamek/src/megamek/common/Tank.java @@ -319,7 +319,7 @@ public int getWalkMP(boolean gravity, boolean ignoreheat, @Override public boolean isEligibleForPavementBonus() { - return movementMode == EntityMovementMode.TRACKED || movementMode == EntityMovementMode.WHEELED; + return movementMode == EntityMovementMode.TRACKED || movementMode == EntityMovementMode.WHEELED || movementMode == EntityMovementMode.HOVER; } public boolean isTurretLocked(int turret) { @@ -3040,4 +3040,9 @@ public boolean isTractor() { public boolean isCombatVehicle() { return !isSupportVehicle(); } + + @Override + public boolean getsAutoExternalSearchlight() { + return true; + } } diff --git a/megamek/src/megamek/common/Terrain.java b/megamek/src/megamek/common/Terrain.java index e5067f0ee77..dd278d848b9 100644 --- a/megamek/src/megamek/common/Terrain.java +++ b/megamek/src/megamek/common/Terrain.java @@ -440,8 +440,10 @@ public int movementCost(Entity e) { } return 1; } - if ((moveMode == EntityMovementMode.WHEELED) || (moveMode == EntityMovementMode.INF_JUMP) - || (moveMode == EntityMovementMode.INF_LEG) || (moveMode == EntityMovementMode.INF_MOTORIZED)) { + if ((moveMode == EntityMovementMode.WHEELED) || (e.isConventionalInfantry() && + ((moveMode == EntityMovementMode.INF_JUMP) + || (moveMode == EntityMovementMode.INF_LEG) + || (moveMode == EntityMovementMode.INF_MOTORIZED)))) { return 1; } return 0; diff --git a/megamek/src/megamek/common/WeaponType.java b/megamek/src/megamek/common/WeaponType.java index c16a2588bbe..b20192fd5f8 100644 --- a/megamek/src/megamek/common/WeaponType.java +++ b/megamek/src/megamek/common/WeaponType.java @@ -1249,6 +1249,14 @@ public static void initializeTypes() { EquipmentType.addType(new ISThunderBolt10()); EquipmentType.addType(new ISThunderBolt15()); EquipmentType.addType(new ISThunderBolt20()); + EquipmentType.addType(new ISThunderbolt5OS()); + EquipmentType.addType(new ISThunderbolt10OS()); + EquipmentType.addType(new ISThunderbolt15OS()); + EquipmentType.addType(new ISThunderbolt20OS()); + EquipmentType.addType(new ISThunderbolt5IOS()); + EquipmentType.addType(new ISThunderbolt10IOS()); + EquipmentType.addType(new ISThunderbolt15IOS()); + EquipmentType.addType(new ISThunderbolt20IOS()); // Taser EquipmentType.addType(new ISMekTaser()); diff --git a/megamek/src/megamek/common/actions/WeaponAttackAction.java b/megamek/src/megamek/common/actions/WeaponAttackAction.java index b3d4d2ee6ae..f55d4df1014 100644 --- a/megamek/src/megamek/common/actions/WeaponAttackAction.java +++ b/megamek/src/megamek/common/actions/WeaponAttackAction.java @@ -18,7 +18,6 @@ import megamek.client.ui.Messages; import megamek.common.*; import megamek.common.enums.AimingMode; -import megamek.common.enums.GamePhase; import megamek.common.options.OptionsConstants; import megamek.common.weapons.InfantryAttack; import megamek.common.weapons.Weapon; @@ -352,17 +351,15 @@ private static ToHitData toHit(Game game, int attackerId, Targetable target, int boolean isArtilleryDirect = (wtype.hasFlag(WeaponType.F_ARTILLERY) || (wtype instanceof CapitalMissileWeapon && Compute.isGroundToGround(ae, target))) - && (game.getPhase() == GamePhase.FIRING); + && game.getPhase().isFiring(); boolean isArtilleryIndirect = (wtype.hasFlag(WeaponType.F_ARTILLERY) || (wtype instanceof CapitalMissileWeapon && Compute.isGroundToGround(ae, target))) - && ((game.getPhase() == GamePhase.TARGETING) - || (game.getPhase() == GamePhase.OFFBOARD)); + && (game.getPhase().isTargeting() || game.getPhase().isOffboard()); boolean isBearingsOnlyMissile = (weapon.isInBearingsOnlyMode()) - && ((game.getPhase() == GamePhase.TARGETING) - || (game.getPhase() == GamePhase.FIRING)); + && (game.getPhase().isTargeting() || game.getPhase().isFiring()); boolean isCruiseMissile = (weapon.getType().hasFlag(WeaponType.F_CRUISE_MISSILE) || (wtype instanceof CapitalMissileWeapon @@ -1288,15 +1285,15 @@ private static String toHitIsImpossible(Game game, Entity ae, int attackerId, Ta // Phase Reasons // Only bearings-only capital missiles and indirect fire artillery can be fired in the targeting phase - if ((game.getPhase() == GamePhase.TARGETING) && (!(isArtilleryIndirect || isBearingsOnlyMissile))) { + if (game.getPhase().isTargeting() && (!(isArtilleryIndirect || isBearingsOnlyMissile))) { return Messages.getString("WeaponAttackAction.NotValidForTargPhase"); } // Only TAG can be fired in the offboard phase - if ((game.getPhase() == GamePhase.OFFBOARD) && !isTAG) { + if (game.getPhase().isOffboard() && !isTAG) { return Messages.getString("WeaponAttackAction.OnlyTagInOffboard"); } // TAG can't be fired in any phase but offboard - if ((game.getPhase() != GamePhase.OFFBOARD) && isTAG) { + if (!game.getPhase().isOffboard() && isTAG) { return Messages.getString("WeaponAttackAction.TagOnlyInOffboard"); } @@ -2087,7 +2084,7 @@ private static String toHitIsImpossible(Game game, Entity ae, int attackerId, Ta return Messages.getString("WeaponAttackAction.OutOfRange"); } // Can't fire in bearings-only mode within direct-fire range (50 hexes) - if (game.getPhase() == GamePhase.TARGETING && distance < RangeType.RANGE_BEARINGS_ONLY_MINIMUM) { + if (game.getPhase().isTargeting() && distance < RangeType.RANGE_BEARINGS_ONLY_MINIMUM) { return Messages.getString("WeaponAttackAction.BoMissileMinRange"); } // Can't target anything but hexes @@ -2566,7 +2563,7 @@ private static String toHitIsAutomatic(Game game, Entity ae, Targetable target, // Capital Missiles in bearings-only mode target hexes and always hit them if (isBearingsOnlyMissile) { - if (game.getPhase() == GamePhase.TARGETING && distance >= RangeType.RANGE_BEARINGS_ONLY_MINIMUM) { + if (game.getPhase().isTargeting() && (distance >= RangeType.RANGE_BEARINGS_ONLY_MINIMUM)) { return Messages.getString("WeaponAttackAction.BoMissileHex"); } } @@ -4615,7 +4612,7 @@ private static ToHitData handleSpecialWeaponAttacks(Game game, Entity ae, Target // Battle Armor bomb racks (Micro bombs) use gunnery skill and no other mods per TWp228 2018 errata if ((atype != null) && (atype.getAmmoType() == AmmoType.T_BA_MICRO_BOMB)) { if (ae.getPosition().equals(target.getPosition())) { - toHit = new ToHitData(ae.getCrew().getPiloting(), Messages.getString("WeaponAttackAction.GunSkill")); + toHit = new ToHitData(ae.getCrew().getGunnery(), Messages.getString("WeaponAttackAction.GunSkill")); } else { toHit = new ToHitData(TargetRoll.IMPOSSIBLE, Messages.getString("WeaponAttackAction.OutOfRange")); } diff --git a/megamek/src/megamek/common/alphaStrike/AlphaStrikeHelper.java b/megamek/src/megamek/common/alphaStrike/AlphaStrikeHelper.java index 0ae011b1ebc..35f4c10abb5 100644 --- a/megamek/src/megamek/common/alphaStrike/AlphaStrikeHelper.java +++ b/megamek/src/megamek/common/alphaStrike/AlphaStrikeHelper.java @@ -140,7 +140,7 @@ public static boolean hideSpecial(BattleForceSUA sua, ASCardDisplayable element) || (element.isLargeAerospace() && (sua == STD)) || (element.usesCapitalWeapons() && sua.isAnyOf(MSL, SCAP, CAP)) || (element.isType(BM, PM) && (sua == SOA)) - || (element.isType(CV, BM) && (sua == SRCH)) + || (element.isBattleMek() && (sua == SRCH)) || (!element.isLargeAerospace() && sua.isDoor()) || (hasAutoSeal(element) && (sua == SEAL)); } diff --git a/megamek/src/megamek/common/alphaStrike/cardDrawer/ASCard.java b/megamek/src/megamek/common/alphaStrike/cardDrawer/ASCard.java index 345b5a93b47..281ed983d89 100644 --- a/megamek/src/megamek/common/alphaStrike/cardDrawer/ASCard.java +++ b/megamek/src/megamek/common/alphaStrike/cardDrawer/ASCard.java @@ -18,11 +18,14 @@ */ package megamek.common.alphaStrike.cardDrawer; +import megamek.MMConstants; import megamek.client.ui.swing.GUIPreferences; import megamek.client.ui.swing.util.FluffImageHelper; import megamek.client.ui.swing.util.StringDrawer; import megamek.common.Configuration; -import megamek.common.alphaStrike.*; +import megamek.common.alphaStrike.ASCardDisplayable; +import megamek.common.alphaStrike.ASDamageVector; +import megamek.common.alphaStrike.AlphaStrikeHelper; import megamek.common.annotations.Nullable; import megamek.common.util.ImageUtil; import megamek.common.util.fileUtils.MegaMekFile; @@ -67,9 +70,9 @@ public class ASCard { protected final ASCardDisplayable element; protected final Image fluffImage; - protected Font lightFont = new Font(Font.SANS_SERIF, Font.PLAIN, 14); - protected Font boldFont = new Font(Font.SANS_SERIF, Font.BOLD, 14); - protected Font blackFont = new Font(Font.SANS_SERIF, Font.BOLD, 14); + protected Font lightFont = new Font(MMConstants.FONT_SANS_SERIF, Font.PLAIN, 14); + protected Font boldFont = new Font(MMConstants.FONT_SANS_SERIF, Font.BOLD, 14); + protected Font blackFont = new Font(MMConstants.FONT_SANS_SERIF, Font.BOLD, 14); protected Font modelFont; protected Font chassisFont; @@ -515,7 +518,7 @@ protected void paintCardBackground(Graphics2D g, boolean isFlipSide) { } new StringDrawer("(C) " + LocalDate.now().getYear() + " The Topps Company. All rights reserved.").at(1014, copyrightY).rotate(-Math.PI / 2) - .font(new Font(Font.SANS_SERIF, Font.PLAIN, 12)).center().draw(g); + .font(new Font(MMConstants.FONT_SANS_SERIF, Font.PLAIN, 12)).center().draw(g); // Border g.setColor(Color.BLACK); diff --git a/megamek/src/megamek/common/alphaStrike/conversion/ASBattleArmorDamageConverter.java b/megamek/src/megamek/common/alphaStrike/conversion/ASBattleArmorDamageConverter.java index 2f989754f0b..9f44379eeeb 100644 --- a/megamek/src/megamek/common/alphaStrike/conversion/ASBattleArmorDamageConverter.java +++ b/megamek/src/megamek/common/alphaStrike/conversion/ASBattleArmorDamageConverter.java @@ -98,8 +98,8 @@ protected double[] assembleSpecialDamage(BattleForceSUA dmgType, int location) { } @Override - protected int[] assembleHeatDamage() { - int[] heatDmg = super.assembleHeatDamage(); + protected int[] assembleHeatDamage(int location) { + int[] heatDmg = super.assembleHeatDamage(location); String rawValues = formatAsVector(heatDmg[0], heatDmg[1], heatDmg[2], 0, HT); heatDmg[0] *= troopFactor; heatDmg[1] *= troopFactor; diff --git a/megamek/src/megamek/common/alphaStrike/conversion/ASConvInfantryDamageConverter.java b/megamek/src/megamek/common/alphaStrike/conversion/ASConvInfantryDamageConverter.java index a2f95599228..4c21dda66a0 100644 --- a/megamek/src/megamek/common/alphaStrike/conversion/ASConvInfantryDamageConverter.java +++ b/megamek/src/megamek/common/alphaStrike/conversion/ASConvInfantryDamageConverter.java @@ -42,27 +42,35 @@ protected ASConvInfantryDamageConverter(Entity entity, AlphaStrikeElement elemen @Override protected void processDamage() { - report.addEmptyLine(); - report.addLine("--- Damage:", ""); - int baseRange = 0; - if ((infantry.getSecondaryWeapon() != null) && (infantry.getSecondaryWeaponsPerSquad() >= 2)) { - baseRange = infantry.getSecondaryWeapon().getInfantryRange(); - } else if (infantry.getPrimaryWeapon() != null) { - baseRange = infantry.getPrimaryWeapon().getInfantryRange(); - } - int range = baseRange * 3; - finalSDamage = ASDamage.createDualRoundedUp(getConvInfantryStandardDamage()); - String maxRangeText = "Range: S"; - if (range > 3) { - finalMDamage = finalSDamage; - maxRangeText = "Ranges: S, M"; - } - if (range > 15) { - finalLDamage = finalSDamage; - maxRangeText = "Ranges: S, M, L"; + if (infantry.hasFieldWeapon()) { + processSDamage(); + processMDamage(); + processLDamage(); + processFrontSpecialDamage(AC); + processFrontSpecialDamage(FLK); + } else { + int baseRange = 0; + if ((infantry.getSecondaryWeapon() != null) && (infantry.getSecondaryWeaponsPerSquad() >= 2)) { + baseRange = infantry.getSecondaryWeapon().getInfantryRange(); + } else if (infantry.getPrimaryWeapon() != null) { + baseRange = infantry.getPrimaryWeapon().getInfantryRange(); + } + int range = baseRange * 3; + String maxRangeText; + finalSDamage = ASDamage.createDualRoundedUp(getConvInfantryStandardDamage()); + if (range > 15) { + finalLDamage = finalSDamage; + finalMDamage = finalSDamage; + maxRangeText = "Ranges: S, M, L"; + } else if (range > 3) { + finalMDamage = finalSDamage; + maxRangeText = "Ranges: S, M"; + } else { + maxRangeText = "Range: S"; + } + report.addLine("Final Damage", "", finalSDamage + ""); + report.addLine("Range:", range + " hexes", maxRangeText); } - report.addLine("Final Damage", "", finalSDamage + ""); - report.addLine("Range:", range + " hexes", maxRangeText); processHT(); } diff --git a/megamek/src/megamek/common/alphaStrike/conversion/ASDamageConverter.java b/megamek/src/megamek/common/alphaStrike/conversion/ASDamageConverter.java index da01ec8c12d..0343d744cc4 100644 --- a/megamek/src/megamek/common/alphaStrike/conversion/ASDamageConverter.java +++ b/megamek/src/megamek/common/alphaStrike/conversion/ASDamageConverter.java @@ -54,7 +54,7 @@ public class ASDamageConverter { protected int rearLocation; protected int turretLocation; - private final Map ammoForWeapon = new HashMap<>(); + private final Map ammoModifier = new HashMap<>(); protected final boolean hasTargetingComputer; protected List weaponsList; protected double rawSDamage; @@ -163,6 +163,7 @@ protected void processTurrets() { processSpecialDamage(IATM, turretLocation); processSpecialDamage(TOR, turretLocation); processSpecialDamage(REL, turretLocation); + processHT(turretLocation); } } @@ -357,7 +358,7 @@ protected void processEDamage() { } protected double getDamageMultiplier(Mounted weapon, WeaponType weaponType) { // Low ammo count - double damageModifier = ammoForWeapon.getOrDefault(weaponType, true) ? 1 : 0.75; + double damageModifier = ammoModifier.getOrDefault(weaponType, 1d); // Oneshot or Fusillade if (weaponType.hasFlag(WeaponType.F_ONESHOT) && !(weaponType instanceof CLFussilade)) { @@ -408,7 +409,14 @@ protected void assembleAmmoCounts() { || weaponType.getAmmoType() == AmmoType.T_AC_ULTRA_THB) { divisor = 2; } - ammoForWeapon.put(weaponType, ammoCount / weaponCount.get(weaponType) >= 10 * divisor); + + if (ammoCount / weaponCount.get(weaponType) >= 10 * divisor) { + ammoModifier.put(weaponType, 1d); + } else if (ammoCount > 0) { + ammoModifier.put(weaponType, 0.75); + } else { + ammoModifier.put(weaponType, 0d); + } } } @@ -529,24 +537,29 @@ protected void reportAssignToLocations(Mounted weapon, BattleForceSUA sua, Strin /** Determines if the element has the HT ability and what the value is. Overridden for CI. */ protected void processHT() { + processHT(0); + } + + /** Determines if the element has the HT ability and what the value is. Overridden for CI. */ + protected void processHT(int location) { report.startTentativeSection(); report.addEmptyLine(); report.addLine("--- Heat Damage (HT):", ""); - int[] heatDamageValues = assembleHeatDamage(); + int[] heatDamageValues = assembleHeatDamage(location); if (heatDamageValues[0] + heatDamageValues[1] + heatDamageValues[2] > 0) { - determineFinalHT(heatDamageValues); + determineFinalHT(heatDamageValues, location); report.endTentativeSection(); } else { report.discardTentativeSection(); } } - protected int[] assembleHeatDamage() { + protected int[] assembleHeatDamage(int location) { int totalHeatS = 0; int totalHeatM = 0; int totalHeatL = 0; for (Mounted weapon : weaponsList) { - double locationMultiplier = ASLocationMapper.damageLocationMultiplier(entity, 0, weapon); + double locationMultiplier = ASLocationMapper.damageLocationMultiplier(entity, location, weapon); WeaponType weaponType = (WeaponType) weapon.getType(); int heatS = weaponType.getAlphaStrikeHeatDamage(RANGE_BAND_SHORT); int heatM = weaponType.getAlphaStrikeHeatDamage(RANGE_BAND_MEDIUM); @@ -564,13 +577,13 @@ protected int[] assembleHeatDamage() { return new int[] {totalHeatS, totalHeatM, totalHeatL}; } - protected void determineFinalHT(int[] heatDamageValues) { + protected void determineFinalHT(int[] heatDamageValues, int location) { int htS = resultingHTValue(heatDamageValues[0]); int htM = resultingHTValue(heatDamageValues[1]); int htL = resultingHTValue(heatDamageValues[2]); if (htS + htM + htL > 0) { ASDamageVector finalHtValue = ASDamageVector.createNormRndDmg(htS, htM, htL); - locations[0].setSUA(HT, finalHtValue); + locations[location].setSUA(HT, finalHtValue); report.addLine("Final Ability", "", "HT" + finalHtValue); } else { report.addLine("Final Ability", "No HT", ""); @@ -719,9 +732,11 @@ protected double determineSpecialsDamage(WeaponType weaponType, Mounted linked, * Only used for the damage specials LRM, SRM, TOR, IATM, AC, FLK */ protected static boolean qualifiesForSpecial(double[] damage, BattleForceSUA dmgType) { - if (dmgType.isAnyOf(FLK, TOR, IF, REAR, TUR, MSL, CAP, SCAP, STD, PNT) + if (dmgType.isAnyOf(FLK, TOR, REAR, TUR, MSL, CAP, SCAP, STD, PNT) && damage[0] + damage[1] + damage[2] + damage[3] > 0) { return true; + } else if (dmgType == IF) { + return damage[2] > 0; } else { return roundUpToTenth(damage[1]) >= 1; } diff --git a/megamek/src/megamek/common/alphaStrike/conversion/ASLocationMapper.java b/megamek/src/megamek/common/alphaStrike/conversion/ASLocationMapper.java index 92ad9dd2dc4..7847fb6039f 100644 --- a/megamek/src/megamek/common/alphaStrike/conversion/ASLocationMapper.java +++ b/megamek/src/megamek/common/alphaStrike/conversion/ASLocationMapper.java @@ -57,9 +57,6 @@ static int damageLocationsCount(Entity en) { public static double damageLocationMultiplier(Entity en, int loc, Mounted mount) { if (locationName(en, loc).startsWith("TUR") && (en instanceof Mech) && mount.isMechTurretMounted()) { return 1; - } else if (locationName(en, loc).startsWith("TUR") && (en instanceof Tank) - && (mount.isPintleTurretMounted() || mount.isSponsonTurretMounted())) { - return 1; } else if (en instanceof Warship) { return getWarShipLocationMultiplier(loc, mount.getLocation()); } else if (en instanceof Jumpship) { @@ -81,7 +78,8 @@ public static double damageLocationMultiplier(Entity en, int loc, Mounted mount) // Don't count squad support weapons, these are handled separately return ((mount.getLocation() <= 1) && !mount.isSquadSupportWeapon()) ? 1 : 0; } else if (en instanceof Infantry) { - return (loc == mount.getLocation()) ? 1 : 0; + // CI only ever have loc == 0 (no TUR, REAR, arcs); do not count standard weapons when it has field guns + return (!((Infantry) en).hasFieldWeapon() || (mount.getLocation() == Infantry.LOC_FIELD_GUNS)) ? 1 : 0; } else if (en instanceof TripodMech) { return getTripodMekLocationMultiplier(loc, mount.getLocation(), mount.isRearMounted()); } else if (en instanceof QuadVee) { @@ -164,11 +162,9 @@ private static double getJumpShipLocationMultiplier(Jumpship en, int index, int case 0: if (location == Jumpship.LOC_NOSE) { return 1; - } else if (en.isSpheroid() && (location == Jumpship.LOC_FLS || location == Jumpship.LOC_FRS) - && !rearMounted) { - return 0.5; + } else { + return (location == Jumpship.LOC_FLS || location == Jumpship.LOC_FRS) ? 0.5 : 0; } - break; case 1: return (location == Jumpship.LOC_FLS || location == Jumpship.LOC_ALS) ? 0.5 : 0; case 2: diff --git a/megamek/src/megamek/common/alphaStrike/conversion/ASMovementConverter.java b/megamek/src/megamek/common/alphaStrike/conversion/ASMovementConverter.java index e5c7d22c63d..846bc8d6dc0 100644 --- a/megamek/src/megamek/common/alphaStrike/conversion/ASMovementConverter.java +++ b/megamek/src/megamek/common/alphaStrike/conversion/ASMovementConverter.java @@ -142,14 +142,12 @@ private static Map convertMovementForInfantry(ASConverter.Conve jumpingMP = ((BattleArmor)entity).getJumpMP(true, true, true); } - // ensure a minimum base movement of 2" - walkingMP = Math.max(walkingMP, 1); report.addLine("Walking MP:", Integer.toString(walkingMP)); report.addLine("Jumping MP:", Integer.toString(jumpingMP)); String movementCode = getMovementCode(conversionData); element.setPrimaryMovementMode(movementCode); - if (walkingMP > jumpingMP) { + if ((walkingMP > jumpingMP) || (jumpingMP == 0)) { result.put(movementCode, walkingMP * 2); report.addLine("Walking MP > Jumping MP", walkingMP + " x 2", walkingMP * 2 + "\"" + movementCode); } else { diff --git a/megamek/src/megamek/common/alphaStrike/conversion/ASPointValueConverter.java b/megamek/src/megamek/common/alphaStrike/conversion/ASPointValueConverter.java index a294016c4b0..abc0150e92a 100644 --- a/megamek/src/megamek/common/alphaStrike/conversion/ASPointValueConverter.java +++ b/megamek/src/megamek/common/alphaStrike/conversion/ASPointValueConverter.java @@ -466,7 +466,7 @@ private double brawlerMalus() { private double agileBonus() { double result = 0; double modifiedTMM = element.getTMM() + 0.5 * element.getJMPS() + 0.5 * element.getSUBS(); - if (modifiedTMM >= 2) { + if (modifiedTMM > 1) { double dmgS = element.getStandardDamage().S.minimal ? 0.5 : element.getStandardDamage().S.damage; double dmgM = element.getStandardDamage().M.minimal ? 0.5 : element.getStandardDamage().M.damage; if (dmgM > 0) { @@ -534,7 +534,11 @@ protected void processForceBonus() { } if (element.hasSUA(MHQ)) { int mhqValue = (int) element.getSUA(MHQ); - bonus += mhqValue; + if (mhqValue <= 4) { + bonus += mhqValue; + } else { + bonus += 4 + Math.ceil(0.2 * mhqValue); + } modifierList.add("MHQ"); } if (!modifierList.isEmpty()) { diff --git a/megamek/src/megamek/common/alphaStrike/conversion/ASSpecialAbilityConverter.java b/megamek/src/megamek/common/alphaStrike/conversion/ASSpecialAbilityConverter.java index 69518c57316..fcf2bba96f1 100644 --- a/megamek/src/megamek/common/alphaStrike/conversion/ASSpecialAbilityConverter.java +++ b/megamek/src/megamek/common/alphaStrike/conversion/ASSpecialAbilityConverter.java @@ -471,6 +471,10 @@ protected static boolean isExplosive(Mounted equipment) { if ((equipment.getType() instanceof MiscType) && equipment.getType().hasFlag(F_BOMB_BAY)) { return true; } + // According to ASC p.123 Booby Traps count as explosive contrary to TO AUE p.109 + if ((equipment.getType() instanceof MiscType) && equipment.getType().hasFlag(F_BOOBY_TRAP)) { + return true; + } // Oneshot weapons internally have normal ammo allocated to them which must // be disqualified as explosive; such ammo has no location return equipment.getType().isExplosive(null) && (equipment.getExplosionDamage() > 0) @@ -539,6 +543,18 @@ protected void finalizeSpecials() { } } } + + // Armor 0 elements cannot get BAR + if (element.getFullArmor() == 0) { + element.getSpecialAbilities().removeSUA(BAR); + } + + // A unit with ENE doesn't need any type of CASE + if (element.hasSUA(ENE)) { + element.getSpecialAbilities().removeSUA(CASE); + element.getSpecialAbilities().removeSUA(CASEII); + element.getSpecialAbilities().removeSUA(CASEP); + } } /** Adds the sua(s) to the element and writes a report line for each, if it is not yet present. */ diff --git a/megamek/src/megamek/common/enums/BasementType.java b/megamek/src/megamek/common/enums/BasementType.java index 8643dbf7390..e6888beaab3 100644 --- a/megamek/src/megamek/common/enums/BasementType.java +++ b/megamek/src/megamek/common/enums/BasementType.java @@ -19,7 +19,6 @@ package megamek.common.enums; import megamek.MegaMek; -import megamek.common.util.EncodeControl; import java.util.Arrays; import java.util.ResourceBundle; @@ -44,7 +43,7 @@ public enum BasementType { //region Constructors BasementType(final String name, final int depth) { final ResourceBundle resources = ResourceBundle.getBundle("megamek.common.messages", - MegaMek.getMMOptions().getLocale(), new EncodeControl()); + MegaMek.getMMOptions().getLocale()); this.name = resources.getString(name); this.depth = depth; } diff --git a/megamek/src/megamek/common/enums/GamePhase.java b/megamek/src/megamek/common/enums/GamePhase.java index c697be6142f..09ff7afc137 100644 --- a/megamek/src/megamek/common/enums/GamePhase.java +++ b/megamek/src/megamek/common/enums/GamePhase.java @@ -21,7 +21,6 @@ import megamek.MegaMek; import megamek.common.*; import megamek.common.options.OptionsConstants; -import megamek.common.util.EncodeControl; import java.util.Objects; import java.util.ResourceBundle; @@ -63,7 +62,7 @@ public enum GamePhase { //region Constructors GamePhase(final String name) { final ResourceBundle resources = ResourceBundle.getBundle("megamek.common.messages", - MegaMek.getMMOptions().getLocale(), new EncodeControl()); + MegaMek.getMMOptions().getLocale()); this.name = resources.getString(name); } //endregion Constructors diff --git a/megamek/src/megamek/common/enums/SkillLevel.java b/megamek/src/megamek/common/enums/SkillLevel.java index 85952726ed4..7c5fb956dfe 100644 --- a/megamek/src/megamek/common/enums/SkillLevel.java +++ b/megamek/src/megamek/common/enums/SkillLevel.java @@ -19,7 +19,6 @@ package megamek.common.enums; import megamek.MegaMek; -import megamek.common.util.EncodeControl; import org.apache.logging.log4j.LogManager; import java.util.List; @@ -47,7 +46,7 @@ public enum SkillLevel { //region Constructors SkillLevel(final String name, final String toolTipText) { final ResourceBundle resources = ResourceBundle.getBundle("megamek.common.messages", - MegaMek.getMMOptions().getLocale(), new EncodeControl()); + MegaMek.getMMOptions().getLocale()); this.name = resources.getString(name); this.toolTipText = resources.getString(toolTipText); } @@ -92,15 +91,38 @@ public boolean isLegendary() { return this == LEGENDARY; } + public boolean isUltraGreenOrGreater() { + return isUltraGreen() || isGreenOrGreater(); + } + + public boolean isGreenOrGreater() { + return isGreen() || isRegularOrGreater(); + } + + public boolean isRegularOrGreater() { + return isRegular() || isVeteranOrGreater(); + } + public boolean isVeteranOrGreater() { return isVeteran() || isEliteOrGreater(); } public boolean isEliteOrGreater() { - return isElite() || isHeroic() || isLegendary(); + return isElite() || isHeroicOrGreater(); + } + + public boolean isHeroicOrGreater() { + return isHeroic() || isLegendary(); } //endregion Boolean Comparisons + /** + * @return the skill level adjusted so that 0 is the level for Ultra-Green + */ + public int getAdjustedValue() { + return ordinal() - 1; + } + /** * This returns the default skill values by level. This should never return the value for NONE, * as NONE means one does not have the skill. diff --git a/megamek/src/megamek/common/enums/WeaponSortOrder.java b/megamek/src/megamek/common/enums/WeaponSortOrder.java index 54ce25f01fb..aaa7331672e 100644 --- a/megamek/src/megamek/common/enums/WeaponSortOrder.java +++ b/megamek/src/megamek/common/enums/WeaponSortOrder.java @@ -20,7 +20,6 @@ import megamek.MegaMek; import megamek.common.*; -import megamek.common.util.EncodeControl; import org.apache.logging.log4j.LogManager; import java.util.Comparator; @@ -44,7 +43,7 @@ public enum WeaponSortOrder { //region Constructors WeaponSortOrder(final String name) { final ResourceBundle resources = ResourceBundle.getBundle("megamek.common.messages", - MegaMek.getMMOptions().getLocale(), new EncodeControl()); + MegaMek.getMMOptions().getLocale()); this.name = resources.getString(name); } //endregion Constructors diff --git a/megamek/src/megamek/common/loaders/MtfFile.java b/megamek/src/megamek/common/loaders/MtfFile.java index 57f15139ba7..3ab2b3cf764 100644 --- a/megamek/src/megamek/common/loaders/MtfFile.java +++ b/megamek/src/megamek/common/loaders/MtfFile.java @@ -741,14 +741,15 @@ private void parseCrits(Mech mech, int loc) throws EntityLoadingException { m.setOmniPodMounted(isOmniPod); hSharedEquip.put(etype, m); } else if (((etype instanceof WeaponType) && ((WeaponType) etype).isSplitable()) || ((etype instanceof MiscType) && etype.hasFlag(MiscType.F_SPLITABLE))) { - // do we already have this one in this or an outer - // location? + // do we already have this one in this or an outer location? Mounted m = null; boolean bFound = false; for (Mounted vSplitWeapon : vSplitWeapons) { m = vSplitWeapon; int nLoc = m.getLocation(); - if (((nLoc == loc) || (loc == Mech.getInnerLocation(nLoc))) && (m.getType() == etype)) { + if ((((nLoc == loc) || (loc == Mech.getInnerLocation(nLoc))) + || ((nLoc == Mech.LOC_CT) && (loc == Mech.LOC_HEAD))) + && (m.getType() == etype)) { bFound = true; break; } diff --git a/megamek/src/megamek/common/options/GameOptions.java b/megamek/src/megamek/common/options/GameOptions.java index b8c4955f48d..ef789aef7e0 100755 --- a/megamek/src/megamek/common/options/GameOptions.java +++ b/megamek/src/megamek/common/options/GameOptions.java @@ -116,8 +116,8 @@ public synchronized void initialize() { addOption(advancedRules, OptionsConstants.ADVANCED_TACOPS_GHOST_TARGET, false); addOption(advancedRules, OptionsConstants.ADVANCED_GHOST_TARGET_MAX, 5); addOption(advancedRules, OptionsConstants.ADVANCED_TACOPS_DIG_IN, false); - addOption(advancedRules, OptionsConstants.ADVANCED_TACOPS_BA_WEIGHT, false); - addOption(advancedRules, OptionsConstants.ADVANCED_TACOPS_TAKE_COVER, false); + addOption(advancedRules, OptionsConstants.ADVANCED_TACOPS_BA_WEIGHT, false); + addOption(advancedRules, OptionsConstants.ADVANCED_TACOPS_TAKE_COVER, false); addOption(advancedRules, OptionsConstants.ADVANCED_TACOPS_ANGEL_ECM, false); addOption(advancedRules, OptionsConstants.ADVANCED_TACOPS_BATTLE_WRECK, false); addOption(advancedRules, OptionsConstants.ADVANCED_TACOPS_SKIN_OF_THE_TEETH_EJECTION, false); @@ -222,7 +222,8 @@ public synchronized void initialize() { addOption(advancedGroundMovement, OptionsConstants.ADVGRNDMOV_TACOPS_TAKING_DAMAGE, false); addOption(advancedGroundMovement, OptionsConstants.ADVGRNDMOV_TACOPS_LEG_DAMAGE, false); addOption(advancedGroundMovement, OptionsConstants.ADVGRNDMOV_TACOPS_WALK_BACKWARDS, false); - addOption(advancedGroundMovement, OptionsConstants.ADVGRNDMOV_TACOPS_FAST_INFANTRY_MOVE, false); + addOption(advancedGroundMovement, OptionsConstants.ADVGRNDMOV_TACOPS_FAST_INFANTRY_MOVE, false); + addOption(advancedGroundMovement, OptionsConstants.ADVANCED_TACOPS_INF_PAVE_BONUS, false); addOption(advancedGroundMovement, OptionsConstants.ADVGRNDMOV_VEHICLE_LANCE_MOVEMENT, false); addOption(advancedGroundMovement, OptionsConstants.ADVGRNDMOV_VEHICLE_LANCE_MOVEMENT_NUMBER, 4); addOption(advancedGroundMovement, OptionsConstants.ADVGRNDMOV_VEHICLE_ACCELERATION, false); @@ -470,18 +471,18 @@ public Vector getOptions() { * @param indent the indent to write at */ public void writeToXML(final PrintWriter pw, int indent) { - MMXMLUtility.writeSimpleXMLOpenIndentedLine(pw, indent++, "gameOptions"); + MMXMLUtility.writeSimpleXMLOpenTag(pw, indent++, "gameOptions"); for (final Enumeration groups = getGroups(); groups.hasMoreElements(); ) { final IOptionGroup group = groups.nextElement(); for (final Enumeration options = group.getOptions(); options.hasMoreElements(); ) { final IOption option = options.nextElement(); - MMXMLUtility.writeSimpleXMLOpenIndentedLine(pw, indent++, "gameOption"); + MMXMLUtility.writeSimpleXMLOpenTag(pw, indent++, "gameOption"); MMXMLUtility.writeSimpleXMLTag(pw, indent, "name", option.getName()); MMXMLUtility.writeSimpleXMLTag(pw, indent, "value", option.getValue().toString()); - MMXMLUtility.writeSimpleXMLCloseIndentedLine(pw, --indent, "gameOption"); + MMXMLUtility.writeSimpleXMLCloseTag(pw, --indent, "gameOption"); } } - MMXMLUtility.writeSimpleXMLCloseIndentedLine(pw, --indent, "gameOptions"); + MMXMLUtility.writeSimpleXMLCloseTag(pw, --indent, "gameOptions"); } /** diff --git a/megamek/src/megamek/common/options/Messages.java b/megamek/src/megamek/common/options/Messages.java index bc79788ec61..5020e76a5ab 100644 --- a/megamek/src/megamek/common/options/Messages.java +++ b/megamek/src/megamek/common/options/Messages.java @@ -14,7 +14,6 @@ package megamek.common.options; import megamek.MegaMek; -import megamek.common.util.EncodeControl; import java.text.MessageFormat; import java.util.MissingResourceException; @@ -23,7 +22,7 @@ class Messages { private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle.getBundle("megamek.common.options.messages", - MegaMek.getMMOptions().getLocale(), new EncodeControl()); + MegaMek.getMMOptions().getLocale()); private Messages() { } diff --git a/megamek/src/megamek/common/options/OptionsConstants.java b/megamek/src/megamek/common/options/OptionsConstants.java index 69ab3d01c1c..05de66207bd 100644 --- a/megamek/src/megamek/common/options/OptionsConstants.java +++ b/megamek/src/megamek/common/options/OptionsConstants.java @@ -337,7 +337,7 @@ public class OptionsConstants { public static final String ADVANCED_TACOPS_GHOST_TARGET= "tacops_ghost_target"; public static final String ADVANCED_GHOST_TARGET_MAX= "ghost_target_max"; public static final String ADVANCED_TACOPS_DIG_IN= "tacops_dig_in"; - public static final String ADVANCED_TACOPS_BA_WEIGHT= "tacops_ba_weight"; + public static final String ADVANCED_TACOPS_BA_WEIGHT= "tacops_ba_weight"; public static final String ADVANCED_TACOPS_TAKE_COVER= "tacops_take_cover"; public static final String ADVANCED_TACOPS_ANGEL_ECM= "tacops_angel_ecm"; public static final String ADVANCED_TACOPS_BATTLE_WRECK= "tacops_battle_wreck"; @@ -442,7 +442,8 @@ public class OptionsConstants { public static final String ADVGRNDMOV_TACOPS_TAKING_DAMAGE= "tacops_taking_damage"; public static final String ADVGRNDMOV_TACOPS_LEG_DAMAGE= "tacops_leg_damage"; public static final String ADVGRNDMOV_TACOPS_WALK_BACKWARDS= "tacops_walk_backwards"; - public static final String ADVGRNDMOV_TACOPS_FAST_INFANTRY_MOVE= "tacops_fast_infantry_move"; + public static final String ADVGRNDMOV_TACOPS_FAST_INFANTRY_MOVE= "tacops_fast_infantry_move"; + public static final String ADVANCED_TACOPS_INF_PAVE_BONUS= "tacops_inf_pave_bonus"; public static final String ADVGRNDMOV_VEHICLE_LANCE_MOVEMENT= "vehicle_lance_movement"; public static final String ADVGRNDMOV_VEHICLE_LANCE_MOVEMENT_NUMBER= "vehicle_lance_movement_number"; public static final String ADVGRNDMOV_TURN_MODE = "vehicle_turn_mode"; diff --git a/megamek/src/megamek/common/preference/ClientPreferences.java b/megamek/src/megamek/common/preference/ClientPreferences.java index b12d37649cd..41400afecdb 100644 --- a/megamek/src/megamek/common/preference/ClientPreferences.java +++ b/megamek/src/megamek/common/preference/ClientPreferences.java @@ -57,6 +57,8 @@ public class ClientPreferences extends PreferenceStoreProxy { public static final String BOARD_HEIGHT = "BoardHeight"; public static final String MAP_WIDTH = "MapWidth"; public static final String MAP_HEIGHT = "MapHeight"; + public static final String REPORT_KEYWORDS = "ReportKeywords"; + private static final String REPORTKEYWORDSDEFAULTS = "Needs\nRolls\nTakes\nHit\nFalls\nSkill Roll\nPilot Skill\nPhase\nDestroyed\nDamage"; public static final String IP_ADDRESSES_IN_CHAT = "IPAddressesInChat"; //endregion Variable Declarations @@ -86,6 +88,7 @@ public ClientPreferences(IPreferenceStore store) { store.setDefault(MAP_HEIGHT, 1); store.setDefault(DEBUG_OUTPUT_ON, false); store.setDefault(MEMORY_DUMP_ON, false); + store.setDefault(REPORT_KEYWORDS, REPORTKEYWORDSDEFAULTS); store.setDefault(IP_ADDRESSES_IN_CHAT, false); setLocale(store.getString(LOCALE)); setMekHitLocLog(); @@ -283,6 +286,14 @@ public void setGUIName(String guiName) { store.setValue(GUI_NAME, guiName); } + public String getReportKeywords() { + return store.getString(REPORT_KEYWORDS); + } + + public void setReportKeywords(String s) { + store.setValue(REPORT_KEYWORDS, s); + } + public boolean getShowIPAddressesInChat() { return store.getBoolean(IP_ADDRESSES_IN_CHAT); } diff --git a/megamek/src/megamek/common/util/EncodeControl.java b/megamek/src/megamek/common/util/EncodeControl.java deleted file mode 100644 index 9655ae3c3ef..00000000000 --- a/megamek/src/megamek/common/util/EncodeControl.java +++ /dev/null @@ -1,110 +0,0 @@ -/* - * MegaMek - Copyright (C) 2000-2004 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. - */ -package megamek.common.util; - -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.io.Reader; -import java.net.URL; -import java.net.URLConnection; -import java.nio.charset.StandardCharsets; -import java.security.AccessController; -import java.security.PrivilegedActionException; -import java.security.PrivilegedExceptionAction; -import java.util.Locale; -import java.util.PropertyResourceBundle; -import java.util.ResourceBundle; -import java.util.ResourceBundle.Control; - -/** - * Borrowed code from http://stackoverflow.com/questions/4659929/how-to-use-utf-8-in-resource-properties-with-resourcebundle - * The issue was the Resource Bundle was reading properties files as ISO-8859-1 encodings. Thus - * special characters, like those used in Russian, were being read wrong. The class below allows for - * a controller to read in any encoding specified. - * The actual overridden class has been copied here with the encoding change from the borrowed coded added. - * - * @author Xenon - */ -public class EncodeControl extends Control { - @Override - public ResourceBundle newBundle(String baseName, Locale locale, String format, ClassLoader loader, boolean reload) - throws IllegalAccessException, InstantiationException, IOException { - String bundleName = this.toBundleName(baseName, locale); - Object bundle = null; - if (format.equals("java.class")) { - try { - Class resourceName = loader.loadClass(bundleName); - if (!ResourceBundle.class.isAssignableFrom(resourceName)) { - throw new ClassCastException(resourceName.getName() + " cannot be cast to ResourceBundle"); - } - - bundle = resourceName.newInstance(); - } catch (ClassNotFoundException var19) { - throw (IOException) var19.getException(); - } - } else { - if (!format.equals("java.properties")) { - throw new IllegalArgumentException("unknown format: " + format); - } - - final String resourceName1 = this.toResourceName0(bundleName, "properties"); - if (resourceName1 == null) { - return (ResourceBundle) bundle; - } - - final ClassLoader classLoader = loader; - final boolean reloadFlag = reload; - InputStream stream = null; - - try { - stream = AccessController.doPrivileged((PrivilegedExceptionAction) () -> { - InputStream is = null; - if (reloadFlag) { - URL url = classLoader.getResource(resourceName1); - if (url != null) { - URLConnection connection = url.openConnection(); - if (connection != null) { - connection.setUseCaches(false); - is = connection.getInputStream(); - } - } - } else { - is = classLoader.getResourceAsStream(resourceName1); - } - - return is; - }); - } catch (PrivilegedActionException var18) { - throw (IOException) var18.getException(); - } - - if (stream != null) { - try (Reader reader = new InputStreamReader(stream, StandardCharsets.UTF_8)) { - // Only this line is changed to make it to read properties files as UTF-8 or other encodings. - bundle = new PropertyResourceBundle(reader); - } finally { - stream.close(); - } - } - } - - return (ResourceBundle) bundle; - } - - // Also borrowed from overridden class. - private String toResourceName0(String bundleName, String suffix) { - return bundleName.contains("://") ? null : this.toResourceName(bundleName, suffix); - } -} diff --git a/megamek/src/megamek/common/util/SerializationHelper.java b/megamek/src/megamek/common/util/SerializationHelper.java index 4047b88d788..674a44bb9d9 100644 --- a/megamek/src/megamek/common/util/SerializationHelper.java +++ b/megamek/src/megamek/common/util/SerializationHelper.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020 The MegaMek Team. All rights reserved. + * Copyright (c) 2020-2022 - The MegaMek Team. All Rights Reserved. * * This file is part of MegaMek. * @@ -10,13 +10,12 @@ * * MegaMek 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 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with MegaMek. If not, see . + * along with MegaMek. If not, see . */ - package megamek.common.util; import com.thoughtworks.xstream.XStream; @@ -32,15 +31,54 @@ * Class that off-loads serialization related code from Server.java */ public class SerializationHelper { - + /** - * Factory method that produces an XStream object suitable for loading MegaMek save games + * Factory method that produces an XStream object suitable for working with MegaMek save games */ - public static XStream getXStream() { - XStream xstream = new XStream(); + public static XStream getSaveGameXStream() { + final XStream xStream = new XStream(); - // This mirrors the settings is saveGame - xstream.setMode(XStream.ID_REFERENCES); + // This will make save games much smaller by using a more efficient means of referencing + // objects in the XML graph + xStream.setMode(XStream.ID_REFERENCES); + + // Setup Permissions + xStream.allowTypes(new Class[] { + megamek.client.bot.princess.BehaviorSettings.class, + megamek.common.Board.class, + megamek.common.Coords.class, + megamek.common.CompositeTechLevel.DateRange.class, + megamek.common.CriticalSlot.class, + megamek.common.Game.class, + megamek.common.Hex.class, + megamek.common.Mounted.class, + megamek.common.PilotingRollData.class, + megamek.common.Player.class, + megamek.common.Sensor.class, + megamek.common.TargetRollModifier.class, + megamek.common.Team.class, + megamek.common.Terrain.class, + megamek.common.Report.class, + megamek.server.SmokeCloud.class, + }); + xStream.allowTypeHierarchy(megamek.common.Crew.class); + xStream.allowTypeHierarchy(megamek.common.GameTurn.class); + xStream.allowTypeHierarchy(megamek.common.ITechnology.class); + xStream.allowTypeHierarchy(megamek.common.Transporter.class); + xStream.allowTypeHierarchy(megamek.common.actions.EntityAction.class); + xStream.allowTypeHierarchy(megamek.common.icons.AbstractIcon.class); + xStream.allowTypeHierarchy(megamek.common.options.AbstractOptions.class); + xStream.allowTypeHierarchy(megamek.common.options.IOption.class); + xStream.allowTypeHierarchy(megamek.common.weapons.AttackHandler.class); + xStream.allowTypeHierarchy(megamek.server.victory.IVictoryConditions.class); + return xStream; + } + + /** + * Factory method that produces an XStream object suitable for loading MegaMek save games + */ + public static XStream getLoadSaveGameXStream() { + XStream xstream = getSaveGameXStream(); xstream.registerConverter(new Converter() { @Override @@ -77,7 +115,7 @@ public void marshal(Object object, HierarchicalStreamWriter writer, MarshallingC // Unused here } }); - + return xstream; } } diff --git a/megamek/src/megamek/common/weapons/ACAPHandler.java b/megamek/src/megamek/common/weapons/ACAPHandler.java index 99381a09c80..baa2e62e075 100644 --- a/megamek/src/megamek/common/weapons/ACAPHandler.java +++ b/megamek/src/megamek/common/weapons/ACAPHandler.java @@ -34,39 +34,23 @@ public class ACAPHandler extends ACWeaponHandler { private static final long serialVersionUID = -4251291510045646817L; - /** - * @param t - * @param w - * @param g - */ public ACAPHandler(ToHitData t, WeaponAttackAction w, Game g, GameManager m) { super(t, w, g, m); generalDamageType = HitData.DAMAGE_ARMOR_PIERCING; } - /* - * (non-Javadoc) - * - * @see - * megamek.common.weapons.WeaponHandler#handleEntityDamage(megamek.common - * .Entity, java.util.Vector, megamek.common.Building, int, int, int, int) - */ @Override - protected void handleEntityDamage(Entity entityTarget, - Vector vPhaseReport, Building bldg, int hits, int nCluster, - int bldgAbsorbs) { + protected void handleEntityDamage(Entity entityTarget, Vector vPhaseReport, + Building bldg, int hits, int nCluster, int bldgAbsorbs) { AmmoType atype = (AmmoType) weapon.getLinked().getType(); - HitData hit = entityTarget.rollHitLocation(toHit.getHitTable(), - toHit.getSideTable(), waa.getAimedLocation(), - waa.getAimingMode(), toHit.getCover()); + HitData hit = entityTarget.rollHitLocation(toHit.getHitTable(), toHit.getSideTable(), + waa.getAimedLocation(), waa.getAimingMode(), toHit.getCover()); hit.setGeneralDamageType(generalDamageType); hit.setAttackerId(getAttackerId()); - if (entityTarget.removePartialCoverHits(hit.getLocation(), toHit - .getCover(), Compute.targetSideTable(ae, entityTarget, weapon - .getCalledShot().getCall()))) { + if (entityTarget.removePartialCoverHits(hit.getLocation(), toHit.getCover(), + Compute.targetSideTable(ae, entityTarget, weapon.getCalledShot().getCall()))) { // Weapon strikes Partial Cover. - handlePartialCoverHit(entityTarget, vPhaseReport, hit, bldg, hits, - nCluster, bldgAbsorbs); + handlePartialCoverHit(entityTarget, vPhaseReport, hit, bldg, hits, nCluster, bldgAbsorbs); return; } @@ -98,8 +82,8 @@ protected void handleEntityDamage(Entity entityTarget, Hex targetHex = game.getBoard().getHex(target.getPosition()); boolean targetStickingOutOfBuilding = unitStickingOutOfBuilding(targetHex, entityTarget); - nDamage = absorbBuildingDamage(nDamage, entityTarget, bldgAbsorbs, - vPhaseReport, bldg, targetStickingOutOfBuilding); + nDamage = absorbBuildingDamage(nDamage, entityTarget, bldgAbsorbs, vPhaseReport, bldg, + targetStickingOutOfBuilding); nDamage = checkTerrain(nDamage, entityTarget, vPhaseReport); @@ -133,12 +117,9 @@ protected void handleEntityDamage(Entity entityTarget, critModifier += toHit.getMoS() / 3; } hit.makeArmorPiercing(atype, critModifier); - vPhaseReport - .addAll(gameManager.damageEntity(entityTarget, hit, nDamage, - false, ae.getSwarmTargetId() == entityTarget - .getId() ? DamageType.IGNORE_PASSENGER - : damageType, false, false, throughFront, - underWater)); + vPhaseReport.addAll(gameManager.damageEntity(entityTarget, hit, nDamage, false, + ae.getSwarmTargetId() == entityTarget.getId() ? DamageType.IGNORE_PASSENGER : damageType, + false, false, throughFront, underWater)); } } } diff --git a/megamek/src/megamek/common/weapons/AmmoWeaponHandler.java b/megamek/src/megamek/common/weapons/AmmoWeaponHandler.java index d73cf9c3c14..782c7295095 100644 --- a/megamek/src/megamek/common/weapons/AmmoWeaponHandler.java +++ b/megamek/src/megamek/common/weapons/AmmoWeaponHandler.java @@ -26,6 +26,7 @@ import megamek.common.options.OptionsConstants; import megamek.server.GameManager; import megamek.server.Server; +import org.apache.logging.log4j.LogManager; /** * @author Andrew Hunter @@ -40,28 +41,18 @@ protected AmmoWeaponHandler() { // deserialization only } - /** - * @param t - * @param w - * @param g - */ - public AmmoWeaponHandler(ToHitData t, WeaponAttackAction w, Game g, - GameManager m) { + public AmmoWeaponHandler(ToHitData t, WeaponAttackAction w, Game g, GameManager m) { super(t, w, g, m); generalDamageType = HitData.DAMAGE_BALLISTIC; } - /* - * (non-Javadoc) - * - * @see megamek.common.weapons.WeaponHandler#UseAmmo() - */ @Override protected void useAmmo() { checkAmmo(); - if (ammo == null) {// Can't happen. w/o legal ammo, the weapon - // *shouldn't* fire. - System.out.println("Handler can't find any ammo! Oh no!"); + if (ammo == null) { + // Can't happen. w/o legal ammo, the weapon *shouldn't* fire. + LogManager.getLogger().error("Handler can't find any ammo! Oh no!", new Exception()); + return; } if (ammo.getUsableShotsLeft() <= 0) { @@ -84,8 +75,7 @@ protected void checkAmmo() { * For ammo weapons, this number can be less than the full number if the * amount of ammo is not high enough * - * @return the number of weapons of this type firing (for squadron weapon - * groups) + * @return the number of weapons of this type firing (for squadron weapon groups) */ @Override protected int getNumberWeapons() { @@ -161,8 +151,7 @@ protected void explodeRoundInBarrel(Vector vPhaseReport) { int wloc = weapon.getLocation(); for (int i = 0; i < ae.getNumberOfCriticals(wloc); i++) { CriticalSlot slot1 = ae.getCritical(wloc, i); - if ((slot1 == null) || - (slot1.getType() == CriticalSlot.TYPE_SYSTEM)) { + if ((slot1 == null) || (slot1.getType() == CriticalSlot.TYPE_SYSTEM)) { continue; } Mounted mounted = slot1.getMount(); diff --git a/megamek/src/megamek/common/weapons/ArtilleryBayWeaponIndirectFireHandler.java b/megamek/src/megamek/common/weapons/ArtilleryBayWeaponIndirectFireHandler.java index c8092eb3394..bcca3a4e059 100644 --- a/megamek/src/megamek/common/weapons/ArtilleryBayWeaponIndirectFireHandler.java +++ b/megamek/src/megamek/common/weapons/ArtilleryBayWeaponIndirectFireHandler.java @@ -97,7 +97,7 @@ public boolean handle(GamePhase phase, Vector vPhaseReport) { } String artyMsg; ArtilleryAttackAction aaa = (ArtilleryAttackAction) waa; - if (phase == GamePhase.TARGETING) { + if (phase.isTargeting()) { if (!handledAmmoAndReport) { addHeat(); // Report the firing itself diff --git a/megamek/src/megamek/common/weapons/ArtilleryBayWeaponIndirectHomingHandler.java b/megamek/src/megamek/common/weapons/ArtilleryBayWeaponIndirectHomingHandler.java index fb9826c2b81..f87adbf2a76 100644 --- a/megamek/src/megamek/common/weapons/ArtilleryBayWeaponIndirectHomingHandler.java +++ b/megamek/src/megamek/common/weapons/ArtilleryBayWeaponIndirectHomingHandler.java @@ -77,7 +77,7 @@ public boolean handle(GamePhase phase, Vector vPhaseReport) { return true; } ArtilleryAttackAction aaa = (ArtilleryAttackAction) waa; - if (phase == GamePhase.TARGETING) { + if (phase.isTargeting()) { if (!handledAmmoAndReport) { addHeat(); // Report the firing itself diff --git a/megamek/src/megamek/common/weapons/ArtilleryWeaponIndirectFireHandler.java b/megamek/src/megamek/common/weapons/ArtilleryWeaponIndirectFireHandler.java index ab20cdd5f58..77c77560be6 100644 --- a/megamek/src/megamek/common/weapons/ArtilleryWeaponIndirectFireHandler.java +++ b/megamek/src/megamek/common/weapons/ArtilleryWeaponIndirectFireHandler.java @@ -49,25 +49,11 @@ public ArtilleryWeaponIndirectFireHandler(ToHitData t, WeaponAttackAction w, Gam } } - /* - * (non-Javadoc) - * - * @see megamek.common.weapons.AttackHandler#cares(int) - */ @Override public boolean cares(GamePhase phase) { - if ((phase == GamePhase.OFFBOARD) - || (phase == GamePhase.TARGETING)) { - return true; - } - return false; + return phase.isOffboard() || phase.isTargeting(); } - /* - * (non-Javadoc) - * - * @see megamek.common.weapons.AttackHandler#handle(int, java.util.Vector) - */ @Override public boolean handle(GamePhase phase, Vector vPhaseReport) { if (!cares(phase)) { @@ -75,7 +61,7 @@ public boolean handle(GamePhase phase, Vector vPhaseReport) { } String artyMsg; ArtilleryAttackAction aaa = (ArtilleryAttackAction) waa; - if (phase == GamePhase.TARGETING) { + if (phase.isTargeting()) { if (!handledAmmoAndReport) { addHeat(); // Report the firing itself diff --git a/megamek/src/megamek/common/weapons/ArtilleryWeaponIndirectHomingHandler.java b/megamek/src/megamek/common/weapons/ArtilleryWeaponIndirectHomingHandler.java index 23985cd96c8..216297c0505 100644 --- a/megamek/src/megamek/common/weapons/ArtilleryWeaponIndirectHomingHandler.java +++ b/megamek/src/megamek/common/weapons/ArtilleryWeaponIndirectHomingHandler.java @@ -61,7 +61,7 @@ public boolean handle(GamePhase phase, Vector vPhaseReport) { return true; } ArtilleryAttackAction aaa = (ArtilleryAttackAction) waa; - if (phase == GamePhase.TARGETING) { + if (phase.isTargeting()) { if (!handledAmmoAndReport) { addHeat(); // Report the firing itself diff --git a/megamek/src/megamek/common/weapons/BayWeaponHandler.java b/megamek/src/megamek/common/weapons/BayWeaponHandler.java index e9905678333..794a316b294 100644 --- a/megamek/src/megamek/common/weapons/BayWeaponHandler.java +++ b/megamek/src/megamek/common/weapons/BayWeaponHandler.java @@ -34,12 +34,6 @@ protected BayWeaponHandler() { // deserialization only } - /** - * @param t - * @param w - * @param g - * @param m - */ public BayWeaponHandler(ToHitData t, WeaponAttackAction w, Game g, GameManager m) { super(t, w, g, m); } @@ -241,8 +235,7 @@ public boolean handle(GamePhase phase, Vector vPhaseReport) { // Works out fire setting, AMS shots, and whether continuation is // necessary. - if (!handleSpecialMiss(entityTarget, bldgDamagedOnMiss, bldg, - vPhaseReport)) { + if (!handleSpecialMiss(entityTarget, bldgDamagedOnMiss, bldg, vPhaseReport)) { return false; } } @@ -264,8 +257,7 @@ public boolean handle(GamePhase phase, Vector vPhaseReport) { // Targeting a building. if (target.getTargetType() == Targetable.TYPE_BUILDING) { // The building takes the full brunt of the attack - handleBuildingDamage(vPhaseReport, bldg, nDamPerHit, - target.getPosition()); + handleBuildingDamage(vPhaseReport, bldg, nDamPerHit, target.getPosition()); return false; } @@ -319,19 +311,16 @@ public boolean handle(GamePhase phase, Vector vPhaseReport) { // absorbed damage shouldn't reduce incoming damage, // since the incoming damage was reduced in // Compute.directBlowInfantryDamage - nDamage = -wtype.getDamage(nRange) - * Math.min(nCluster, hits); + nDamage = -wtype.getDamage(nRange) * Math.min(nCluster, hits); } - bldgAbsorbs = (int) Math.round(nDamage - * bldg.getInfDmgFromInside()); + bldgAbsorbs = (int) Math.round(nDamage * bldg.getInfDmgFromInside()); } else { // Used later to indicate a special report bldgAbsorbs = Integer.MIN_VALUE; } } - handleEntityDamage(entityTarget, vPhaseReport, bldg, hits, - nCluster, bldgAbsorbs); + handleEntityDamage(entityTarget, vPhaseReport, bldg, hits, nCluster, bldgAbsorbs); gameManager.creditKill(entityTarget, ae); } // Handle the next weapon in the bay Report.addNewline(vPhaseReport); @@ -341,7 +330,6 @@ public boolean handle(GamePhase phase, Vector vPhaseReport) { /** * Calculate the starting armor value of a flight of Capital Missiles * Used for Aero Sanity. This is done in calcAttackValue() otherwise - * */ protected int initializeCapMissileArmor() { return 0; @@ -469,7 +457,7 @@ public boolean handleAeroSanity(GamePhase phase, Vector vPhaseReport) { vPhaseReport.addElement(r); } - //Don't add heat here, because that will be handled by individual weapons (even if heat by arc) + // Don't add heat here, because that will be handled by individual weapons (even if heat by arc) // Any necessary PSRs, jam checks, etc. // If this boolean is true, don't report @@ -486,8 +474,8 @@ public boolean handleAeroSanity(GamePhase phase, Vector vPhaseReport) { return false; } - //Large missiles - //use this if AMS counterfire destroys all the missiles + // Large missiles + // use this if AMS counterfire destroys all the missiles if (amsBayEngagedCap && (CapMissileArmor <= 0)) { r = new Report(3356); r.indent(); @@ -495,7 +483,7 @@ public boolean handleAeroSanity(GamePhase phase, Vector vPhaseReport) { vPhaseReport.addElement(r); return false; } - //use this if PD counterfire destroys all the Capital missiles + // use this if PD counterfire destroys all the Capital missiles if (pdBayEngagedCap && (CapMissileArmor <= 0)) { r = new Report(3355); r.indent(); @@ -512,10 +500,10 @@ public boolean handleAeroSanity(GamePhase phase, Vector vPhaseReport) { } } - //Report point defense effects - //Set up a cluster hits table modifier + // Report point defense effects + // Set up a cluster hits table modifier double counterAVMod = getCounterAV(); - //Report a failure due to overheating + // Report a failure due to overheating if (pdOverheated && (!(amsBayEngaged || amsBayEngagedCap @@ -528,16 +516,16 @@ public boolean handleAeroSanity(GamePhase phase, Vector vPhaseReport) { r.indent(); vPhaseReport.addElement(r); } else if (pdOverheated) { - //Report a partial failure + // Report a partial failure r = new Report (3361); r.subject = subjectId; r.indent(); vPhaseReport.addElement(r); - //Halve the effectiveness of cluster hits modification + // Halve the effectiveness of cluster hits modification counterAVMod /= 2.0; } - //Now report the effects, if any - //Missiles using the cluster hits table + // Now report the effects, if any + // Missiles using the cluster hits table if (amsBayEngaged || pdBayEngaged) { r = new Report(3366); r.indent(); @@ -573,7 +561,7 @@ public boolean handleAeroSanity(GamePhase phase, Vector vPhaseReport) { } bayWHandler.handle(phase, vPhaseReport); if (vPhaseReport.size() > replaceReport) { - //fix the reporting - is there a better way to do this + // fix the reporting - is there a better way to do this Report currentReport = vPhaseReport.get(replaceReport); while (null != currentReport) { vPhaseReport.remove(replaceReport); diff --git a/megamek/src/megamek/common/weapons/BombAttackHandler.java b/megamek/src/megamek/common/weapons/BombAttackHandler.java index a28e44be45e..ac878030c84 100644 --- a/megamek/src/megamek/common/weapons/BombAttackHandler.java +++ b/megamek/src/megamek/common/weapons/BombAttackHandler.java @@ -207,7 +207,7 @@ public boolean handle(GamePhase phase, Vector vPhaseReport) { // Retrieve facing at current step in flight path int facing = ae.getPassedThroughFacing().get(idx); // Scatter, based on location and facing - drop = Compute.scatterAltitudeBombs(coords, facing); + drop = Compute.scatterAltitudeBombs(coords, facing, moF); } else { drop = Compute.scatterDiveBombs(coords, moF); } diff --git a/megamek/src/megamek/common/weapons/CLIATMHandler.java b/megamek/src/megamek/common/weapons/CLIATMHandler.java index 2d01953673d..ce2cf02bf56 100644 --- a/megamek/src/megamek/common/weapons/CLIATMHandler.java +++ b/megamek/src/megamek/common/weapons/CLIATMHandler.java @@ -31,22 +31,11 @@ public class CLIATMHandler extends ATMHandler { private static final long serialVersionUID = 5476183194060709574L; boolean isAngelECMAffected; - /** - * @param t - * @param w - * @param g - * @param m - */ public CLIATMHandler(ToHitData t, WeaponAttackAction w, Game g, GameManager m) { super(t, w, g, m); isAngelECMAffected = ComputeECM.isAffectedByAngelECM(ae, ae.getPosition(), target.getPosition()); } - /* - * (non-Javadoc) - * - * @see megamek.common.weapons.WeaponHandler#calcDamagePerHit() - */ @Override protected int calcDamagePerHit() { double toReturn; @@ -83,24 +72,16 @@ protected int calcDamagePerHit() { return (int) toReturn; } - /* - * (non-Javadoc) - * - * @see megamek.common.weapons.WeaponHandler#calcHits(java.util.Vector) - */ @Override protected int calcHits(Vector vPhaseReport) { - // conventional infantry gets hit in one lump - gets calculated in the - // sub functions + // conventional infantry gets hit in one lump - gets calculated in the sub functions // don't need to check for BAs, because BA can't mount ATMs - int hits; AmmoType atype = (AmmoType) ammo.getType(); // TacOPs p.84 Cluster Hit Penalites will only effect ATM HE // I'm doing my own hit calcs here. Special ammo gets its own method. - // compute ammount of missiles hit - this is the same for all ATM ammo - // types. - hits = calcMissileHits(vPhaseReport); + // compute ammount of missiles hit - this is the same for all ATM ammo types. + int hits = calcMissileHits(vPhaseReport); // If we use IIW or IMP we are done. if ((atype.getMunitionType() == AmmoType.M_IATM_IIW) @@ -125,15 +106,10 @@ protected int calcHits(Vector vPhaseReport) { */ @Override protected int calcAttackValue() { - // TODO: Should handle speical munitions AV + // TODO: Should handle specical munitions AV return super.calcAttackValue(); } - /* - * (non-Javadoc) - * - * @see megamek.common.weapons.WeaponHandler#calcHits(java.util.Vector) - */ protected int calcMissileHits(Vector vPhaseReport) { AmmoType atype = (AmmoType) ammo.getType(); @@ -145,8 +121,7 @@ protected int calcMissileHits(Vector vPhaseReport) { Report r = new Report(3325); r.newlines = 0; r.subject = subjectId; - r.add(wtype.getRackSize() - * ((BattleArmor) ae).getShootingStrength()); + r.add(wtype.getRackSize() * ((BattleArmor) ae).getShootingStrength()); r.add(sSalvoType); r.add(toHit.getTableDesc()); vPhaseReport.add(r); @@ -182,10 +157,9 @@ protected int calcMissileHits(Vector vPhaseReport) { // Only apply if not all shots hit. IATM IMP have HE ranges and thus // suffer from spread too - if (((atype.getMunitionType() == AmmoType.M_HIGH_EXPLOSIVE) || (atype - .getMunitionType() == AmmoType.M_IATM_IMP)) - && tacopscluster - && !allShotsHit()) { + if (((atype.getMunitionType() == AmmoType.M_HIGH_EXPLOSIVE) + || (atype.getMunitionType() == AmmoType.M_IATM_IMP)) + && tacopscluster && !allShotsHit()) { if (nRange <= 1) { nMissilesModifier += 1; } else if (nRange <= ranges[RangeType.RANGE_MEDIUM]) { @@ -198,7 +172,7 @@ protected int calcMissileHits(Vector vPhaseReport) { // ////// // This applies even with streaks. if (game.getOptions().booleanOption(OptionsConstants.ADVCOMBAT_TACOPS_RANGE) - && (nRange > wtype.getRanges(weapon)[RangeType.RANGE_LONG])) { + && (nRange > wtype.getRanges(weapon)[RangeType.RANGE_LONG])) { nMissilesModifier -= 2; } if (game.getOptions().booleanOption(OptionsConstants.ADVCOMBAT_TACOPS_LOS_RANGE) @@ -309,8 +283,7 @@ protected int calcMissileHits(Vector vPhaseReport) { // I don't think i need to change anything here for iATMs. Seems just to // handle Minefield clearance @Override - protected boolean specialResolution(Vector vPhaseReport, - Entity entityTarget) { + protected boolean specialResolution(Vector vPhaseReport, Entity entityTarget) { if (!bMissed && (target.getTargetType() == Targetable.TYPE_MINEFIELD_CLEAR)) { Report r = new Report(3255); @@ -319,13 +292,11 @@ protected boolean specialResolution(Vector vPhaseReport, vPhaseReport.addElement(r); Coords coords = target.getPosition(); - Enumeration minefields = game.getMinefields(coords) - .elements(); + Enumeration minefields = game.getMinefields(coords).elements(); ArrayList mfRemoved = new ArrayList<>(); while (minefields.hasMoreElements()) { Minefield mf = minefields.nextElement(); - if (gameManager.clearMinefield(mf, ae, - Minefield.CLEAR_NUMBER_WEAPON, vPhaseReport)) { + if (gameManager.clearMinefield(mf, ae, Minefield.CLEAR_NUMBER_WEAPON, vPhaseReport)) { mfRemoved.add(mf); } } @@ -339,11 +310,6 @@ protected boolean specialResolution(Vector vPhaseReport, return false; } - /* - * (non-Javadoc) - * - * @see megamek.common.weapons.WeaponHandler#allShotsHit() - */ @Override protected boolean allShotsHit() { // If we IDF, we don't get the streak bonus @@ -354,11 +320,6 @@ protected boolean allShotsHit() { return super.allShotsHit() || !isAngelECMAffected; } - /* - * (non-Javadoc) - * - * @see megamek.common.weapons.WeaponHandler#addHeat() - */ @Override protected void addHeat() { // call super function if we are in IDF mode since we don't have streak @@ -374,11 +335,6 @@ protected void addHeat() { } } - /* - * (non-Javadoc) - * - * @see megamek.common.weapons.WeaponHandler#UseAmmo() - */ @Override protected void useAmmo() { // call super function if we are in IDF mode, since we don't have streak @@ -405,11 +361,6 @@ protected void useAmmo() { } } - /* - * (non-Javadoc) - * - * @see megamek.common.weapons.WeaponHandler#reportMiss(java.util.Vector) - */ @Override protected void reportMiss(Vector vPhaseReport) { // again, call super if we are in IDF mode. diff --git a/megamek/src/megamek/common/weapons/CapitalMissileBearingsOnlyHandler.java b/megamek/src/megamek/common/weapons/CapitalMissileBearingsOnlyHandler.java index 30e76dc2a5f..a2dd610482e 100644 --- a/megamek/src/megamek/common/weapons/CapitalMissileBearingsOnlyHandler.java +++ b/megamek/src/megamek/common/weapons/CapitalMissileBearingsOnlyHandler.java @@ -101,7 +101,7 @@ public boolean handle(GamePhase phase, Vector vPhaseReport) { return true; } ArtilleryAttackAction aaa = (ArtilleryAttackAction) waa; - if (phase == GamePhase.TARGETING) { + if (phase.isTargeting()) { if (!handledAmmoAndReport) { addHeat(); // Report the firing itself @@ -129,7 +129,7 @@ public boolean handle(GamePhase phase, Vector vPhaseReport) { } Entity entityTarget = (aaa.getTargetType() == Targetable.TYPE_ENTITY) ? (Entity) aaa .getTarget(game) : null; - if (game.getPhase() == GamePhase.FIRING && entityTarget == null) { + if (game.getPhase().isFiring() && entityTarget == null) { convertHexTargetToEntityTarget(vPhaseReport); entityTarget = (aaa.getTargetType() == Targetable.TYPE_ENTITY) ? (Entity) aaa .getTarget(game) : null; diff --git a/megamek/src/megamek/common/weapons/FireExtinguisherHandler.java b/megamek/src/megamek/common/weapons/FireExtinguisherHandler.java index 8f7b77dac0a..fcce425b09d 100644 --- a/megamek/src/megamek/common/weapons/FireExtinguisherHandler.java +++ b/megamek/src/megamek/common/weapons/FireExtinguisherHandler.java @@ -13,18 +13,11 @@ */ package megamek.common.weapons; -import java.util.Vector; - -import megamek.common.Entity; -import megamek.common.Game; -import megamek.common.Report; -import megamek.common.Tank; -import megamek.common.Targetable; -import megamek.common.Terrains; -import megamek.common.ToHitData; +import megamek.common.*; import megamek.common.actions.WeaponAttackAction; import megamek.server.GameManager; -import megamek.server.Server; + +import java.util.Vector; /** * @author Sebastian Brocks @@ -33,22 +26,10 @@ public class FireExtinguisherHandler extends WeaponHandler { private static final long serialVersionUID = -7047033962986081773L; - /** - * @param toHit - * @param waa - * @param g - */ public FireExtinguisherHandler(ToHitData toHit, WeaponAttackAction waa, Game g, GameManager m) { super(toHit, waa, g, m); } - /* - * (non-Javadoc) - * - * @see - * megamek.common.weapons.WeaponHandler#specialResolution(java.util.Vector, - * megamek.common.Entity, boolean) - */ @Override protected boolean specialResolution(Vector vPhaseReport, Entity entityTarget) { if (!bMissed) { diff --git a/megamek/src/megamek/common/weapons/FlamerHandler.java b/megamek/src/megamek/common/weapons/FlamerHandler.java index 5288a9f9b9d..f7f846179d0 100644 --- a/megamek/src/megamek/common/weapons/FlamerHandler.java +++ b/megamek/src/megamek/common/weapons/FlamerHandler.java @@ -17,7 +17,6 @@ import megamek.common.actions.WeaponAttackAction; import megamek.common.options.OptionsConstants; import megamek.server.GameManager; -import megamek.server.Server; import java.util.Vector; @@ -28,11 +27,6 @@ public class FlamerHandler extends WeaponHandler { private static final long serialVersionUID = -7348456582587703751L; - /** - * @param toHit - * @param waa - * @param g - */ public FlamerHandler(ToHitData toHit, WeaponAttackAction waa, Game g, GameManager m) { super(toHit, waa, g, m); generalDamageType = HitData.DAMAGE_ENERGY; diff --git a/megamek/src/megamek/common/weapons/MicroBombHandler.java b/megamek/src/megamek/common/weapons/MicroBombHandler.java index aa1ba4d4519..9e5811c26c3 100644 --- a/megamek/src/megamek/common/weapons/MicroBombHandler.java +++ b/megamek/src/megamek/common/weapons/MicroBombHandler.java @@ -67,7 +67,9 @@ protected boolean specialResolution(Vector vPhaseReport, Entity entityTa moF = -toHit.getMoS() - 2; } } - coords = Compute.scatterDiveBombs(coords, moF); + + // magic number - BA-launched micro bombs only scatter 1 hex per TW-2018 p 228 + coords = Compute.scatter(coords, 1); if (game.getBoard().contains(coords)) { Report r = new Report(3195); r.subject = subjectId; diff --git a/megamek/src/megamek/common/weapons/MissileWeaponHandler.java b/megamek/src/megamek/common/weapons/MissileWeaponHandler.java index 6351f7c1922..5f6d4b83b8d 100644 --- a/megamek/src/megamek/common/weapons/MissileWeaponHandler.java +++ b/megamek/src/megamek/common/weapons/MissileWeaponHandler.java @@ -33,14 +33,7 @@ public class MissileWeaponHandler extends AmmoWeaponHandler { boolean advancedPD = false; boolean multiAMS = false; - /** - * @param t - * @param w - * @param g - * @param m - */ - public MissileWeaponHandler(ToHitData t, WeaponAttackAction w, Game g, - GameManager m) { + public MissileWeaponHandler(ToHitData t, WeaponAttackAction w, Game g, GameManager m) { super(t, w, g, m); generalDamageType = HitData.DAMAGE_MISSILE; advancedAMS = g.getOptions().booleanOption(OptionsConstants.ADVCOMBAT_TACOPS_AMS); @@ -117,12 +110,10 @@ protected int calcHits(Vector vPhaseReport) { } else { nMissilesModifier += 2; } - } else if (((mLinker != null) && (mLinker.getType() instanceof MiscType) && !mLinker.isDestroyed() && !mLinker.isMissing() - && !mLinker.isBreached() && mLinker.getType().hasFlag( - MiscType.F_ARTEMIS_PROTO)) + && !mLinker.isBreached() && mLinker.getType().hasFlag(MiscType.F_ARTEMIS_PROTO)) && (atype.getMunitionType() == AmmoType.M_ARTEMIS_CAPABLE)) { if (bECMAffected) { // ECM prevents bonus @@ -142,8 +133,7 @@ protected int calcHits(Vector vPhaseReport) { } else if (((mLinker != null) && (mLinker.getType() instanceof MiscType) && !mLinker.isDestroyed() && !mLinker.isMissing() - && !mLinker.isBreached() && mLinker.getType().hasFlag( - MiscType.F_ARTEMIS_V)) + && !mLinker.isBreached() && mLinker.getType().hasFlag(MiscType.F_ARTEMIS_V)) && (atype.getMunitionType() == AmmoType.M_ARTEMIS_V_CAPABLE)) { if (bECMAffected) { // ECM prevents bonus @@ -163,8 +153,7 @@ protected int calcHits(Vector vPhaseReport) { } else if (((mLinker != null) && (mLinker.getType() instanceof MiscType) && !mLinker.isDestroyed() && !mLinker.isMissing() - && !mLinker.isBreached() && mLinker.getType().hasFlag( - MiscType.F_APOLLO)) + && !mLinker.isBreached() && mLinker.getType().hasFlag(MiscType.F_APOLLO)) && (atype.getAmmoType() == AmmoType.T_MRM)) { nMissilesModifier -= 1; } else if (atype.getAmmoType() == AmmoType.T_ATM) { @@ -184,15 +173,14 @@ protected int calcHits(Vector vPhaseReport) { nMissilesModifier += 2; } } else if ((entityTarget != null) - && (entityTarget.isNarcedBy(ae.getOwner().getTeam()) || entityTarget - .isINarcedBy(ae.getOwner().getTeam()))) { + && (entityTarget.isNarcedBy(ae.getOwner().getTeam()) + || entityTarget.isINarcedBy(ae.getOwner().getTeam()))) { // only apply Narc bonus if we're not suffering ECM effect // and we are using narc ammo, and we're not firing indirectly. // narc capable missiles are only affected if the narc pod, which // sits on the target, is ECM affected boolean bTargetECMAffected = false; - bTargetECMAffected = ComputeECM.isAffectedByECM(ae, - target.getPosition(), target.getPosition()); + bTargetECMAffected = ComputeECM.isAffectedByECM(ae, target.getPosition(), target.getPosition()); if (((atype.getAmmoType() == AmmoType.T_LRM) || (atype.getAmmoType() == AmmoType.T_LRM_IMP) || (atype.getAmmoType() == AmmoType.T_SRM) @@ -224,24 +212,20 @@ protected int calcHits(Vector vPhaseReport) { if (allShotsHit()) { // We want buildings and large craft to be able to affect this number with AMS // treat as a Streak launcher (cluster roll 11) to make this happen - missilesHit = Compute.missilesHit(wtype.getRackSize(), - nMissilesModifier, weapon.isHotLoaded(), true, - isAdvancedAMS()); + missilesHit = Compute.missilesHit(wtype.getRackSize(), nMissilesModifier, + weapon.isHotLoaded(), true, isAdvancedAMS()); } else { if (ae instanceof BattleArmor) { int shootingStrength = 1; if ((weapon.getLocation() == BattleArmor.LOC_SQUAD) - && !(weapon.isSquadSupportWeapon())) { + && !weapon.isSquadSupportWeapon()) { shootingStrength = ((BattleArmor) ae).getShootingStrength(); } - missilesHit = Compute.missilesHit(wtype.getRackSize() - * shootingStrength, - nMissilesModifier, weapon.isHotLoaded(), false, - isAdvancedAMS()); + missilesHit = Compute.missilesHit(wtype.getRackSize() * shootingStrength, + nMissilesModifier, weapon.isHotLoaded(), false, isAdvancedAMS()); } else { - missilesHit = Compute.missilesHit(wtype.getRackSize(), - nMissilesModifier, weapon.isHotLoaded(), false, - isAdvancedAMS()); + missilesHit = Compute.missilesHit(wtype.getRackSize(), nMissilesModifier, + weapon.isHotLoaded(), false, isAdvancedAMS()); } } @@ -314,8 +298,7 @@ protected int calcAttackValue() { int bonus = 0; if (((mLinker != null) && (mLinker.getType() instanceof MiscType) && !mLinker.isDestroyed() && !mLinker.isMissing() - && !mLinker.isBreached() && mLinker.getType().hasFlag( - MiscType.F_ARTEMIS)) + && !mLinker.isBreached() && mLinker.getType().hasFlag(MiscType.F_ARTEMIS)) && (atype.getMunitionType() == AmmoType.M_ARTEMIS_CAPABLE)) { // MML3 gets no bonus from Artemis IV (how sad) if (atype.getRackSize() > 3) { @@ -325,10 +308,10 @@ protected int calcAttackValue() { } } } + if (((mLinker != null) && (mLinker.getType() instanceof MiscType) && !mLinker.isDestroyed() && !mLinker.isMissing() - && !mLinker.isBreached() && mLinker.getType().hasFlag( - MiscType.F_ARTEMIS_PROTO)) + && !mLinker.isBreached() && mLinker.getType().hasFlag(MiscType.F_ARTEMIS_PROTO)) && (atype.getMunitionType() == AmmoType.M_ARTEMIS_CAPABLE)) { // MML3 gets no bonus from Artemis IV (how sad) if (atype.getRackSize() > 3) { @@ -338,10 +321,10 @@ protected int calcAttackValue() { } } } + if (((mLinker != null) && (mLinker.getType() instanceof MiscType) && !mLinker.isDestroyed() && !mLinker.isMissing() - && !mLinker.isBreached() && mLinker.getType().hasFlag( - MiscType.F_ARTEMIS_V)) + && !mLinker.isBreached() && mLinker.getType().hasFlag(MiscType.F_ARTEMIS_V)) && (atype.getMunitionType() == AmmoType.M_ARTEMIS_V_CAPABLE)) { // MML3 WOULD get a bonus from Artemis V, if you were crazy enough // to cross-tech it @@ -426,6 +409,7 @@ protected boolean handleSpecialMiss(Entity entityTarget, boolean bldgDamagedOnMi || (toHit.getValue() == TargetRoll.AUTOMATIC_FAIL)) { return false; } + return true; } @@ -434,7 +418,7 @@ protected boolean handleSpecialMiss(Entity entityTarget, boolean bldgDamagedOnMi protected double getAeroSanityAMSHitsMod() { if (getParentBayHandler() != null) { WeaponHandler bayHandler = getParentBayHandler(); - double counterAVMod = (bayHandler.getCounterAV() / bayHandler.weapon.getBayWeapons().size()); + double counterAVMod = bayHandler.getCounterAV() / bayHandler.weapon.getBayWeapons().size(); // use this if point defenses engage the missiles if (bayHandler.pdOverheated) { // Halve the effectiveness @@ -501,8 +485,7 @@ protected int getAMSHitsMod(Vector vPhaseReport) { if (!(counter.getType() instanceof WeaponType) || !counter.isReady() || counter.isMissing() // no AMS when a shield in the AMS location - || (pdEnt.hasShield() && pdEnt.hasActiveShield( - counter.getLocation(), false)) + || (pdEnt.hasShield() && pdEnt.hasActiveShield(counter.getLocation(), false)) // shutdown means no AMS || pdEnt.isShutDown()) { continue; @@ -585,6 +568,7 @@ protected int getAMSHitsMod(Vector vPhaseReport) { break; default: // 4+ minApdsMod = -4; + break; } } apdsMod = Math.min(minApdsMod + dist, 0); @@ -618,8 +602,7 @@ public boolean handle(GamePhase phase, Vector vPhaseReport) { } Entity entityTarget = (target.getTargetType() == Targetable.TYPE_ENTITY) ? (Entity) target : null; - final boolean targetInBuilding = Compute.isInBuilding(game, - entityTarget); + final boolean targetInBuilding = Compute.isInBuilding(game, entityTarget); final boolean bldgDamagedOnMiss = targetInBuilding && !(target instanceof Infantry) && ae.getPosition().distance(target.getPosition()) <= 1; @@ -657,8 +640,8 @@ public boolean handle(GamePhase phase, Vector vPhaseReport) { boolean shotAtNemesisTarget = false; if (bNemesisConfusable && !waa.isNemesisConfused()) { // loop through nemesis targets - for (Enumeration e = game.getNemesisTargets(ae, - target.getPosition()); e.hasMoreElements();) { + for (Enumeration e = game.getNemesisTargets(ae, target.getPosition()); + e.hasMoreElements(); ) { Entity entity = e.nextElement(); // friendly unit with attached iNarc Nemesis pod standing in the way r = new Report(3125); @@ -812,8 +795,7 @@ public boolean handle(GamePhase phase, Vector vPhaseReport) { reportMiss(vPhaseReport); // Works out fire setting, AMS shots, and whether continuation is necessary. - if (!handleSpecialMiss(entityTarget, bldgDamagedOnMiss, bldg, - vPhaseReport)) { + if (!handleSpecialMiss(entityTarget, bldgDamagedOnMiss, bldg, vPhaseReport)) { return false; } } @@ -841,12 +823,13 @@ public boolean handle(GamePhase phase, Vector vPhaseReport) { r.indent(); vPhaseReport.addElement(r); } else if (pdOverheated) { - //Report a partial failure + // Report a partial failure r = new Report (3361); r.subject = subjectId; r.indent(); vPhaseReport.addElement(r); } + if (!bMissed && amsEngaged && isTbolt() && !ae.isCapitalFighter()) { // Thunderbolts are destroyed by AMS 50% of the time whether Aero Sanity is on or not hits = calcHits(vPhaseReport); @@ -855,6 +838,7 @@ public boolean handle(GamePhase phase, Vector vPhaseReport) { r.subject = subjectId; vPhaseReport.addElement(r); } + // This is for aero attacks as attack value. Does not apply if Aero Sanity is on if (!game.getOptions().booleanOption(OptionsConstants.ADVAERORULES_AERO_SANITY)) { if (!bMissed && amsEngaged && !isTbolt() && !ae.isCapitalFighter()) { @@ -874,7 +858,7 @@ public boolean handle(GamePhase phase, Vector vPhaseReport) { r.subject = subjectId; vPhaseReport.addElement(r); } else if (amsBayEngaged) { - //use this if AMS counterfire destroys some of the missiles + // use this if AMS counterfire destroys some of the missiles CounterAV = getCounterAV(); r = new Report(3354); r.indent(); @@ -885,12 +869,12 @@ public boolean handle(GamePhase phase, Vector vPhaseReport) { // Report any Point Defense bay action against standard missiles. } else if (pdBayEngaged && (originalAV <= 0)) { - //use this if PD counterfire destroys all the missiles + // use this if PD counterfire destroys all the missiles r = new Report(3355); r.subject = subjectId; vPhaseReport.addElement(r); } else if (pdBayEngaged) { - //use this if PD counterfire destroys some of the missiles + // use this if PD counterfire destroys some of the missiles r = new Report(3353); r.add(CounterAV); r.subject = subjectId; @@ -935,8 +919,7 @@ public boolean handle(GamePhase phase, Vector vPhaseReport) { // Compute.directBlowInfantryDamage nDamage = -wtype.getDamage(nRange) * Math.min(nCluster, hits); } - bldgAbsorbs = (int) Math.round(nDamage - * bldg.getInfDmgFromInside()); + bldgAbsorbs = (int) Math.round(nDamage * bldg.getInfDmgFromInside()); } else { // Used later to indicate a special report bldgAbsorbs = Integer.MIN_VALUE; diff --git a/megamek/src/megamek/common/weapons/Weapon.java b/megamek/src/megamek/common/weapons/Weapon.java index 64699269baa..e76dfe1ecda 100644 --- a/megamek/src/megamek/common/weapons/Weapon.java +++ b/megamek/src/megamek/common/weapons/Weapon.java @@ -13,13 +13,7 @@ */ package megamek.common.weapons; -import java.io.Serializable; - -import megamek.common.AmmoType; -import megamek.common.Game; -import megamek.common.TargetRoll; -import megamek.common.ToHitData; -import megamek.common.WeaponType; +import megamek.common.*; import megamek.common.actions.WeaponAttackAction; import megamek.common.annotations.Nullable; import megamek.common.options.GameOptions; @@ -28,6 +22,8 @@ import megamek.common.weapons.bayweapons.SubCapLaserBayWeapon; import megamek.server.GameManager; +import java.io.Serializable; + /** * A class representing a weapon. * @author Andrew Hunter diff --git a/megamek/src/megamek/common/weapons/WeaponHandler.java b/megamek/src/megamek/common/weapons/WeaponHandler.java index 7e8e983bafd..7849434ecde 100644 --- a/megamek/src/megamek/common/weapons/WeaponHandler.java +++ b/megamek/src/megamek/common/weapons/WeaponHandler.java @@ -40,7 +40,6 @@ * @author Andrew Hunter */ public class WeaponHandler implements AttackHandler, Serializable { - private static final long serialVersionUID = 7137408139594693559L; public ToHitData toHit; protected HitData hit; @@ -91,7 +90,7 @@ public class WeaponHandler implements AttackHandler, Serializable { protected boolean isStrafing = false; /** - * Boolean flag that determiens if this shot was the first one by a + * Boolean flag that determines if this shot was the first one by a * particular weapon in a strafing run. Used to ensure that heat is only * added once. */ @@ -400,10 +399,7 @@ public Entity getAttacker() { */ @Override public boolean cares(GamePhase phase) { - if (phase == GamePhase.FIRING) { - return true; - } - return false; + return phase.isFiring(); } /** @@ -428,21 +424,19 @@ private void writeObject(ObjectOutputStream out) throws IOException { out.defaultWriteObject(); } - private void readObject(ObjectInputStream in) throws IOException, - ClassNotFoundException { + private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException { in.defaultReadObject(); gameManager = (GameManager) Server.getServerInstance().getGameManager(); } /** - * @return a boolean value indicating wether or not this attack + * @return a boolean value indicating whether or not this attack * needs further calculating, like a missed shot hitting a building, * or an AMS only shooting down some missiles. */ - protected boolean handleSpecialMiss(Entity entityTarget, - boolean bldgDamagedOnMiss, Building bldg, - Vector vPhaseReport) { + protected boolean handleSpecialMiss(Entity entityTarget, boolean bldgDamagedOnMiss, + Building bldg, Vector vPhaseReport) { // Shots that miss an entity can set fires. // Buildings can't be accidentally ignited, // and some weapons can't ignite fires. @@ -1090,9 +1084,7 @@ public boolean handle(GamePhase phase, Vector returnedReports) { int nDamage; if ((target.getTargetType() == Targetable.TYPE_HEX_TAG) || (target.getTargetType() == Targetable.TYPE_BLDG_TAG)) { - - TagInfo info = new TagInfo(ae.getId(), - target.getTargetType(), target, false); + TagInfo info = new TagInfo(ae.getId(), target.getTargetType(), target, false); game.addTagInfo(info); ae.setSpotting(true); @@ -1116,12 +1108,10 @@ public boolean handle(GamePhase phase, Vector returnedReports) { } else if (target.getTargetType() == Targetable.TYPE_BUILDING) { // The building takes the full brunt of the attack. nDamage = nDamPerHit * hits; - handleBuildingDamage(vPhaseReport, bldg, nDamage, - target.getPosition()); + handleBuildingDamage(vPhaseReport, bldg, nDamage, target.getPosition()); hits = 0; } else if (entityTarget != null) { - handleEntityDamage(entityTarget, vPhaseReport, bldg, - hits, nCluster, bldgAbsorbs); + handleEntityDamage(entityTarget, vPhaseReport, bldg, hits, nCluster, bldgAbsorbs); gameManager.creditKill(entityTarget, ae); hits -= nCluster; firstHit = false; @@ -1133,7 +1123,6 @@ public boolean handle(GamePhase phase, Vector returnedReports) { } } // Handle the next cluster. } else { // We missed, but need to handle special miss cases - // When shooting at a non-infantry unit in a building and the // shot misses, the building is damaged instead, TW pg 171 if (bldgDamagedOnMiss) { @@ -1153,6 +1142,7 @@ public boolean handle(GamePhase phase, Vector returnedReports) { hits = 0; } } + if (game.getOptions().booleanOption(OptionsConstants.ADVCOMBAT_UAC_TWOROLLS) && ((wtype.getAmmoType() == AmmoType.T_AC_ULTRA) || (wtype .getAmmoType() == AmmoType.T_AC_ULTRA_THB)) @@ -1418,18 +1408,16 @@ protected void handlePartialCoverHit(Entity entityTarget, } else if (damageableCoverType == LosEffects.DAMAGABLE_COVER_BUILDING) { // Normal damage int nDamage = nDamPerHit * Math.min(nCluster, hits); - Vector buildingReport = gameManager.damageBuilding( - coverBuilding, nDamage, " blocks the shot and takes ", - coverLoc); + Vector buildingReport = gameManager.damageBuilding(coverBuilding, nDamage, + " blocks the shot and takes ", coverLoc); for (Report report : buildingReport) { report.subject = subjectId; report.indent(); } vPhaseReport.addAll(buildingReport); // Damage any infantry in the building. - Vector infantryReport = gameManager.damageInfantryIn( - coverBuilding, nDamage, coverLoc, - wtype.getInfantryDamageClass()); + Vector infantryReport = gameManager.damageInfantryIn(coverBuilding, nDamage, + coverLoc, wtype.getInfantryDamageClass()); for (Report report : infantryReport) { report.indent(2); } @@ -1545,13 +1533,11 @@ protected void handleEntityDamage(Entity entityTarget, hit.makeGlancingBlow(); } - vPhaseReport - .addAll(gameManager.damageEntity(entityTarget, hit, nDamage, - false, ae.getSwarmTargetId() == entityTarget - .getId() ? DamageType.IGNORE_PASSENGER - : damageType, false, false, throughFront, - underWater, nukeS2S)); - if (damageType.equals(DamageType.ANTI_TSM) && (target instanceof Mech) && entityTarget.antiTSMVulnerable()) { + vPhaseReport.addAll(gameManager.damageEntity(entityTarget, hit, nDamage, false, + ae.getSwarmTargetId() == entityTarget.getId() ? DamageType.IGNORE_PASSENGER : damageType, + false, false, throughFront, underWater, nukeS2S)); + if (damageType.equals(DamageType.ANTI_TSM) && (target instanceof Mech) + && entityTarget.antiTSMVulnerable()) { vPhaseReport.addAll(gameManager.doGreenSmokeDamage(entityTarget)); } // for salvo shots, report that the aimed location was hit after @@ -1594,13 +1580,13 @@ protected boolean unitStickingOutOfBuilding(Hex targetHex, Entity entityTarget) (entityTarget.getElevation() < targetHex.ceiling()) && (entityTarget.relHeight() >= targetHex.ceiling()); } - + /** * Worker function to (maybe) have a building absorb damage meant for the entity */ - protected int absorbBuildingDamage(int nDamage, Entity entityTarget, int bldgAbsorbs, - Vector vPhaseReport, Building bldg, boolean targetStickingOutOfBuilding) { - + protected int absorbBuildingDamage(int nDamage, Entity entityTarget, int bldgAbsorbs, + Vector vPhaseReport, Building bldg, + boolean targetStickingOutOfBuilding) { // if the building will absorb some damage and the target is actually // entirely inside the building: if ((bldgAbsorbs > 0) && !targetStickingOutOfBuilding) { @@ -1635,8 +1621,7 @@ protected int absorbBuildingDamage(int nDamage, Entity entityTarget, int bldgAbs return nDamage; } - protected void handleIgnitionDamage(Vector vPhaseReport, - Building bldg, int hits) { + protected void handleIgnitionDamage(Vector vPhaseReport, Building bldg, int hits) { if (!bSalvo) { // hits! Report r = new Report(2270); @@ -1652,13 +1637,12 @@ protected void handleIgnitionDamage(Vector vPhaseReport, } } - protected void handleClearDamage(Vector vPhaseReport, - Building bldg, int nDamage) { + protected void handleClearDamage(Vector vPhaseReport, Building bldg, int nDamage) { handleClearDamage(vPhaseReport, bldg, nDamage, true); } - protected void handleClearDamage(Vector vPhaseReport, - Building bldg, int nDamage, boolean hitReport) { + protected void handleClearDamage(Vector vPhaseReport, Building bldg, int nDamage, + boolean hitReport) { if (!bSalvo && hitReport) { // hits! Report r = new Report(2270); @@ -1679,14 +1663,11 @@ protected void handleClearDamage(Vector vPhaseReport, // a 5 or less // you do a normal ignition as though for intentional fires if ((bldg != null) - && gameManager.tryIgniteHex(target.getPosition(), subjectId, false, - false, - new TargetRoll(wtype.getFireTN(), wtype.getName()), 5, - vPhaseReport)) { + && gameManager.tryIgniteHex(target.getPosition(), subjectId, false, false, + new TargetRoll(wtype.getFireTN(), wtype.getName()), 5, vPhaseReport)) { return; } - Vector clearReports = gameManager.tryClearHex(target.getPosition(), - nDamage, subjectId); + Vector clearReports = gameManager.tryClearHex(target.getPosition(), nDamage, subjectId); if (!clearReports.isEmpty()) { vPhaseReport.lastElement().newlines = 0; } diff --git a/megamek/src/megamek/common/weapons/artillery/ArtilleryWeapon.java b/megamek/src/megamek/common/weapons/artillery/ArtilleryWeapon.java index cf5b7f6c59b..8e5fa43da85 100644 --- a/megamek/src/megamek/common/weapons/artillery/ArtilleryWeapon.java +++ b/megamek/src/megamek/common/weapons/artillery/ArtilleryWeapon.java @@ -17,13 +17,7 @@ import megamek.common.Mounted; import megamek.common.ToHitData; import megamek.common.actions.WeaponAttackAction; -import megamek.common.enums.GamePhase; -import megamek.common.weapons.AmmoWeapon; -import megamek.common.weapons.ArtilleryWeaponDirectFireHandler; -import megamek.common.weapons.ArtilleryWeaponDirectHomingHandler; -import megamek.common.weapons.ArtilleryWeaponIndirectFireHandler; -import megamek.common.weapons.ArtilleryWeaponIndirectHomingHandler; -import megamek.common.weapons.AttackHandler; +import megamek.common.weapons.*; import megamek.server.GameManager; /** @@ -55,11 +49,11 @@ protected AttackHandler getCorrectHandler(ToHitData toHit, .getEquipment(waa.getWeaponId()).getLinked(); if (ammo.isHomingAmmoInHomingMode()) { - if (game.getPhase() == GamePhase.FIRING) { + if (game.getPhase().isFiring()) { return new ArtilleryWeaponDirectHomingHandler(toHit, waa, game, manager); } return new ArtilleryWeaponIndirectHomingHandler(toHit, waa, game, manager); - } else if (game.getPhase() == GamePhase.FIRING) { + } else if (game.getPhase().isFiring()) { return new ArtilleryWeaponDirectFireHandler(toHit, waa, game, manager); } else { return new ArtilleryWeaponIndirectFireHandler(toHit, waa, game, manager); diff --git a/megamek/src/megamek/common/weapons/autocannons/ACWeapon.java b/megamek/src/megamek/common/weapons/autocannons/ACWeapon.java index 7fd1fa98aaa..484b0f5b69f 100644 --- a/megamek/src/megamek/common/weapons/autocannons/ACWeapon.java +++ b/megamek/src/megamek/common/weapons/autocannons/ACWeapon.java @@ -33,6 +33,7 @@ import megamek.common.weapons.RapidfireACWeaponHandler; import megamek.common.weapons.Weapon; import megamek.server.GameManager; +import megamek.server.Server; /** * N.B. This class is overridden for AC/2, AC/5, AC/10, AC/10, NOT ultras/LB/RAC. @@ -106,13 +107,13 @@ public int getDamage() { if ((dmg != 5) && (dmg != 2)) { return dmg; } - GameOptions options = getGameOptions(); - if (options == null) { - return dmg; - } - if (options.getOption(OptionsConstants.ADVCOMBAT_INCREASED_AC_DMG).booleanValue()) { + + if ((Server.getServerInstance() != null) + && Server.getServerInstance().getGame().getOptions() + .getOption(OptionsConstants.ADVCOMBAT_INCREASED_AC_DMG).booleanValue()) { dmg++; } + return dmg; } diff --git a/megamek/src/megamek/common/weapons/autocannons/CLImprovedAC2.java b/megamek/src/megamek/common/weapons/autocannons/CLImprovedAC2.java index aba8bf806f4..48f92983f47 100644 --- a/megamek/src/megamek/common/weapons/autocannons/CLImprovedAC2.java +++ b/megamek/src/megamek/common/weapons/autocannons/CLImprovedAC2.java @@ -43,7 +43,9 @@ public CLImprovedAC2() { criticals = 1; bv = 37; cost = 75000; - shortAV = 20; + shortAV = 2; + medAV = 2; + longAV = 2; maxRange = RANGE_LONG; explosionDamage = damage; ammoType = AmmoType.T_AC_IMP; diff --git a/megamek/src/megamek/common/weapons/battlearmor/CLAdvancedSRM1OS.java b/megamek/src/megamek/common/weapons/battlearmor/CLAdvancedSRM1OS.java index c69c35798a3..a93834fbba5 100644 --- a/megamek/src/megamek/common/weapons/battlearmor/CLAdvancedSRM1OS.java +++ b/megamek/src/megamek/common/weapons/battlearmor/CLAdvancedSRM1OS.java @@ -36,7 +36,7 @@ public CLAdvancedSRM1OS() { extremeRange = 16; bv = 3; flags = flags.or(F_NO_FIRES).or(F_BA_WEAPON).or(F_ONESHOT).andNot(F_MECH_WEAPON).andNot(F_TANK_WEAPON).andNot(F_AERO_WEAPON).andNot(F_PROTO_WEAPON); - tonnage = 0.04; + tonnage = 0.035; criticals = 3; cost = 7500; rulesRefs = "261, TM"; diff --git a/megamek/src/megamek/common/weapons/battlearmor/CLAdvancedSRM2OS.java b/megamek/src/megamek/common/weapons/battlearmor/CLAdvancedSRM2OS.java index e87d32b7412..9c9cb93cda0 100644 --- a/megamek/src/megamek/common/weapons/battlearmor/CLAdvancedSRM2OS.java +++ b/megamek/src/megamek/common/weapons/battlearmor/CLAdvancedSRM2OS.java @@ -36,7 +36,7 @@ public CLAdvancedSRM2OS() { extremeRange = 16; bv = 6; flags = flags.or(F_NO_FIRES).or(F_BA_WEAPON).or(F_ONESHOT).andNot(F_MECH_WEAPON).andNot(F_TANK_WEAPON).andNot(F_AERO_WEAPON).andNot(F_PROTO_WEAPON); - tonnage = .06; + tonnage = .07; criticals = 3; cost = 15000; rulesRefs = "261, TM"; diff --git a/megamek/src/megamek/common/weapons/battlearmor/CLAdvancedSRM3OS.java b/megamek/src/megamek/common/weapons/battlearmor/CLAdvancedSRM3OS.java index 9d68b7495d4..eb1178f7fb3 100644 --- a/megamek/src/megamek/common/weapons/battlearmor/CLAdvancedSRM3OS.java +++ b/megamek/src/megamek/common/weapons/battlearmor/CLAdvancedSRM3OS.java @@ -36,7 +36,7 @@ public CLAdvancedSRM3OS() { extremeRange = 16; bv = 9; flags = flags.or(F_NO_FIRES).or(F_BA_WEAPON).or(F_ONESHOT).andNot(F_MECH_WEAPON).andNot(F_TANK_WEAPON).andNot(F_AERO_WEAPON).andNot(F_PROTO_WEAPON); - tonnage = .80; + tonnage = .105; criticals = 4; cost = 22500; rulesRefs = "261, TM"; diff --git a/megamek/src/megamek/common/weapons/battlearmor/CLAdvancedSRM4OS.java b/megamek/src/megamek/common/weapons/battlearmor/CLAdvancedSRM4OS.java index 7ce48620702..c141e7af8fa 100644 --- a/megamek/src/megamek/common/weapons/battlearmor/CLAdvancedSRM4OS.java +++ b/megamek/src/megamek/common/weapons/battlearmor/CLAdvancedSRM4OS.java @@ -36,7 +36,7 @@ public CLAdvancedSRM4OS() { extremeRange = 16; bv = 12; flags = flags.or(F_NO_FIRES).or(F_BA_WEAPON).or(F_ONESHOT).andNot(F_MECH_WEAPON).andNot(F_TANK_WEAPON).andNot(F_AERO_WEAPON).andNot(F_PROTO_WEAPON); - tonnage = 0.100; + tonnage = 0.135; criticals = 4; cost = 30000; rulesRefs = "261, TM"; diff --git a/megamek/src/megamek/common/weapons/battlearmor/CLAdvancedSRM5OS.java b/megamek/src/megamek/common/weapons/battlearmor/CLAdvancedSRM5OS.java index ef629f321ff..bf01812a3e4 100644 --- a/megamek/src/megamek/common/weapons/battlearmor/CLAdvancedSRM5OS.java +++ b/megamek/src/megamek/common/weapons/battlearmor/CLAdvancedSRM5OS.java @@ -36,7 +36,7 @@ public CLAdvancedSRM5OS() { extremeRange = 16; bv = 15; flags = flags.or(F_NO_FIRES).or(F_BA_WEAPON).or(F_ONESHOT).andNot(F_MECH_WEAPON).andNot(F_TANK_WEAPON).andNot(F_AERO_WEAPON).andNot(F_PROTO_WEAPON); - tonnage = 0.120; + tonnage = 0.165; criticals = 5; cost = 37500; rulesRefs = "261, TM"; diff --git a/megamek/src/megamek/common/weapons/battlearmor/CLAdvancedSRM6OS.java b/megamek/src/megamek/common/weapons/battlearmor/CLAdvancedSRM6OS.java index bfc01a525bb..22c37f7cbbd 100644 --- a/megamek/src/megamek/common/weapons/battlearmor/CLAdvancedSRM6OS.java +++ b/megamek/src/megamek/common/weapons/battlearmor/CLAdvancedSRM6OS.java @@ -36,7 +36,7 @@ public CLAdvancedSRM6OS() { extremeRange = 16; bv = 18; flags = flags.or(F_NO_FIRES).or(F_BA_WEAPON).or(F_ONESHOT).andNot(F_MECH_WEAPON).andNot(F_TANK_WEAPON).andNot(F_AERO_WEAPON).andNot(F_PROTO_WEAPON); - tonnage = .140; + tonnage = .195; criticals = 5; cost = 45000; rulesRefs = "261, TM"; diff --git a/megamek/src/megamek/common/weapons/battlearmor/CLBAAPGaussRifle.java b/megamek/src/megamek/common/weapons/battlearmor/CLBAAPGaussRifle.java index 6d6ebb29ba6..618e0cbf8e1 100644 --- a/megamek/src/megamek/common/weapons/battlearmor/CLBAAPGaussRifle.java +++ b/megamek/src/megamek/common/weapons/battlearmor/CLBAAPGaussRifle.java @@ -35,7 +35,7 @@ public CLBAAPGaussRifle() { longRange = 9; extremeRange = 12; tonnage = 0.2; - criticals = 1; + criticals = 2; bv = 21; cost = 10000; shortAV = 3; diff --git a/megamek/src/megamek/common/weapons/battlearmor/CLBAMortarHeavy.java b/megamek/src/megamek/common/weapons/battlearmor/CLBAMortarHeavy.java index a6c278d168e..094c303ad27 100644 --- a/megamek/src/megamek/common/weapons/battlearmor/CLBAMortarHeavy.java +++ b/megamek/src/megamek/common/weapons/battlearmor/CLBAMortarHeavy.java @@ -14,7 +14,9 @@ package megamek.common.weapons.battlearmor; import megamek.common.AmmoType; +import megamek.common.Mounted; import megamek.common.WeaponType; +import megamek.common.alphaStrike.AlphaStrikeElement; import megamek.common.weapons.Weapon; /** @@ -61,4 +63,20 @@ public CLBAMortarHeavy() { .setPrototypeFactions(F_FS, F_LC) .setProductionFactions(F_LC); } -} + + @Override + public double getBattleForceDamage(int range, Mounted linked) { + if (range <= AlphaStrikeElement.SHORT_RANGE) { + return 0.249; + } else if (range <= AlphaStrikeElement.MEDIUM_RANGE) { + return 0.3; + } else { + return 0; + } + } + + @Override + public boolean isAlphaStrikeIndirectFire() { + return true; + } +} \ No newline at end of file diff --git a/megamek/src/megamek/common/weapons/battlearmor/CLBAMortarLight.java b/megamek/src/megamek/common/weapons/battlearmor/CLBAMortarLight.java index 22951b497c9..a49e82bb7e0 100644 --- a/megamek/src/megamek/common/weapons/battlearmor/CLBAMortarLight.java +++ b/megamek/src/megamek/common/weapons/battlearmor/CLBAMortarLight.java @@ -14,7 +14,9 @@ package megamek.common.weapons.battlearmor; import megamek.common.AmmoType; +import megamek.common.Mounted; import megamek.common.WeaponType; +import megamek.common.alphaStrike.AlphaStrikeElement; import megamek.common.weapons.Weapon; /** @@ -62,4 +64,14 @@ public CLBAMortarLight() { .setPrototypeFactions(F_FS, F_LC) .setProductionFactions(F_LC); } -} + + @Override + public double getBattleForceDamage(int range, Mounted linked) { + return (range <= AlphaStrikeElement.SHORT_RANGE) ? 0.276 : 0; + } + + @Override + public boolean isAlphaStrikeIndirectFire() { + return true; + } +} \ No newline at end of file diff --git a/megamek/src/megamek/common/weapons/battlearmor/ISBAMortarHeavy.java b/megamek/src/megamek/common/weapons/battlearmor/ISBAMortarHeavy.java index 2ace8cc92ae..e01ba4ea0cf 100644 --- a/megamek/src/megamek/common/weapons/battlearmor/ISBAMortarHeavy.java +++ b/megamek/src/megamek/common/weapons/battlearmor/ISBAMortarHeavy.java @@ -14,8 +14,10 @@ package megamek.common.weapons.battlearmor; import megamek.common.AmmoType; +import megamek.common.Mounted; import megamek.common.TechAdvancement; import megamek.common.WeaponType; +import megamek.common.alphaStrike.AlphaStrikeElement; import megamek.common.weapons.Weapon; /** @@ -55,4 +57,19 @@ public ISBAMortarHeavy() { techAdvancement.setAvailability(RATING_X, RATING_X, RATING_C, RATING_C); } -} + @Override + public double getBattleForceDamage(int range, Mounted linked) { + if (range <= AlphaStrikeElement.SHORT_RANGE) { + return 0.249; + } else if (range <= AlphaStrikeElement.MEDIUM_RANGE) { + return 0.3; + } else { + return 0; + } + } + + @Override + public boolean isAlphaStrikeIndirectFire() { + return true; + } +} \ No newline at end of file diff --git a/megamek/src/megamek/common/weapons/battlearmor/ISBAMortarLight.java b/megamek/src/megamek/common/weapons/battlearmor/ISBAMortarLight.java index b855f62fccb..dafc4b07a84 100644 --- a/megamek/src/megamek/common/weapons/battlearmor/ISBAMortarLight.java +++ b/megamek/src/megamek/common/weapons/battlearmor/ISBAMortarLight.java @@ -14,8 +14,10 @@ package megamek.common.weapons.battlearmor; import megamek.common.AmmoType; +import megamek.common.Mounted; import megamek.common.TechAdvancement; import megamek.common.WeaponType; +import megamek.common.alphaStrike.AlphaStrikeElement; import megamek.common.weapons.Weapon; /** @@ -53,4 +55,14 @@ public ISBAMortarLight() { techAdvancement.setTechRating(RATING_B); techAdvancement.setAvailability(RATING_X, RATING_X, RATING_C, RATING_C); } -} + + @Override + public double getBattleForceDamage(int range, Mounted linked) { + return (range <= AlphaStrikeElement.SHORT_RANGE) ? 0.276 : 0; + } + + @Override + public boolean isAlphaStrikeIndirectFire() { + return true; + } +} \ No newline at end of file diff --git a/megamek/src/megamek/common/weapons/bayweapons/ArtilleryBayWeapon.java b/megamek/src/megamek/common/weapons/bayweapons/ArtilleryBayWeapon.java index 189c82f8e40..108f3505e89 100644 --- a/megamek/src/megamek/common/weapons/bayweapons/ArtilleryBayWeapon.java +++ b/megamek/src/megamek/common/weapons/bayweapons/ArtilleryBayWeapon.java @@ -15,7 +15,6 @@ import megamek.common.*; import megamek.common.actions.WeaponAttackAction; -import megamek.common.enums.GamePhase; import megamek.common.weapons.*; import megamek.server.GameManager; @@ -70,11 +69,11 @@ protected AttackHandler getCorrectHandler(ToHitData toHit, break; } if (useHoming) { - if (game.getPhase() == GamePhase.FIRING) { + if (game.getPhase().isFiring()) { return new ArtilleryBayWeaponDirectHomingHandler(toHit, waa, game, manager); } return new ArtilleryBayWeaponIndirectHomingHandler(toHit, waa, game, manager); - } else if (game.getPhase() == GamePhase.FIRING) { + } else if (game.getPhase().isFiring()) { return new ArtilleryBayWeaponDirectFireHandler(toHit, waa, game, manager); } else { return new ArtilleryBayWeaponIndirectFireHandler(toHit, waa, game, manager); diff --git a/megamek/src/megamek/common/weapons/infantry/InfantryWeaponHandler.java b/megamek/src/megamek/common/weapons/infantry/InfantryWeaponHandler.java index 00b9a4562a2..a51836a8cb0 100644 --- a/megamek/src/megamek/common/weapons/infantry/InfantryWeaponHandler.java +++ b/megamek/src/megamek/common/weapons/infantry/InfantryWeaponHandler.java @@ -206,4 +206,24 @@ public static double calculateBaseDamage(Entity ae, Mounted weapon, WeaponType w return ((InfantryWeapon) wtype).getInfantryDamage(); } } + + @Override + protected void initHit(Entity entityTarget) { + if ((entityTarget instanceof BattleArmor) && ae.isConventionalInfantry()) { + // TacOps crits against BA do not happen for infantry weapon attacks + hit = ((BattleArmor) entityTarget).rollHitLocation(toHit.getSideTable(), + waa.getAimedLocation(), waa.getAimingMode(), true); + hit.setGeneralDamageType(generalDamageType); + hit.setCapital(wtype.isCapital()); + hit.setBoxCars(roll == 12); + hit.setCapMisCritMod(getCapMisMod()); + hit.setFirstHit(firstHit); + hit.setAttackerId(getAttackerId()); + if (weapon.isWeaponGroup()) { + hit.setSingleAV(attackValue); + } + } else { + super.initHit(entityTarget); + } + } } diff --git a/megamek/src/megamek/common/weapons/lasers/CLERPulseLaserSmall.java b/megamek/src/megamek/common/weapons/lasers/CLERPulseLaserSmall.java index 91371358419..b8c1981f44c 100644 --- a/megamek/src/megamek/common/weapons/lasers/CLERPulseLaserSmall.java +++ b/megamek/src/megamek/common/weapons/lasers/CLERPulseLaserSmall.java @@ -45,9 +45,8 @@ public CLERPulseLaserSmall() { waterExtremeRange = 4; tonnage = 1.5; criticals = 1; - shortAV = 7; - medAV = 7; - maxRange = RANGE_MED; + shortAV = 5; + maxRange = RANGE_SHORT; bv = 36; cost = 30000; flags = flags.or(F_BURST_FIRE); diff --git a/megamek/src/megamek/common/weapons/lasers/ISERLaserLarge.java b/megamek/src/megamek/common/weapons/lasers/ISERLaserLarge.java index 633065fdc40..d91af48a8d1 100644 --- a/megamek/src/megamek/common/weapons/lasers/ISERLaserLarge.java +++ b/megamek/src/megamek/common/weapons/lasers/ISERLaserLarge.java @@ -15,6 +15,7 @@ import megamek.common.options.GameOptions; import megamek.common.options.OptionsConstants; +import megamek.server.Server; /** * @author Andrew Hunter @@ -62,15 +63,16 @@ public ISERLaserLarge() { @Override public int getLongRange() { - GameOptions options = getGameOptions(); - if (options == null) { - return super.getLongRange(); - } else if (options.getOption(OptionsConstants.ADVCOMBAT_INCREASED_ISERLL_RANGE) == null) { + if (Server.getServerInstance() == null) { return super.getLongRange(); } - if (options.getOption(OptionsConstants.ADVCOMBAT_INCREASED_ISERLL_RANGE).booleanValue()) { + final GameOptions options = Server.getServerInstance().getGame().getOptions(); + if (options.getOption(OptionsConstants.ADVCOMBAT_INCREASED_ISERLL_RANGE) == null) { + return super.getLongRange(); + } else if (options.getOption(OptionsConstants.ADVCOMBAT_INCREASED_ISERLL_RANGE).booleanValue()) { return 21; + } else { + return super.getLongRange(); } - return super.getLongRange(); } } diff --git a/megamek/src/megamek/common/weapons/lasers/ISReengineeredLaserLarge.java b/megamek/src/megamek/common/weapons/lasers/ISReengineeredLaserLarge.java index 1563ee3c767..81cd379910f 100644 --- a/megamek/src/megamek/common/weapons/lasers/ISReengineeredLaserLarge.java +++ b/megamek/src/megamek/common/weapons/lasers/ISReengineeredLaserLarge.java @@ -54,10 +54,10 @@ public ISReengineeredLaserLarge() { .setUnofficial(false) .setTechRating(RATING_E) .setAvailability(RATING_X, RATING_X, RATING_X, RATING_D) - .setISAdvancement(DATE_NONE,3120, 3130,DATE_NONE, DATE_NONE) - .setISApproximate(false, true, false, false, false) + .setISAdvancement(3120, 3130,DATE_NONE,DATE_NONE, DATE_NONE) + .setISApproximate(true, false, false, false, false) .setPrototypeFactions(F_FS) .setProductionFactions(F_FS) - .setStaticTechLevel(SimpleTechLevel.STANDARD); + .setStaticTechLevel(SimpleTechLevel.ADVANCED); } } diff --git a/megamek/src/megamek/common/weapons/lasers/ISReengineeredLaserMedium.java b/megamek/src/megamek/common/weapons/lasers/ISReengineeredLaserMedium.java index 980b492b945..de907cfae51 100644 --- a/megamek/src/megamek/common/weapons/lasers/ISReengineeredLaserMedium.java +++ b/megamek/src/megamek/common/weapons/lasers/ISReengineeredLaserMedium.java @@ -53,10 +53,10 @@ public ISReengineeredLaserMedium() { .setUnofficial(false) .setTechRating(RATING_E) .setAvailability(RATING_X, RATING_X, RATING_X, RATING_D) - .setISAdvancement(DATE_NONE,3120, 3130,DATE_NONE, DATE_NONE) - .setISApproximate(false, true, false, false, false) + .setISAdvancement(3120, 3130,DATE_NONE,DATE_NONE, DATE_NONE) + .setISApproximate(true, false, false, false, false) .setPrototypeFactions(F_FS) .setProductionFactions(F_FS) - .setStaticTechLevel(SimpleTechLevel.STANDARD); + .setStaticTechLevel(SimpleTechLevel.ADVANCED); } } diff --git a/megamek/src/megamek/common/weapons/lasers/ISReengineeredLaserSmall.java b/megamek/src/megamek/common/weapons/lasers/ISReengineeredLaserSmall.java index 48a0b037010..4b7cb542fe7 100644 --- a/megamek/src/megamek/common/weapons/lasers/ISReengineeredLaserSmall.java +++ b/megamek/src/megamek/common/weapons/lasers/ISReengineeredLaserSmall.java @@ -52,11 +52,11 @@ public ISReengineeredLaserSmall() { .setUnofficial(false) .setTechRating(RATING_E) .setAvailability(RATING_X, RATING_X, RATING_X, RATING_D) - .setISAdvancement(DATE_NONE,3120, 3130,DATE_NONE, DATE_NONE) - .setISApproximate(false, true, false, false, false) + .setISAdvancement(3120, 3130,DATE_NONE,DATE_NONE, DATE_NONE) + .setISApproximate(true, false, false, false, false) .setPrototypeFactions(F_FS) .setProductionFactions(F_FS) - .setStaticTechLevel(SimpleTechLevel.STANDARD); + .setStaticTechLevel(SimpleTechLevel.ADVANCED); } @Override diff --git a/megamek/src/megamek/common/weapons/lasers/ISVariableSpeedPulseLaserLarge.java b/megamek/src/megamek/common/weapons/lasers/ISVariableSpeedPulseLaserLarge.java index 9accbfa903e..07eca70a913 100644 --- a/megamek/src/megamek/common/weapons/lasers/ISVariableSpeedPulseLaserLarge.java +++ b/megamek/src/megamek/common/weapons/lasers/ISVariableSpeedPulseLaserLarge.java @@ -54,10 +54,11 @@ public ISVariableSpeedPulseLaserLarge() { medAV = 7; maxRange = RANGE_MED; rulesRefs = "321, TO"; + //Nov 22 - CGL requested we move to Standard for Simple Tech Level techAdvancement.setTechBase(TECH_BASE_IS).setTechRating(RATING_E) .setAvailability(RATING_X, RATING_X, RATING_E, RATING_D) .setISAdvancement(3070, 3072, 3080).setPrototypeFactions(F_FW,F_WB) - .setProductionFactions(F_FW,F_WB).setStaticTechLevel(SimpleTechLevel.ADVANCED); + .setProductionFactions(F_FW,F_WB).setStaticTechLevel(SimpleTechLevel.STANDARD); } @Override diff --git a/megamek/src/megamek/common/weapons/lasers/ISVariableSpeedPulseLaserMedium.java b/megamek/src/megamek/common/weapons/lasers/ISVariableSpeedPulseLaserMedium.java index b41068d4354..1577ce0f29b 100644 --- a/megamek/src/megamek/common/weapons/lasers/ISVariableSpeedPulseLaserMedium.java +++ b/megamek/src/megamek/common/weapons/lasers/ISVariableSpeedPulseLaserMedium.java @@ -52,10 +52,11 @@ public ISVariableSpeedPulseLaserMedium() { shortAV = 7; maxRange = RANGE_SHORT; rulesRefs = "321, TO"; + //Nov 22 - CGL requested we move to Standard for Simple Tech Level techAdvancement.setTechBase(TECH_BASE_IS).setTechRating(RATING_E) .setAvailability(RATING_X, RATING_X, RATING_E, RATING_D) .setISAdvancement(3070, 3072, 3080).setPrototypeFactions(F_FW, F_WB) - .setProductionFactions(F_FW, F_WB).setStaticTechLevel(SimpleTechLevel.ADVANCED); + .setProductionFactions(F_FW, F_WB).setStaticTechLevel(SimpleTechLevel.STANDARD); } @Override diff --git a/megamek/src/megamek/common/weapons/lasers/ISVariableSpeedPulseLaserSmall.java b/megamek/src/megamek/common/weapons/lasers/ISVariableSpeedPulseLaserSmall.java index 68537e95515..c22f7c43933 100644 --- a/megamek/src/megamek/common/weapons/lasers/ISVariableSpeedPulseLaserSmall.java +++ b/megamek/src/megamek/common/weapons/lasers/ISVariableSpeedPulseLaserSmall.java @@ -53,10 +53,11 @@ public ISVariableSpeedPulseLaserSmall() { shortAV = 4; maxRange = RANGE_SHORT; rulesRefs = "321, TO"; + //Nov 22 - CGL requested we move to Standard for Simple Tech Level techAdvancement.setTechBase(TECH_BASE_IS).setTechRating(RATING_E) .setAvailability(RATING_X, RATING_X, RATING_E, RATING_D) .setISAdvancement(3070, 3072, 3080).setPrototypeFactions(F_FW, F_WB) - .setProductionFactions(F_FW, F_WB).setStaticTechLevel(SimpleTechLevel.ADVANCED); + .setProductionFactions(F_FW, F_WB).setStaticTechLevel(SimpleTechLevel.STANDARD); } @Override diff --git a/megamek/src/megamek/common/weapons/missiles/ISThunderBolt10.java b/megamek/src/megamek/common/weapons/missiles/ISThunderBolt10.java index e3edb462dbe..fd1ebf4b6e9 100644 --- a/megamek/src/megamek/common/weapons/missiles/ISThunderBolt10.java +++ b/megamek/src/megamek/common/weapons/missiles/ISThunderBolt10.java @@ -19,24 +19,12 @@ */ package megamek.common.weapons.missiles; -import megamek.common.AmmoType; -import megamek.common.alphaStrike.AlphaStrikeElement; -import megamek.common.Mounted; -import megamek.common.SimpleTechLevel; - /** * @author Sebastian Brocks */ -public class ISThunderBolt10 extends ThunderBoltWeapon { - - /** - * - */ +public class ISThunderBolt10 extends Thunderbolt10Weapon { private static final long serialVersionUID = 6781882739979127656L; - /** - * - */ public ISThunderBolt10() { super(); name = "Thunderbolt 10"; @@ -45,43 +33,8 @@ public ISThunderBolt10() { addLookupName("ISThunderbolt10"); addLookupName("IS Thunderbolt 10"); addLookupName("ISTBolt10"); - ammoType = AmmoType.T_TBOLT_10; - heat = 5; - minimumRange = 5; - shortRange = 6; - mediumRange = 12; - longRange = 18; - extremeRange = 24; - shortAV = 10; - medAV = 10; - maxRange = RANGE_MED; - tonnage = 7.0; - criticals = 2; + tonnage = 7; bv = 127; cost = 175000; - flags = flags.or(F_LARGEMISSILE); - this.missileArmor = 10; - rulesRefs = "347, TO"; - techAdvancement.setTechBase(TECH_BASE_IS) - .setIntroLevel(false) - .setUnofficial(false) - .setTechRating(RATING_E) - .setAvailability(RATING_X, RATING_X, RATING_F, RATING_E) - .setISAdvancement(3052, 3072, 3081, DATE_NONE, DATE_NONE) - .setISApproximate(false, false, false, false, false) - .setPrototypeFactions(F_FS) - .setProductionFactions(F_FS, F_LC) - .setStaticTechLevel(SimpleTechLevel.STANDARD); - } - - @Override - public double getBattleForceDamage(int range, Mounted fcs) { - if (range == AlphaStrikeElement.SHORT_RANGE) { - return 0.58; - } else if (range <= AlphaStrikeElement.LONG_RANGE) { - return 1; - } else { - return 0; - } } -} +} \ No newline at end of file diff --git a/megamek/src/megamek/common/weapons/missiles/ISThunderBolt15.java b/megamek/src/megamek/common/weapons/missiles/ISThunderBolt15.java index 450ca8a711b..8af422f3125 100644 --- a/megamek/src/megamek/common/weapons/missiles/ISThunderBolt15.java +++ b/megamek/src/megamek/common/weapons/missiles/ISThunderBolt15.java @@ -19,15 +19,10 @@ */ package megamek.common.weapons.missiles; -import megamek.common.AmmoType; -import megamek.common.alphaStrike.AlphaStrikeElement; -import megamek.common.Mounted; -import megamek.common.SimpleTechLevel; - /** * @author Sebastian Brocks */ -public class ISThunderBolt15 extends ThunderBoltWeapon { +public class ISThunderBolt15 extends Thunderbolt15Weapon { private static final long serialVersionUID = -5466726857144417393L; public ISThunderBolt15() { @@ -38,45 +33,8 @@ public ISThunderBolt15() { addLookupName("ISThunderbolt15"); addLookupName("IS Thunderbolt 15"); addLookupName("ISTBolt15"); - ammoType = AmmoType.T_TBOLT_15; - heat = 7; - minimumRange = 5; - shortRange = 6; - mediumRange = 12; - longRange = 18; - extremeRange = 24; - shortAV = 15; - medAV = 15; - maxRange = RANGE_MED; tonnage = 11.0; - criticals = 3; bv = 229; cost = 325000; - flags = flags.or(F_LARGEMISSILE); - this.missileArmor = 15; - rulesRefs = "347, TO"; - techAdvancement.setTechBase(TECH_BASE_IS) - .setIntroLevel(false) - .setUnofficial(false) - .setTechRating(RATING_E) - .setAvailability(RATING_X, RATING_X, RATING_F, RATING_E) - .setISAdvancement(3052, 3072, 3081, DATE_NONE, DATE_NONE) - .setISApproximate(false, false, false, false, false) - .setPrototypeFactions(F_FS) - .setProductionFactions(F_FS, F_LC) - .setStaticTechLevel(SimpleTechLevel.STANDARD); - } - - @Override - public double getBattleForceDamage(int range, Mounted fcs) { - if (range == AlphaStrikeElement.SHORT_RANGE) { - return 0.87; - } else if (range == AlphaStrikeElement.MEDIUM_RANGE) { - return 1.5; - } else if (range == AlphaStrikeElement.LONG_RANGE) { - return 1.5; - } else { - return 0; - } } -} +} \ No newline at end of file diff --git a/megamek/src/megamek/common/weapons/missiles/ISThunderBolt20.java b/megamek/src/megamek/common/weapons/missiles/ISThunderBolt20.java index 813822ff0df..19f5069db6c 100644 --- a/megamek/src/megamek/common/weapons/missiles/ISThunderBolt20.java +++ b/megamek/src/megamek/common/weapons/missiles/ISThunderBolt20.java @@ -19,15 +19,10 @@ */ package megamek.common.weapons.missiles; -import megamek.common.AmmoType; -import megamek.common.SimpleTechLevel; -import megamek.common.alphaStrike.AlphaStrikeElement; -import megamek.common.Mounted; - /** * @author Sebastian Brocks */ -public class ISThunderBolt20 extends ThunderBoltWeapon { +public class ISThunderBolt20 extends Thunderbolt20Weapon { private static final long serialVersionUID = -6976091682813292840L; public ISThunderBolt20() { @@ -38,45 +33,8 @@ public ISThunderBolt20() { addLookupName("ISThunderbolt20"); addLookupName("ISTBolt20"); addLookupName("IS Thunderbolt 20"); - ammoType = AmmoType.T_TBOLT_20; - heat = 8; - minimumRange = 5; - shortRange = 6; - mediumRange = 12; - longRange = 18; - extremeRange = 24; - shortAV = 20; - medAV = 20; - maxRange = RANGE_MED; - tonnage = 15.0; - criticals = 5; + tonnage = 15; bv = 305; cost = 450000; - flags = flags.or(F_LARGEMISSILE); - this.missileArmor = 20; - rulesRefs = "347, TO"; - techAdvancement.setTechBase(TECH_BASE_IS) - .setIntroLevel(false) - .setUnofficial(false) - .setTechRating(RATING_E) - .setAvailability(RATING_X, RATING_X, RATING_F, RATING_E) - .setISAdvancement(3052, 3072, 3081, DATE_NONE, DATE_NONE) - .setISApproximate(false, false, false, false, false) - .setPrototypeFactions(F_FS) - .setProductionFactions(F_FS, F_LC) - .setStaticTechLevel(SimpleTechLevel.STANDARD); - } - - @Override - public double getBattleForceDamage(int range, Mounted fcs) { - if (range == AlphaStrikeElement.SHORT_RANGE) { - return 1.16; - } else if (range == AlphaStrikeElement.MEDIUM_RANGE) { - return 2; - } else if (range == AlphaStrikeElement.LONG_RANGE) { - return 2; - } else { - return 0; - } } -} +} \ No newline at end of file diff --git a/megamek/src/megamek/common/weapons/missiles/ISThunderBolt5.java b/megamek/src/megamek/common/weapons/missiles/ISThunderBolt5.java index 56a66026eb6..6062a662ffd 100644 --- a/megamek/src/megamek/common/weapons/missiles/ISThunderBolt5.java +++ b/megamek/src/megamek/common/weapons/missiles/ISThunderBolt5.java @@ -19,15 +19,10 @@ */ package megamek.common.weapons.missiles; -import megamek.common.AmmoType; -import megamek.common.alphaStrike.AlphaStrikeElement; -import megamek.common.Mounted; -import megamek.common.SimpleTechLevel; - /** * @author Sebastian Brocks */ -public class ISThunderBolt5 extends ThunderBoltWeapon { +public class ISThunderBolt5 extends Thunderbolt5Weapon { private static final long serialVersionUID = 5295837076559643763L; public ISThunderBolt5() { @@ -37,47 +32,8 @@ public ISThunderBolt5() { addLookupName("IS Thunderbolt-5"); addLookupName("ISThunderbolt5"); addLookupName("IS Thunderbolt 5"); - sortingName = "Thunderbolt 05"; - ammoType = AmmoType.T_TBOLT_5; - heat = 3; - minimumRange = 5; - shortRange = 6; - mediumRange = 12; - longRange = 18; - extremeRange = 24; - shortAV = 5; - medAV = 5; - maxRange = RANGE_MED; tonnage = 3.0; - criticals = 1; bv = 64; cost = 50000; - flags = flags.or(F_LARGEMISSILE); - this.missileArmor = 5; - rulesRefs = "347, TO"; - // Tech Progression tweaked to combine IntOps with TRO Prototypes/3145 NTNU RS - techAdvancement.setTechBase(TECH_BASE_IS) - .setIntroLevel(false) - .setUnofficial(false) - .setTechRating(RATING_E) - .setAvailability(RATING_X, RATING_X, RATING_F, RATING_E) - .setISAdvancement(3052, 3072, 3081, DATE_NONE, DATE_NONE) - .setISApproximate(false, false, false, false, false) - .setPrototypeFactions(F_FS) - .setProductionFactions(F_FS, F_LC) - .setStaticTechLevel(SimpleTechLevel.STANDARD); - } - - @Override - public double getBattleForceDamage(int range, Mounted fcs) { - if (range == AlphaStrikeElement.SHORT_RANGE) { - return 0.29; - } else if (range == AlphaStrikeElement.MEDIUM_RANGE) { - return 0.5; - } else if (range == AlphaStrikeElement.LONG_RANGE) { - return 0.5; - } else { - return 0; - } } -} +} \ No newline at end of file diff --git a/megamek/src/megamek/common/weapons/missiles/ISThunderbolt10IOS.java b/megamek/src/megamek/common/weapons/missiles/ISThunderbolt10IOS.java new file mode 100644 index 00000000000..afe390060c9 --- /dev/null +++ b/megamek/src/megamek/common/weapons/missiles/ISThunderbolt10IOS.java @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2022 - The MegaMek Team. All Rights Reserved. + * + * This file is part of MegaMek. + * + * MegaMek 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 3 of the License, or + * (at your option) any later version. + * + * MegaMek 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. + * + * You should have received a copy of the GNU General Public License + * along with MegaMek. If not, see . + */ +package megamek.common.weapons.missiles; + +/** + * The Improved One-Shot Thunderbolt 10 + * @author Simon (Juliez) + */ +public class ISThunderbolt10IOS extends Thunderbolt10Weapon { + + public ISThunderbolt10IOS() { + super(); + name = "Thunderbolt 10 (I-OS)"; + setInternalName(name); + addLookupName("IS IOS Thunderbolt-10"); + addLookupName("ISThunderbolt10 (IOS)"); + addLookupName("IS Thunderbolt 10 (IOS)"); + addLookupName("ISTBolt10IOS"); + tonnage = 6.5; + bv = 25; + cost = 140000; + flags = flags.or(F_ONESHOT); + techAdvancement.setTechRating(RATING_B) + .setISAdvancement(3056, 3081, 3085, DATE_NONE, DATE_NONE) + .setPrototypeFactions(F_DC) + .setProductionFactions(F_DC) + .setISApproximate(false, true, false, false, false); + } +} \ No newline at end of file diff --git a/megamek/src/megamek/common/weapons/missiles/ISThunderbolt10OS.java b/megamek/src/megamek/common/weapons/missiles/ISThunderbolt10OS.java new file mode 100644 index 00000000000..3ec44443ea3 --- /dev/null +++ b/megamek/src/megamek/common/weapons/missiles/ISThunderbolt10OS.java @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2022 - The MegaMek Team. All Rights Reserved. + * + * This file is part of MegaMek. + * + * MegaMek 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 3 of the License, or + * (at your option) any later version. + * + * MegaMek 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. + * + * You should have received a copy of the GNU General Public License + * along with MegaMek. If not, see . + */ +package megamek.common.weapons.missiles; + +/** + * The One-Shot Thunderbolt 10 + * @author Simon (Juliez) + */ +public class ISThunderbolt10OS extends Thunderbolt10Weapon { + + public ISThunderbolt10OS() { + super(); + name = "Thunderbolt 10 (OS)"; + setInternalName(name); + addLookupName("IS OS Thunderbolt-10"); + addLookupName("ISThunderbolt10 (OS)"); + addLookupName("IS Thunderbolt 10 (OS)"); + addLookupName("ISTBolt10OS"); + tonnage = 7.5; + bv = 25; + cost = 87500; + flags = flags.or(F_ONESHOT); + } +} \ No newline at end of file diff --git a/megamek/src/megamek/common/weapons/missiles/ISThunderbolt15IOS.java b/megamek/src/megamek/common/weapons/missiles/ISThunderbolt15IOS.java new file mode 100644 index 00000000000..3659c128b5a --- /dev/null +++ b/megamek/src/megamek/common/weapons/missiles/ISThunderbolt15IOS.java @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2022 - The MegaMek Team. All Rights Reserved. + * + * This file is part of MegaMek. + * + * MegaMek 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 3 of the License, or + * (at your option) any later version. + * + * MegaMek 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. + * + * You should have received a copy of the GNU General Public License + * along with MegaMek. If not, see . + */ +package megamek.common.weapons.missiles; + +/** + * The Improved One-Shot Thunderbolt 15 + * @author Simon (Juliez) + */ +public class ISThunderbolt15IOS extends Thunderbolt15Weapon { + + public ISThunderbolt15IOS() { + super(); + name = "Thunderbolt 15 (I-OS)"; + setInternalName(name); + addLookupName("IS IOS Thunderbolt-15"); + addLookupName("ISThunderbolt15 (IOS)"); + addLookupName("IS Thunderbolt 15 (IOS)"); + addLookupName("ISTBolt15IOS"); + tonnage = 10.5; + bv = 46; + cost = 260000; + flags = flags.or(F_ONESHOT); + techAdvancement.setTechRating(RATING_B) + .setISAdvancement(3056, 3081, 3085, DATE_NONE, DATE_NONE) + .setPrototypeFactions(F_DC) + .setProductionFactions(F_DC) + .setISApproximate(false, true, false, false, false); + } +} diff --git a/megamek/src/megamek/common/weapons/missiles/ISThunderbolt15OS.java b/megamek/src/megamek/common/weapons/missiles/ISThunderbolt15OS.java new file mode 100644 index 00000000000..39e40731999 --- /dev/null +++ b/megamek/src/megamek/common/weapons/missiles/ISThunderbolt15OS.java @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2022 - The MegaMek Team. All Rights Reserved. + * + * This file is part of MegaMek. + * + * MegaMek 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 3 of the License, or + * (at your option) any later version. + * + * MegaMek 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. + * + * You should have received a copy of the GNU General Public License + * along with MegaMek. If not, see . + */ +package megamek.common.weapons.missiles; + +/** + * The One-Shot Thunderbolt 15 + * @author Simon (Juliez) + */ +public class ISThunderbolt15OS extends Thunderbolt15Weapon { + + public ISThunderbolt15OS() { + super(); + name = "Thunderbolt 15 (OS)"; + setInternalName(name); + addLookupName("IS OS Thunderbolt-15"); + addLookupName("ISThunderbolt15 (OS)"); + addLookupName("IS Thunderbolt 15 (OS)"); + addLookupName("ISTBolt15OS"); + tonnage = 11.5; + bv = 46; + cost = 162500; + flags = flags.or(F_ONESHOT); + } +} diff --git a/megamek/src/megamek/common/weapons/missiles/ISThunderbolt20IOS.java b/megamek/src/megamek/common/weapons/missiles/ISThunderbolt20IOS.java new file mode 100644 index 00000000000..bf6a702e0c5 --- /dev/null +++ b/megamek/src/megamek/common/weapons/missiles/ISThunderbolt20IOS.java @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2022 - The MegaMek Team. All Rights Reserved. + * + * This file is part of MegaMek. + * + * MegaMek 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 3 of the License, or + * (at your option) any later version. + * + * MegaMek 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. + * + * You should have received a copy of the GNU General Public License + * along with MegaMek. If not, see . + */ +package megamek.common.weapons.missiles; + +/** + * The Improved One-Shot Thunderbolt 20 + * @author Simon (Juliez) + */ +public class ISThunderbolt20IOS extends Thunderbolt20Weapon { + + public ISThunderbolt20IOS() { + super(); + name = "Thunderbolt 20 (I-OS)"; + setInternalName(name); + addLookupName("IS IOS Thunderbolt-20"); + addLookupName("ISThunderbolt20 (IOS)"); + addLookupName("ISTBolt20IOS"); + addLookupName("IS Thunderbolt 20 (IOS)"); + tonnage = 14.5; + bv = 61; + cost = 360000; + flags = flags.or(F_ONESHOT); + techAdvancement.setTechRating(RATING_B) + .setISAdvancement(3056, 3081, 3085, DATE_NONE, DATE_NONE) + .setPrototypeFactions(F_DC) + .setProductionFactions(F_DC) + .setISApproximate(false, true, false, false, false); + } +} \ No newline at end of file diff --git a/megamek/src/megamek/common/weapons/missiles/ISThunderbolt20OS.java b/megamek/src/megamek/common/weapons/missiles/ISThunderbolt20OS.java new file mode 100644 index 00000000000..87d113e202e --- /dev/null +++ b/megamek/src/megamek/common/weapons/missiles/ISThunderbolt20OS.java @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2022 - The MegaMek Team. All Rights Reserved. + * + * This file is part of MegaMek. + * + * MegaMek 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 3 of the License, or + * (at your option) any later version. + * + * MegaMek 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. + * + * You should have received a copy of the GNU General Public License + * along with MegaMek. If not, see . + */ +package megamek.common.weapons.missiles; + +/** + * The One-Shot Thunderbolt 20 + * @author Simon (Juliez) + */ +public class ISThunderbolt20OS extends Thunderbolt20Weapon { + + public ISThunderbolt20OS() { + super(); + name = "Thunderbolt 20 (OS)"; + setInternalName(name); + addLookupName("IS OS Thunderbolt-20"); + addLookupName("ISThunderbolt20 (OS)"); + addLookupName("ISTBolt20OS"); + addLookupName("IS Thunderbolt 20 (OS)"); + tonnage = 15.5; + bv = 61; + cost = 225000; + flags = flags.or(F_ONESHOT); + } +} diff --git a/megamek/src/megamek/common/weapons/missiles/ISThunderbolt5IOS.java b/megamek/src/megamek/common/weapons/missiles/ISThunderbolt5IOS.java new file mode 100644 index 00000000000..936ae03a8b3 --- /dev/null +++ b/megamek/src/megamek/common/weapons/missiles/ISThunderbolt5IOS.java @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2022 - The MegaMek Team. All Rights Reserved. + * + * This file is part of MegaMek. + * + * MegaMek 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 3 of the License, or + * (at your option) any later version. + * + * MegaMek 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. + * + * You should have received a copy of the GNU General Public License + * along with MegaMek. If not, see . + */ +package megamek.common.weapons.missiles; + +/** + * The Improved One-Shot Thunderbolt 5 + * @author Simon (Juliez) + */ +public class ISThunderbolt5IOS extends Thunderbolt5Weapon { + + public ISThunderbolt5IOS() { + super(); + name = "Thunderbolt 5 (I-OS)"; + setInternalName(name); + addLookupName("IS IOS Thunderbolt-5"); + addLookupName("ISThunderbolt5 (IOS)"); + addLookupName("IS Thunderbolt 5 (IOS)"); + tonnage = 2.5; + bv = 13; + cost = 40000; + flags = flags.or(F_ONESHOT); + techAdvancement.setTechRating(RATING_B) + .setISAdvancement(3056, 3081, 3085, DATE_NONE, DATE_NONE) + .setPrototypeFactions(F_DC) + .setProductionFactions(F_DC) + .setISApproximate(false, true, false, false, false); + } +} \ No newline at end of file diff --git a/megamek/src/megamek/common/weapons/missiles/ISThunderbolt5OS.java b/megamek/src/megamek/common/weapons/missiles/ISThunderbolt5OS.java new file mode 100644 index 00000000000..f16f09e454b --- /dev/null +++ b/megamek/src/megamek/common/weapons/missiles/ISThunderbolt5OS.java @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2022 - The MegaMek Team. All Rights Reserved. + * + * This file is part of MegaMek. + * + * MegaMek 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 3 of the License, or + * (at your option) any later version. + * + * MegaMek 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. + * + * You should have received a copy of the GNU General Public License + * along with MegaMek. If not, see . + */ +package megamek.common.weapons.missiles; + +/** + * The One-Shot Thunderbolt 5 + * @author Simon (Juliez) + */ +public class ISThunderbolt5OS extends Thunderbolt5Weapon { + + public ISThunderbolt5OS() { + super(); + name = "Thunderbolt 5 (OS)"; + setInternalName(name); + addLookupName("IS OS Thunderbolt-5"); + addLookupName("ISThunderbolt5 (OS)"); + addLookupName("IS Thunderbolt 5 (OS)"); + tonnage = 3.5; + bv = 13; + cost = 25000; + flags = flags.or(F_ONESHOT); + } +} \ No newline at end of file diff --git a/megamek/src/megamek/common/weapons/missiles/ThunderBoltWeapon.java b/megamek/src/megamek/common/weapons/missiles/ThunderBoltWeapon.java index a739092c2d2..a2b128390fd 100644 --- a/megamek/src/megamek/common/weapons/missiles/ThunderBoltWeapon.java +++ b/megamek/src/megamek/common/weapons/missiles/ThunderBoltWeapon.java @@ -1,20 +1,26 @@ -/** - * MegaMek - Copyright (C) 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. +/* + * Copyright (c) 2005 - Ben Mazur (bmazur@sev.org) + * Copyright (c) 2022 - The MegaMek Team. All Rights Reserved. + * + * This file is part of MegaMek. + * + * MegaMek 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 3 of the License, or + * (at your option) any later version. + * + * MegaMek 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. + * + * You should have received a copy of the GNU General Public License + * along with MegaMek. If not, see . */ package megamek.common.weapons.missiles; -import megamek.common.alphaStrike.AlphaStrikeElement; import megamek.common.Game; +import megamek.common.SimpleTechLevel; import megamek.common.ToHitData; import megamek.common.actions.WeaponAttackAction; import megamek.common.options.GameOptions; @@ -27,46 +33,38 @@ * @author Sebastian Brocks */ public abstract class ThunderBoltWeapon extends MissileWeapon { - - /** - * - */ private static final long serialVersionUID = 3496376576886743383L; - /** - * - */ public ThunderBoltWeapon() { super(); - this.rackSize = 1; + rackSize = 1; + minimumRange = 5; + shortRange = 6; + mediumRange = 12; + longRange = 18; + extremeRange = 24; + maxRange = RANGE_MED; + flags = flags.or(F_LARGEMISSILE); atClass = CLASS_THUNDERBOLT; + rulesRefs = "159, TO:AUE"; + techAdvancement.setTechBase(TECH_BASE_IS) + .setIntroLevel(false) + .setUnofficial(false) + .setTechRating(RATING_E) + .setAvailability(RATING_X, RATING_X, RATING_F, RATING_E) + .setISAdvancement(3052, 3072, 3081, DATE_NONE, DATE_NONE) + .setISApproximate(false, false, false, false, false) + .setPrototypeFactions(F_FS) + .setProductionFactions(F_FS, F_LC) + .setStaticTechLevel(SimpleTechLevel.STANDARD); } - /* - * (non-Javadoc) - * - * @see - * megamek.common.weapons.Weapon#getCorrectHandler(megamek.common.ToHitData, - * megamek.common.actions.WeaponAttackAction, megamek.common.Game) - */ @Override protected AttackHandler getCorrectHandler(ToHitData toHit, WeaponAttackAction waa, Game game, GameManager manager) { return new ThunderBoltWeaponHandler(toHit, waa, game, manager); } - @Override - public double getBattleForceDamage(int range) { - double damage = 0; - if (range <= getLongRange()) { - damage = getRackSize(); - if ((range == AlphaStrikeElement.SHORT_RANGE) && (getMinimumRange() > 0)) { - damage = adjustBattleForceDamageForMinRange(damage); - } - } - return damage / 10.0; - } - @Override public boolean hasIndirectFire() { return true; @@ -85,4 +83,4 @@ public void adaptToGameOptions(GameOptions gOp) { removeMode("Indirect"); } } -} +} \ No newline at end of file diff --git a/megamek/src/megamek/common/weapons/missiles/Thunderbolt10Weapon.java b/megamek/src/megamek/common/weapons/missiles/Thunderbolt10Weapon.java new file mode 100644 index 00000000000..9a31cc122c6 --- /dev/null +++ b/megamek/src/megamek/common/weapons/missiles/Thunderbolt10Weapon.java @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2022 - The MegaMek Team. All Rights Reserved. + * + * This file is part of MegaMek. + * + * MegaMek 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 3 of the License, or + * (at your option) any later version. + * + * MegaMek 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. + * + * You should have received a copy of the GNU General Public License + * along with MegaMek. If not, see . + */ +package megamek.common.weapons.missiles; + +import megamek.common.AmmoType; +import megamek.common.Mounted; +import megamek.common.SimpleTechLevel; +import megamek.common.alphaStrike.AlphaStrikeElement; + +public abstract class Thunderbolt10Weapon extends ThunderBoltWeapon { + + public Thunderbolt10Weapon() { + super(); + ammoType = AmmoType.T_TBOLT_10; + heat = 5; + shortAV = 10; + medAV = 10; + criticals = 2; + missileArmor = 10; + } + + @Override + public double getBattleForceDamage(int range, Mounted fcs) { + if (range == AlphaStrikeElement.SHORT_RANGE) { + return 0.58; + } else if (range <= AlphaStrikeElement.LONG_RANGE) { + return 1; + } else { + return 0; + } + } + + @Override + public String getSortingName() { + String oneShotTag = hasFlag(F_ONESHOT) ? "OS" : ""; + if (name.contains("I-OS")) { + oneShotTag = "XIOS"; + } + return "Thunderbolt-" + oneShotTag + "10"; + } +} diff --git a/megamek/src/megamek/common/weapons/missiles/Thunderbolt15Weapon.java b/megamek/src/megamek/common/weapons/missiles/Thunderbolt15Weapon.java new file mode 100644 index 00000000000..febe189d173 --- /dev/null +++ b/megamek/src/megamek/common/weapons/missiles/Thunderbolt15Weapon.java @@ -0,0 +1,59 @@ +/* + * Copyright (c) 2022 - The MegaMek Team. All Rights Reserved. + * + * This file is part of MegaMek. + * + * MegaMek 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 3 of the License, or + * (at your option) any later version. + * + * MegaMek 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. + * + * You should have received a copy of the GNU General Public License + * along with MegaMek. If not, see . + */ +package megamek.common.weapons.missiles; + +import megamek.common.AmmoType; +import megamek.common.Mounted; +import megamek.common.SimpleTechLevel; +import megamek.common.alphaStrike.AlphaStrikeElement; + +public abstract class Thunderbolt15Weapon extends ThunderBoltWeapon { + + public Thunderbolt15Weapon() { + super(); + ammoType = AmmoType.T_TBOLT_15; + heat = 7; + shortAV = 15; + medAV = 15; + criticals = 3; + missileArmor = 15; + } + + @Override + public double getBattleForceDamage(int range, Mounted fcs) { + if (range == AlphaStrikeElement.SHORT_RANGE) { + return 0.87; + } else if (range == AlphaStrikeElement.MEDIUM_RANGE) { + return 1.5; + } else if (range == AlphaStrikeElement.LONG_RANGE) { + return 1.5; + } else { + return 0; + } + } + + @Override + public String getSortingName() { + String oneShotTag = hasFlag(F_ONESHOT) ? "OS" : ""; + if (name.contains("I-OS")) { + oneShotTag = "XIOS"; + } + return "Thunderbolt-" + oneShotTag + "15"; + } +} diff --git a/megamek/src/megamek/common/weapons/missiles/Thunderbolt20Weapon.java b/megamek/src/megamek/common/weapons/missiles/Thunderbolt20Weapon.java new file mode 100644 index 00000000000..fda21331783 --- /dev/null +++ b/megamek/src/megamek/common/weapons/missiles/Thunderbolt20Weapon.java @@ -0,0 +1,59 @@ +/* + * Copyright (c) 2022 - The MegaMek Team. All Rights Reserved. + * + * This file is part of MegaMek. + * + * MegaMek 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 3 of the License, or + * (at your option) any later version. + * + * MegaMek 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. + * + * You should have received a copy of the GNU General Public License + * along with MegaMek. If not, see . + */ +package megamek.common.weapons.missiles; + +import megamek.common.AmmoType; +import megamek.common.Mounted; +import megamek.common.SimpleTechLevel; +import megamek.common.alphaStrike.AlphaStrikeElement; + +public abstract class Thunderbolt20Weapon extends ThunderBoltWeapon { + + public Thunderbolt20Weapon() { + super(); + ammoType = AmmoType.T_TBOLT_20; + heat = 8; + shortAV = 20; + medAV = 20; + criticals = 5; + missileArmor = 20; + } + + @Override + public double getBattleForceDamage(int range, Mounted fcs) { + if (range == AlphaStrikeElement.SHORT_RANGE) { + return 1.16; + } else if (range == AlphaStrikeElement.MEDIUM_RANGE) { + return 2; + } else if (range == AlphaStrikeElement.LONG_RANGE) { + return 2; + } else { + return 0; + } + } + + @Override + public String getSortingName() { + String oneShotTag = hasFlag(F_ONESHOT) ? "OS" : ""; + if (name.contains("I-OS")) { + oneShotTag = "XIOS"; + } + return "Thunderbolt-" + oneShotTag + "20"; + } +} \ No newline at end of file diff --git a/megamek/src/megamek/common/weapons/missiles/Thunderbolt5Weapon.java b/megamek/src/megamek/common/weapons/missiles/Thunderbolt5Weapon.java new file mode 100644 index 00000000000..615124e8c13 --- /dev/null +++ b/megamek/src/megamek/common/weapons/missiles/Thunderbolt5Weapon.java @@ -0,0 +1,59 @@ +/* + * Copyright (c) 2022 - The MegaMek Team. All Rights Reserved. + * + * This file is part of MegaMek. + * + * MegaMek 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 3 of the License, or + * (at your option) any later version. + * + * MegaMek 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. + * + * You should have received a copy of the GNU General Public License + * along with MegaMek. If not, see . + */ +package megamek.common.weapons.missiles; + +import megamek.common.AmmoType; +import megamek.common.Mounted; +import megamek.common.SimpleTechLevel; +import megamek.common.alphaStrike.AlphaStrikeElement; + +public abstract class Thunderbolt5Weapon extends ThunderBoltWeapon { + + public Thunderbolt5Weapon() { + super(); + ammoType = AmmoType.T_TBOLT_5; + heat = 3; + shortAV = 5; + medAV = 5; + criticals = 1; + missileArmor = 5; + } + + @Override + public double getBattleForceDamage(int range, Mounted fcs) { + if (range == AlphaStrikeElement.SHORT_RANGE) { + return 0.29; + } else if (range == AlphaStrikeElement.MEDIUM_RANGE) { + return 0.5; + } else if (range == AlphaStrikeElement.LONG_RANGE) { + return 0.5; + } else { + return 0; + } + } + + @Override + public String getSortingName() { + String oneShotTag = hasFlag(F_ONESHOT) ? "OS" : ""; + if (name.contains("I-OS")) { + oneShotTag = "XIOS"; + } + return "Thunderbolt-" + oneShotTag + "05"; + } +} \ No newline at end of file diff --git a/megamek/src/megamek/common/weapons/prototypes/ISERLaserLargePrototype.java b/megamek/src/megamek/common/weapons/prototypes/ISERLaserLargePrototype.java index b53093f3d6b..2281969787b 100644 --- a/megamek/src/megamek/common/weapons/prototypes/ISERLaserLargePrototype.java +++ b/megamek/src/megamek/common/weapons/prototypes/ISERLaserLargePrototype.java @@ -23,6 +23,7 @@ import megamek.common.weapons.PrototypeLaserHandler; import megamek.common.weapons.lasers.LaserWeapon; import megamek.server.GameManager; +import megamek.server.Server; /** * @author Andrew Hunter @@ -86,16 +87,17 @@ protected AttackHandler getCorrectHandler(ToHitData toHit, WeaponAttackAction wa @Override public int getLongRange() { - GameOptions options = getGameOptions(); - if (options == null) { - return super.getLongRange(); - } else if (options.getOption(OptionsConstants.ADVCOMBAT_INCREASED_ISERLL_RANGE) == null) { + if (Server.getServerInstance() == null) { return super.getLongRange(); } - if (options.getOption(OptionsConstants.ADVCOMBAT_INCREASED_ISERLL_RANGE).booleanValue()) { + final GameOptions options = Server.getServerInstance().getGame().getOptions(); + if (options.getOption(OptionsConstants.ADVCOMBAT_INCREASED_ISERLL_RANGE) == null) { + return super.getLongRange(); + } else if (options.getOption(OptionsConstants.ADVCOMBAT_INCREASED_ISERLL_RANGE).booleanValue()) { return 21; + } else { + return super.getLongRange(); } - return super.getLongRange(); } @Override diff --git a/megamek/src/megamek/server/GameManager.java b/megamek/src/megamek/server/GameManager.java index 9c16307d636..fb991e2999c 100644 --- a/megamek/src/megamek/server/GameManager.java +++ b/megamek/src/megamek/server/GameManager.java @@ -39,6 +39,7 @@ import megamek.common.preference.PreferenceManager; import megamek.common.util.BoardUtilities; import megamek.common.util.EmailService; +import megamek.common.util.SerializationHelper; import megamek.common.util.StringUtil; import megamek.common.util.fileUtils.MegaMekFile; import megamek.common.verifier.*; @@ -443,12 +444,6 @@ public void saveGame(String sFile, boolean sendChat) { if (sFile.endsWith(".gz")) { sFile = sFile.replace(".gz", ""); } - XStream xstream = new XStream(); - - // This will make save games much smaller - // by using a more efficient means of referencing - // objects in the XML graph - xstream.setMode(XStream.ID_REFERENCES); String sFinalFile = sFile; if (!sFinalFile.endsWith(MMConstants.SAVE_FILE_EXT)) { @@ -464,8 +459,7 @@ public void saveGame(String sFile, boolean sendChat) { try (OutputStream os = new FileOutputStream(sFinalFile + ".gz"); OutputStream gzo = new GZIPOutputStream(os); Writer writer = new OutputStreamWriter(gzo, StandardCharsets.UTF_8)) { - - xstream.toXML(getGame(), writer); + SerializationHelper.getSaveGameXStream().toXML(getGame(), writer); } catch (Exception e) { LogManager.getLogger().error("Unable to save file: " + sFinalFile, e); } @@ -673,14 +667,12 @@ public void sendCurrentInfo(int connId) { // LOUNGE triggers a Game.reset() on the client, which wipes out // the PlanetaryCondition, so resend - if (game.getPhase() == GamePhase.LOUNGE) { + if (game.getPhase().isLounge()) { send(connId, createPlanetaryConditionsPacket()); } - if ((game.getPhase() == GamePhase.FIRING) - || (game.getPhase() == GamePhase.TARGETING) - || (game.getPhase() == GamePhase.OFFBOARD) - || (game.getPhase() == GamePhase.PHYSICAL)) { + if (game.getPhase().isFiring() || game.getPhase().isTargeting() + || game.getPhase().isOffboard() || game.getPhase().isPhysical()) { // can't go above, need board to have been sent send(connId, createAttackPacket(getGame().getActionsVector(), 0)); send(connId, createAttackPacket(getGame().getChargesVector(), 1)); @@ -688,11 +680,10 @@ public void sendCurrentInfo(int connId) { send(connId, createAttackPacket(getGame().getTeleMissileAttacksVector(), 1)); } - if (game.getPhase().hasTurns() && game.hasMoreTurns()) { + if (getGame().getPhase().hasTurns() && getGame().hasMoreTurns()) { send(connId, createTurnVectorPacket()); send(connId, createTurnIndexPacket(connId)); - } else if ((game.getPhase() != GamePhase.LOUNGE) - && (game.getPhase() != GamePhase.STARTING_SCENARIO)) { + } else if (!getGame().getPhase().isLounge() && !getGame().getPhase().isStartingScenario()) { endCurrentPhase(); } @@ -1086,7 +1077,7 @@ private void resetEntityPhase(GamePhase phase) { // reset done to false - if (phase == GamePhase.DEPLOYMENT) { + if (phase.isDeployment()) { entity.setDone(!entity.shouldDeploy(game.getRoundCount())); } else { entity.setDone(false); @@ -1386,8 +1377,8 @@ private void checkReady() { } // need at least one entity in the game for the lounge phase to end - if (!game.getPhase().hasTurns() && ((game.getPhase() != GamePhase.LOUNGE) - || (game.getNoOfEntities() > 0))) { + if (!getGame().getPhase().hasTurns() + && (!getGame().getPhase().isLounge() || (getGame().getNoOfEntities() > 0))) { endCurrentPhase(); } } @@ -1431,22 +1422,15 @@ private void endCurrentTurn(Entity entityUsed) { final int playerId = null == entityUsed ? Player.PLAYER_NONE : entityUsed.getOwnerId(); boolean infMoved = entityUsed instanceof Infantry; boolean infMoveMulti = gameOpts.booleanOption(OptionsConstants.INIT_INF_MOVE_MULTI) - && ((currPhase == GamePhase.MOVEMENT) - || (currPhase == GamePhase.DEPLOYMENT) - || (currPhase == GamePhase.INITIATIVE)); + && (currPhase.isMovement() || currPhase.isDeployment() || currPhase.isInitiative()); boolean protosMoved = entityUsed instanceof Protomech; boolean protosMoveMulti = gameOpts.booleanOption(OptionsConstants.INIT_PROTOS_MOVE_MULTI); boolean tanksMoved = entityUsed instanceof Tank; - boolean tanksMoveMulti = gameOpts.booleanOption( - OptionsConstants.ADVGRNDMOV_VEHICLE_LANCE_MOVEMENT) - && ((currPhase == GamePhase.MOVEMENT) - || (currPhase == GamePhase.DEPLOYMENT) - || (currPhase == GamePhase.INITIATIVE)); + boolean tanksMoveMulti = gameOpts.booleanOption(OptionsConstants.ADVGRNDMOV_VEHICLE_LANCE_MOVEMENT) + && (currPhase.isMovement() || currPhase.isDeployment() || currPhase.isInitiative()); boolean meksMoved = entityUsed instanceof Mech; boolean meksMoveMulti = gameOpts.booleanOption(OptionsConstants.ADVGRNDMOV_MEK_LANCE_MOVEMENT) - && ((currPhase == GamePhase.MOVEMENT) - || (currPhase == GamePhase.DEPLOYMENT) - || (currPhase == GamePhase.INITIATIVE)); + && (currPhase.isMovement() || currPhase.isDeployment() || currPhase.isInitiative()); // If infantry or protos move multi see if any // other unit types can move in the current turn. @@ -2057,8 +2041,7 @@ public void checkEntityExchange() { a.setSI(currentSI); } } - // Give the unit a spotlight, if it has the spotlight quirk - if (entity instanceof Mech || entity instanceof Tank) { + if (entity.getsAutoExternalSearchlight()) { entity.setExternalSearchlight(true); } entityUpdate(entity.getId()); @@ -2499,8 +2482,8 @@ private void receiveForwardIni(int connectionId) { * allow the other players to skip that player. */ private void changeToNextTurn(int prevPlayerId) { - boolean minefieldPhase = game.getPhase() == GamePhase.DEPLOY_MINEFIELDS; - boolean artyPhase = game.getPhase() == GamePhase.SET_ARTILLERY_AUTOHIT_HEXES; + boolean minefieldPhase = game.getPhase().isDeployMinefields(); + boolean artyPhase = game.getPhase().isSetArtilleryAutohitHexes(); GameTurn nextTurn = null; Entity nextEntity = null; @@ -2721,7 +2704,7 @@ private Vector initGameTurnsWithStranded(TurnVectors team_order) { // Stranded units only during movement phases, rebuild the turns vector // TODO maybe move this to Premovemnt? - if (game.getPhase() == GamePhase.MOVEMENT) { + if (game.getPhase().isMovement()) { // See if there are any loaded units stranded on immobile transports. Iterator strandedUnits = game.getSelectedEntities( entity -> game.isEntityStranded(entity)); @@ -2816,40 +2799,31 @@ private void determineTurnOrder(GamePhase phase) { } // and/or deploy even according to game options. boolean infMoveEven = (game.getOptions().booleanOption(OptionsConstants.INIT_INF_MOVE_EVEN) - && ((game.getPhase() == GamePhase.INITIATIVE) - || (game.getPhase() == GamePhase.MOVEMENT))) + && (game.getPhase().isInitiative() || game.getPhase().isMovement())) || (game.getOptions().booleanOption(OptionsConstants.INIT_INF_DEPLOY_EVEN) - && (game.getPhase() == GamePhase.DEPLOYMENT)); - boolean infMoveMulti = game.getOptions() - .booleanOption(OptionsConstants.INIT_INF_MOVE_MULTI) - && ((game.getPhase() == GamePhase.INITIATIVE) - || ((game.getPhase() == GamePhase.MOVEMENT) - || (game.getPhase() == GamePhase.DEPLOYMENT))); - boolean protosMoveEven = (game.getOptions().booleanOption( - OptionsConstants.INIT_PROTOS_MOVE_EVEN) - && ((game.getPhase() == GamePhase.INITIATIVE) - || ((game.getPhase() == GamePhase.MOVEMENT) - || (game.getPhase() == GamePhase.DEPLOYMENT)))) + && game.getPhase().isDeployment()); + boolean infMoveMulti = game.getOptions().booleanOption(OptionsConstants.INIT_INF_MOVE_MULTI) + && (game.getPhase().isInitiative() || game.getPhase().isMovement() + || game.getPhase().isDeployment()); + boolean protosMoveEven = (game.getOptions().booleanOption(OptionsConstants.INIT_PROTOS_MOVE_EVEN) + && (game.getPhase().isInitiative() || game.getPhase().isMovement() + || game.getPhase().isDeployment())) || (game.getOptions().booleanOption(OptionsConstants.INIT_PROTOS_MOVE_EVEN) - && (game.getPhase() == GamePhase.DEPLOYMENT)); - boolean protosMoveMulti = game.getOptions().booleanOption( - OptionsConstants.INIT_PROTOS_MOVE_MULTI); + && game.getPhase().isDeployment()); + boolean protosMoveMulti = game.getOptions().booleanOption(OptionsConstants.INIT_PROTOS_MOVE_MULTI); boolean protosMoveByPoint = !protosMoveMulti; - boolean tankMoveByLance = game.getOptions().booleanOption( - OptionsConstants.ADVGRNDMOV_VEHICLE_LANCE_MOVEMENT) - && ((game.getPhase() == GamePhase.INITIATIVE) - || ((game.getPhase() == GamePhase.MOVEMENT) - || (game.getPhase() == GamePhase.DEPLOYMENT))); - boolean mekMoveByLance = game.getOptions().booleanOption( - OptionsConstants.ADVGRNDMOV_MEK_LANCE_MOVEMENT) - && ((game.getPhase() == GamePhase.INITIATIVE) - || ((game.getPhase() == GamePhase.MOVEMENT) - || (game.getPhase() == GamePhase.DEPLOYMENT))); + boolean tankMoveByLance = game.getOptions().booleanOption(OptionsConstants.ADVGRNDMOV_VEHICLE_LANCE_MOVEMENT) + && (game.getPhase().isInitiative() || game.getPhase().isMovement() + || game.getPhase().isDeployment()); + boolean mekMoveByLance = game.getOptions().booleanOption(OptionsConstants.ADVGRNDMOV_MEK_LANCE_MOVEMENT) + && (game.getPhase().isInitiative() || game.getPhase().isMovement() + || game.getPhase().isDeployment()); int evenMask = 0; if (infMoveEven) { evenMask += GameTurn.CLASS_INFANTRY; } + if (protosMoveEven) { evenMask += GameTurn.CLASS_PROTOMECH; } @@ -2911,28 +2885,22 @@ public boolean accept(Entity entity) { if (entity.isSelectableThisTurn()) { final Player player = entity.getOwner(); if ((entity instanceof SpaceStation) - && ((game.getPhase() == GamePhase.MOVEMENT) - || (game.getPhase() == GamePhase.DEPLOYMENT))) { + && (game.getPhase().isMovement() || game.getPhase().isDeployment())) { player.incrementSpaceStationTurns(); } else if ((entity instanceof Warship) - && ((game.getPhase() == GamePhase.MOVEMENT) - || (game.getPhase() == GamePhase.DEPLOYMENT))) { + && (game.getPhase().isMovement() || game.getPhase().isDeployment())) { player.incrementWarshipTurns(); } else if ((entity instanceof Jumpship) - && ((game.getPhase() == GamePhase.MOVEMENT) - || (game.getPhase() == GamePhase.DEPLOYMENT))) { + && (game.getPhase().isMovement() || game.getPhase().isDeployment())) { player.incrementJumpshipTurns(); } else if ((entity instanceof Dropship) && entity.isAirborne() - && ((game.getPhase() == GamePhase.MOVEMENT) - || (game.getPhase() == GamePhase.DEPLOYMENT))) { + && (game.getPhase().isMovement() || game.getPhase().isDeployment())) { player.incrementDropshipTurns(); } else if ((entity instanceof SmallCraft) && entity.isAirborne() - && ((game.getPhase() == GamePhase.MOVEMENT) - || (game.getPhase() == GamePhase.DEPLOYMENT))) { + && (game.getPhase().isMovement() || game.getPhase().isDeployment())) { player.incrementSmallCraftTurns(); } else if (entity.isAirborne() - && ((game.getPhase() == GamePhase.MOVEMENT) - || (game.getPhase() == GamePhase.DEPLOYMENT))) { + && (game.getPhase().isMovement() || game.getPhase().isDeployment())) { player.incrementAeroTurns(); } else if ((entity instanceof Infantry)) { if (infMoveEven) { @@ -3124,7 +3092,7 @@ private void writeInitiativeReport(boolean abbreviatedReport) { if (!abbreviatedReport) { r = new Report(1210); r.type = Report.PUBLIC; - if ((game.getLastPhase() == GamePhase.DEPLOYMENT) || game.isDeploymentComplete() + if (game.getLastPhase().isDeployment() || game.isDeploymentComplete() || !game.shouldDeployThisRound()) { r.messageId = 1000; r.add(game.getRoundCount()); @@ -3219,7 +3187,7 @@ private void writeInitiativeReport(boolean abbreviatedReport) { r = new Report(1021, Report.PUBLIC); if ((game.getOptions().booleanOption(OptionsConstants.INIT_INF_DEPLOY_EVEN) || game.getOptions().booleanOption(OptionsConstants.INIT_PROTOS_MOVE_EVEN)) - && !(game.getLastPhase() == GamePhase.END_REPORT)) { + && !game.getLastPhase().isEndReport()) { r.choose(true); } else { r.choose(false); @@ -3405,8 +3373,7 @@ private void loadUnit(Entity loader, Entity unit, int bayNumber) { && en.getUnitNumber() == unit.getUnitNumber()); } - if ((game.getPhase() != GamePhase.LOUNGE) && !unit.isDone() - && (remainingProtos == 0)) { + if (!getGame().getPhase().isLounge() && !unit.isDone() && (remainingProtos == 0)) { // Remove the *last* friendly turn (removing the *first* penalizes // the opponent too much, and re-calculating moves is too hard). game.removeTurnFor(unit); @@ -3425,11 +3392,7 @@ private void loadUnit(Entity loader, Entity unit, int bayNumber) { // Load the unit. Do not check for elevation during deployment boolean checkElevation = !getGame().getPhase().isLounge() && !getGame().getPhase().isDeployment(); - if (bayNumber == -1) { - loader.load(unit, checkElevation); - } else { - loader.load(unit, checkElevation, bayNumber); - } + loader.load(unit, checkElevation, bayNumber); // The loaded unit is being carried by the loader. unit.setTransportId(loader.getId()); @@ -3440,9 +3403,9 @@ private void loadUnit(Entity loader, Entity unit, int bayNumber) { // set deployment round of the loadee to equal that of the loader unit.setDeployRound(loader.getDeployRound()); - //Update the loading unit's passenger count, if it's a large craft - if (loader instanceof SmallCraft || loader instanceof Jumpship) { - //Don't add DropShip crew to a JumpShip or station's passenger list + // Update the loading unit's passenger count, if it's a large craft + if ((loader instanceof SmallCraft) || (loader instanceof Jumpship)) { + // Don't add DropShip crew to a JumpShip or station's passenger list if (!unit.isLargeCraft()) { loader.setNPassenger(loader.getNPassenger() + unit.getCrew().getSize()); } @@ -3461,7 +3424,7 @@ private void loadUnit(Entity loader, Entity unit, int bayNumber) { * @param unit - the Entity being towed. */ private void towUnit(Entity loader, Entity unit) { - if ((game.getPhase() != GamePhase.LOUNGE) && !unit.isDone()) { + if (!getGame().getPhase().isLounge() && !unit.isDone()) { // Remove the *last* friendly turn (removing the *first* penalizes // the opponent too much, and re-calculating moves is too hard). game.removeTurnFor(unit); @@ -4143,7 +4106,7 @@ private void receiveMovement(Packet packet, int connId) { md.setEntity(entity); // is this the right phase? - if (game.getPhase() != GamePhase.MOVEMENT) { + if (!getGame().getPhase().isMovement()) { LogManager.getLogger().error("Server got movement packet in wrong phase"); return; } @@ -4153,6 +4116,7 @@ private void receiveMovement(Packet packet, int connId) { if (getGame().getPhase().isSimultaneous(getGame())) { turn = game.getTurnForPlayer(connId); } + if ((turn == null) || !turn.isValid(connId, entity, game)) { String msg = "error: server got invalid movement packet from " + "connection " + connId; if (entity != null) { @@ -4918,6 +4882,7 @@ else if ((target instanceof Infantry) && (bldg != null)) { // note that this must sequentially occur before the next 'entering liquid magma' check // otherwise, magma crust won't have a chance to break ServerHelper.checkAndApplyMagmaCrust(nextHex, nextElevation, entity, curPos, false, vPhaseReport, this); + ServerHelper.checkEnteringMagma(nextHex, nextElevation, entity, this); // is the next hex a swamp? PilotingRollData rollTarget = entity.checkBogDown(step, moveType, nextHex, curPos, nextPos, @@ -5920,6 +5885,7 @@ private void processMovement(Entity entity, MovePath md, Map doEntityDisplacement(Entity entity, Coords src, // Make sure there aren't any specific entity turns for entity int turnsRemoved = game.removeSpecificEntityTurnsFor(entity); // May need to remove a turn for this Entity - if ((game.getPhase() == GamePhase.MOVEMENT) - && !entity.isDone() && (turnsRemoved == 0)) { + if (game.getPhase().isMovement() && !entity.isDone() && (turnsRemoved == 0)) { game.removeTurnFor(entity); send(createTurnVectorPacket()); } else if (turnsRemoved > 0) { @@ -12043,6 +12026,7 @@ private Vector doEntityDisplacement(Entity entity, Coords src, } ServerHelper.checkAndApplyMagmaCrust(destHex, entity.getElevation(), entity, dest, false, vPhaseReport, this); + ServerHelper.checkEnteringMagma(destHex, entity.getElevation(), entity, this); Entity violation = Compute.stackingViolation(game, entity.getId(), dest); if (violation == null) { @@ -12624,7 +12608,7 @@ private void receiveDeployMinefields(Packet packet, int connId) { Vector minefields = (Vector) packet.getObject(0); // is this the right phase? - if (game.getPhase() != GamePhase.DEPLOY_MINEFIELDS) { + if (!getGame().getPhase().isDeployMinefields()) { LogManager.getLogger().error("Server got deploy minefields packet in wrong phase"); return; } @@ -12698,9 +12682,8 @@ private void receivePrephase(Packet packet, int connId) { Entity entity = game.getEntity(packet.getIntValue(0)); // is this the right phase? - if ((game.getPhase() != GamePhase.PREFIRING) - && (game.getPhase() != GamePhase.PREMOVEMENT)) { - LogManager.getLogger().error("Server got Prephase packet in wrong phase "+game.getPhase()); + if (!getGame().getPhase().isPrefiring() && !getGame().getPhase().isPremovement()) { + LogManager.getLogger().error("Server got Prephase packet in wrong phase " + game.getPhase()); return; } @@ -12738,10 +12721,8 @@ private void receiveAttack(Packet packet, int connId) { Vector vector = (Vector) packet.getObject(1); // is this the right phase? - if ((game.getPhase() != GamePhase.FIRING) - && (game.getPhase() != GamePhase.PHYSICAL) - && (game.getPhase() != GamePhase.TARGETING) - && (game.getPhase() != GamePhase.OFFBOARD)) { + if (!getGame().getPhase().isFiring() && !getGame().getPhase().isPhysical() + && !getGame().getPhase().isTargeting() && !getGame().getPhase().isOffboard()) { LogManager.getLogger().error("Server got attack packet in wrong phase"); return; } @@ -13063,7 +13044,7 @@ public void assignAMS() { // For Bearings-only Capital Missiles, don't assign during the offboard phase if (wh instanceof CapitalMissileBearingsOnlyHandler) { ArtilleryAttackAction aaa = (ArtilleryAttackAction) waa; - if (aaa.getTurnsTilHit() > 0 || game.getPhase() != GamePhase.FIRING) { + if ((aaa.getTurnsTilHit() > 0) || !getGame().getPhase().isFiring()) { continue; } } @@ -18292,33 +18273,6 @@ private void resolveHeat() { } else { LogManager.getLogger().error("Radical heat sinks mounted on non-mech, non-aero Entity!"); } - int rhsRoll = Compute.d6(2); - int targetNumber; - switch (entity.getConsecutiveRHSUses()) { - case 0: - targetNumber = 2; - break; - case 1: - targetNumber = 3; - break; - case 2: - targetNumber = 5; - break; - case 3: - targetNumber = 7; - break; - case 4: - targetNumber = 10; - break; - case 5: - targetNumber = 11; - break; - case 6: - default: - targetNumber = TargetRoll.AUTOMATIC_FAIL; - break; - } - entity.setConsecutiveRHSUses(entity.getConsecutiveRHSUses() + 1); // RHS activation report r = new Report(5540); @@ -18328,7 +18282,11 @@ private void resolveHeat() { r.add(radicalHSBonus); rhsReports.add(r); + int rhsRoll = Compute.d6(2); + entity.setConsecutiveRHSUses(entity.getConsecutiveRHSUses() + 1); + int targetNumber = ServerHelper.radicalHeatSinkSuccessTarget(entity.getConsecutiveRHSUses()); boolean rhsFailure = rhsRoll < targetNumber; + r = new Report(5541); r.indent(2); r.subject = entity.getId(); @@ -18467,32 +18425,7 @@ private void resolveHeat() { // If a Mek is in extreme Temperatures, add or subtract one // heat per 10 degrees (or fraction of 10 degrees) above or // below 50 or -30 degrees Celsius - if (game.getPlanetaryConditions().getTemperatureDifference(50, -30) != 0 - && !((Mech) entity).hasLaserHeatSinks()) { - if (game.getPlanetaryConditions().getTemperature() > 50) { - int heatToAdd = game.getPlanetaryConditions() - .getTemperatureDifference(50, -30); - if (((Mech) entity).hasIntactHeatDissipatingArmor()) { - heatToAdd /= 2; - } - entity.heatFromExternal += heatToAdd; - r = new Report(5020); - r.subject = entity.getId(); - r.add(heatToAdd); - addReport(r); - if (((Mech) entity).hasIntactHeatDissipatingArmor()) { - r = new Report(5550); - addReport(r); - } - } else { - entity.heatFromExternal -= game.getPlanetaryConditions() - .getTemperatureDifference(50, -30); - r = new Report(5025); - r.subject = entity.getId(); - r.add(game.getPlanetaryConditions().getTemperatureDifference(50, -30)); - addReport(r); - } - } + ServerHelper.adjustHeatExtremeTemp(game, entity, vPhaseReport); // Add +5 Heat if the hex you're in is on fire // and was on fire for the full round. @@ -29047,7 +28980,7 @@ public boolean accept(Entity entity) { || entity.hasQuirk(OptionsConstants.QUIRK_POS_SEARCHLIGHT)); entityIds.add(entity.getId()); - if (game.getPhase() != GamePhase.LOUNGE) { + if (!getGame().getPhase().isLounge()) { entity.getOwner().changeInitialEntityCount(1); entity.getOwner().changeInitialBV(entity.calculateBattleValue()); } @@ -29210,7 +29143,7 @@ private void receiveEntityUpdate(Packet c, int connIndex) { game.setEntity(entity.getId(), entity); entityUpdate(entity.getId()); // In the chat lounge, notify players of customizing of unit - if (game.getPhase() == GamePhase.LOUNGE) { + if (game.getPhase().isLounge()) { sendServerChat(ServerLobbyHelper.entityUpdateMessage(entity, game)); } } @@ -29223,7 +29156,7 @@ private void receiveEntityUpdate(Packet c, int connIndex) { * remain unchanged but still be sent back to overwrite incorrect client changes. */ private void receiveEntitiesUpdate(Packet c, int connIndex) { - if (game.getPhase() != GamePhase.LOUNGE) { + if (!getGame().getPhase().isLounge()) { LogManager.getLogger().error("Multi entity updates should not be used outside the lobby phase!"); } Set newEntities = new HashSet<>(); @@ -29309,7 +29242,7 @@ private void receiveEntityLoad(Packet c, int connIndex) { */ private void receiveCustomInit(Packet c, int connIndex) { // In the chat lounge, notify players of customizing of unit - if (game.getPhase() == GamePhase.LOUNGE) { + if (game.getPhase().isLounge()) { Player p = (Player) c.getObject(0); sendServerChat("" + p.getName() + " has customized initiative."); } @@ -29639,7 +29572,7 @@ public boolean accept(Entity entity) { } // End update-unit-number } // End added-ProtoMech - if (game.getPhase() != GamePhase.DEPLOYMENT) { + if (!getGame().getPhase().isDeployment()) { // if a unit is removed during deployment just keep going // without adjusting the turn vector. game.removeTurnFor(entity); @@ -29657,7 +29590,7 @@ public boolean accept(Entity entity) { send(createRemoveEntityPacket(ids, affectedForces, IEntityRemovalConditions.REMOVE_NEVER_JOINED)); // Prevents deployment hanging. Only do this during deployment. - if (game.getPhase() == GamePhase.DEPLOYMENT) { + if (game.getPhase().isDeployment()) { for (Integer entityId : ids) { final Entity entity = game.getEntity(entityId); game.removeEntity(entityId, IEntityRemovalConditions.REMOVE_NEVER_JOINED); @@ -29679,7 +29612,7 @@ private void receivePlayerDone(Packet pkt, int connIndex) { private void receiveInitiativeRerollRequest(Packet pkt, int connIndex) { Player player = game.getPlayer(connIndex); - if (GamePhase.INITIATIVE_REPORT != game.getPhase()) { + if (!game.getPhase().isInitiativeReport()) { StringBuilder message = new StringBuilder(); if (null == player) { message.append("Player #").append(connIndex); @@ -33006,7 +32939,7 @@ private void resolveSinkVees() { * let all Entities make their "break-free-of-swamp-stickyness" PSR */ private void doTryUnstuck() { - if (game.getPhase() != GamePhase.MOVEMENT) { + if (!getGame().getPhase().isMovement()) { return; } diff --git a/megamek/src/megamek/server/Messages.java b/megamek/src/megamek/server/Messages.java index 86530e05411..6953f53554c 100644 --- a/megamek/src/megamek/server/Messages.java +++ b/megamek/src/megamek/server/Messages.java @@ -1,7 +1,6 @@ package megamek.server; import megamek.MegaMek; -import megamek.common.util.EncodeControl; import org.apache.logging.log4j.LogManager; import java.util.MissingResourceException; @@ -9,7 +8,7 @@ public class Messages { private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle.getBundle("megamek.server.messages", - MegaMek.getMMOptions().getLocale(), new EncodeControl()); + MegaMek.getMMOptions().getLocale()); private Messages() { diff --git a/megamek/src/megamek/server/Server.java b/megamek/src/megamek/server/Server.java index 129fcf864f3..0944ceaf7a4 100644 --- a/megamek/src/megamek/server/Server.java +++ b/megamek/src/megamek/server/Server.java @@ -20,6 +20,7 @@ import megamek.MegaMek; import megamek.Version; import megamek.client.ui.swing.util.PlayerColour; +import megamek.codeUtilities.StringUtility; import megamek.common.*; import megamek.common.annotations.Nullable; import megamek.common.commandline.AbstractCommandLineParser.ParseException; @@ -271,7 +272,7 @@ public static String validatePlayerName(String playerName) throws ParseException * @return valid password or null if no password or password is blank string */ public static @Nullable String validatePassword(@Nullable String password) { - return ((password == null) || password.isBlank()) ? null : password.trim(); + return StringUtility.isNullOrBlank(password) ? null : password.trim(); } /** @@ -281,7 +282,7 @@ public static String validatePlayerName(String playerName) throws ParseException * @return true if the user-supplied data matches the server password or no password is set. */ public boolean passwordMatches(Object password) { - return (this.password == null) || this.password.isBlank() || this.password.equals(password); + return StringUtility.isNullOrBlank(this.password) || this.password.equals(password); } /** @@ -300,21 +301,15 @@ public static int validatePort(int port) throws ParseException { } } - public Server(String password, int port, IGameManager gameManager) throws IOException { + public Server(@Nullable String password, int port, IGameManager gameManager) throws IOException { this(password, port, gameManager, false, "", null, false); } - public Server(String password, int port, IGameManager gameManager, - boolean registerWithServerBrowser, String metaServerUrl) throws IOException { + public Server(@Nullable String password, int port, IGameManager gameManager, + boolean registerWithServerBrowser, @Nullable String metaServerUrl) throws IOException { this(password, port, gameManager, registerWithServerBrowser, metaServerUrl, null, false); } - public Server(String password, int port, IGameManager gameManager, - boolean registerWithServerBrowser, String metaServerUrl, EmailService mailer) - throws IOException { - this(password, port, gameManager, registerWithServerBrowser, metaServerUrl, mailer, false); - } - /** * Construct a new GameHost and begin listening for incoming clients. * @@ -330,10 +325,9 @@ public Server(String password, int port, IGameManager gameManager, public Server(@Nullable String password, int port, IGameManager gameManager, boolean registerWithServerBrowser, @Nullable String metaServerUrl, @Nullable EmailService mailer, boolean dedicated) throws IOException { - this.metaServerUrl = (metaServerUrl != null) && (!metaServerUrl.isBlank()) ? metaServerUrl : null; - this.password = (password != null) && (!password.isBlank()) ? password : null; + this.metaServerUrl = StringUtility.isNullOrBlank(metaServerUrl) ? null : metaServerUrl; + this.password = StringUtility.isNullOrBlank(password) ? null : password; this.gameManager = gameManager; - this.mailer = mailer; this.dedicated = dedicated; @@ -376,7 +370,7 @@ public Server(@Nullable String password, int port, IGameManager gameManager, packetPumpThread.start(); if (registerWithServerBrowser) { - if ((metaServerUrl != null) && (!metaServerUrl.isBlank())) { + if (!StringUtility.isNullOrBlank(metaServerUrl)) { final TimerTask register = new TimerTask() { @Override public void run() { @@ -873,7 +867,7 @@ public boolean loadGame(File f, boolean sendInfo) { Game newGame; try (InputStream is = new FileInputStream(f); InputStream gzi = new GZIPInputStream(is)) { - XStream xstream = SerializationHelper.getXStream(); + XStream xstream = SerializationHelper.getLoadSaveGameXStream(); newGame = (Game) xstream.fromXML(gzi); } catch (Exception e) { LogManager.getLogger().error("Unable to load file: " + f, e); @@ -1317,9 +1311,9 @@ public int getPort() { } /** - * @return the current server instance + * @return the current server instance. This may be null if a server has not been started */ - public static Server getServerInstance() { + public static @Nullable Server getServerInstance() { return serverInstance; } diff --git a/megamek/src/megamek/server/ServerHelper.java b/megamek/src/megamek/server/ServerHelper.java index 7e992098aca..896b7a2555b 100644 --- a/megamek/src/megamek/server/ServerHelper.java +++ b/megamek/src/megamek/server/ServerHelper.java @@ -96,6 +96,9 @@ public static void resolveAeroHeat(Game game, Entity entity, Vector vPha vPhaseReport.add(r); } + // Add or subtract heat due to extreme temperatures TO:AR p60 + adjustHeatExtremeTemp(game, entity, vPhaseReport); + // Combat computers help manage heat if (entity.hasQuirk(OptionsConstants.QUIRK_POS_COMBAT_COMPUTER)) { int reduce = Math.min(entity.heatBuildup, 4); @@ -398,7 +401,45 @@ else if ((entity.heat >= 14) && !entity.isShutDown()) { vPhaseReport.addAll(s.destroyEntity(entity, "pilot death", true)); } } - + + public static void adjustHeatExtremeTemp(Game game, Entity entity, Vector vPhaseReport) { + Report r; + int tempDiff = game.getPlanetaryConditions().getTemperatureDifference(50, -30); + boolean heatArmor = false; + boolean laserHS = false; + + if (entity instanceof Mech) { + laserHS = ((Mech) entity).hasLaserHeatSinks(); + heatArmor = ((Mech) entity).hasIntactHeatDissipatingArmor(); + } + + if (game.getBoard().inSpace() || (tempDiff == 0) || laserHS) { + return; + } else { + if (game.getPlanetaryConditions().getTemperature() > 50) { + int heatToAdd = tempDiff; + if (heatArmor) { + heatToAdd /= 2; + } + entity.heatFromExternal += heatToAdd; + r = new Report(5020); + r.subject = entity.getId(); + r.add(heatToAdd); + vPhaseReport.add(r); + if (heatArmor) { + r = new Report(5550); + vPhaseReport.add(r); + } + } else { + entity.heatFromExternal -= tempDiff; + r = new Report(5025); + r.subject = entity.getId(); + r.add(tempDiff); + vPhaseReport.add(r); + } + } + } + /** * Helper function that causes an entity to sink to the bottom of the water * hex it's currently in. @@ -445,12 +486,24 @@ public static void checkAndApplyMagmaCrust(Hex hex, int elevation, Entity entity hex.addTerrain(new Terrain(Terrains.MAGMA, 2)); gameManager.sendChangedHex(curPos); for (Entity en : entity.getGame().getEntitiesVector(curPos)) { - gameManager.doMagmaDamage(en, false); + if (en != entity) { + gameManager.doMagmaDamage(en, false); + } } } } } + /** + * Check for movement into magma hex and apply damage. + */ + public static void checkEnteringMagma(Hex hex, int elevation, Entity entity, GameManager gameManager) { + + if ((hex.terrainLevel(Terrains.MAGMA) == 2) && (elevation == 0) && (entity.getMovementMode() != EntityMovementMode.HOVER)) { + gameManager.doMagmaDamage(entity, false); + } + } + /** * Loops through all active entities in the game and performs mine detection */ @@ -644,4 +697,28 @@ public static void clearBloodStalkers(Game game, int stalkeeID, GameManager game } } } + + /** + * Returns the target number to avoid Radical Heat Sink Failure for the given number of rounds + * of consecutive use, IO p.89. The first round of use means consecutiveRounds = 1; this is + * the minimum as 0 rounds of use would not trigger a roll. + * @param consecutiveRounds The rounds the RHS has been used + * @return The roll target number to avoid failure + */ + public static int radicalHeatSinkSuccessTarget(int consecutiveRounds) { + switch (consecutiveRounds) { + case 1: + return 3; + case 2: + return 5; + case 3: + return 7; + case 4: + return 10; + case 5: + return 11; + default: + return TargetRoll.AUTOMATIC_FAIL; + } + } } diff --git a/megamek/src/megamek/test/ASWeaponDamageList.java b/megamek/src/megamek/test/ASWeaponDamageList.java index 0d9fac3ccc4..f0d6d1dab41 100644 --- a/megamek/src/megamek/test/ASWeaponDamageList.java +++ b/megamek/src/megamek/test/ASWeaponDamageList.java @@ -38,6 +38,7 @@ public static void main(String[] args) { &&!(etype instanceof BayWeapon)) { wpLine = new ArrayList<>(); wpLine.add(etype.getName()); + wpLine.add(etype.getInternalName()); wpLine.add(etype.isClan()? "-Clan-" : "-IS-"); double mult = etype.hasFlag(WeaponType.F_ONESHOT) ? 0.1 : 1; double s = mult * ((WeaponType)etype).getBattleForceDamage(AlphaStrikeElement.SHORT_RANGE, null); diff --git a/megamek/src/megamek/utilities/xml/MMXMLUtility.java b/megamek/src/megamek/utilities/xml/MMXMLUtility.java index a24c4a74180..dd80efd308d 100644 --- a/megamek/src/megamek/utilities/xml/MMXMLUtility.java +++ b/megamek/src/megamek/utilities/xml/MMXMLUtility.java @@ -380,47 +380,6 @@ public static void writeSimpleXMLCloseTag(final PrintWriter pw, final int indent } //endregion Close Tag - //region Deprecated Tag Writers - @Deprecated - public static void writeSimpleXMLOpenIndentedLine(final PrintWriter pw, final int indent, - final String name) { - writeSimpleXMLOpenTag(pw, indent, name, null, null, null, null); - } - - @Deprecated - public static void writeSimpleXmlTag(PrintWriter pw1, int indent, String name, UUID val) { - if (val != null) { - writeSimpleXmlTag(pw1, indent, name, val.toString()); - } - } - - @Deprecated - public static void writeSimpleXmlTag(PrintWriter pw1, int indent, String name, String val) { - pw1.println(indentStr(indent) + '<' + name + '>' + escape(val) + "'); - } - - @Deprecated - public static void writeSimpleXmlTag(PrintWriter pw1, int indent, String name, int val) { - pw1.println(indentStr(indent) + '<' + name + '>' + val + "'); - } - - @Deprecated - public static void writeSimpleXmlTag(PrintWriter pw1, int indent, String name, boolean val) { - pw1.println(indentStr(indent) + '<' + name + '>' + val + "'); - } - - @Deprecated - public static void writeSimpleXmlTag(PrintWriter pw1, int indent, String name, double val) { - pw1.println(indentStr(indent) + '<' + name + '>' + val + "'); - } - - @Deprecated - public static void writeSimpleXMLCloseIndentedLine(final PrintWriter pw, final int indent, - final String name) { - writeSimpleXMLCloseTag(pw, indent, name); - } - //endregion Deprecated Tag Writers - /** * @param level the level to indent up to * @return a string containing level tab indents diff --git a/megamek/unittests/megamek/common/BoardDimensionsTests.java b/megamek/unittests/megamek/common/BoardDimensionsTests.java index 630c46a1a05..7ac9188d8c5 100644 --- a/megamek/unittests/megamek/common/BoardDimensionsTests.java +++ b/megamek/unittests/megamek/common/BoardDimensionsTests.java @@ -19,6 +19,7 @@ */ package megamek.common; +import megamek.codeUtilities.MathUtility; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.*; @@ -48,15 +49,6 @@ public final void testInstantiation() { assertEquals(8000, b.numHexes()); } - @Test - public final void testCopyConstructor() { - BoardDimensions b = new BoardDimensions(20, 10); - BoardDimensions c = new BoardDimensions(b); - - assertEquals(20, c.width()); - assertEquals(10, c.height()); - } - @Test public final void testEqualsObject() { BoardDimensions b = new BoardDimensions(10, 10); @@ -78,17 +70,10 @@ public final void testNotEqualsObject() { assertNotEquals(b, new BoardDimensions(5, 10)); } - @Test - public final void testClone() { - BoardDimensions b = new BoardDimensions(10, 10); - assertNotSame(b.clone(), b); - assertEquals(b.clone(), b); - } - @Test public final void testToString() { - assertEquals("10x10", new BoardDimensions(10, 10).toString()); - assertEquals("80x50", new BoardDimensions(80, 50).toString()); + assertEquals("10 x 10", new BoardDimensions(10, 10).toString()); + assertEquals("80 x 50", new BoardDimensions(80, 50).toString()); } @Test @@ -98,14 +83,23 @@ public final void testCompareTo() { assertEquals(0, new BoardDimensions(Integer.MAX_VALUE, Integer.MAX_VALUE).compareTo(new BoardDimensions( Integer.MAX_VALUE, Integer.MAX_VALUE))); - assertEquals(-1, - new BoardDimensions(10, 10).compareTo(new BoardDimensions( - Integer.MAX_VALUE, Integer.MAX_VALUE))); - assertEquals(1, new BoardDimensions(Integer.MAX_VALUE, - Integer.MAX_VALUE).compareTo(new BoardDimensions(10, 10))); - assertEquals(-1, - new BoardDimensions(10, 20).compareTo(new BoardDimensions(20, 10))); - assertEquals(1, - new BoardDimensions(20, 10).compareTo(new BoardDimensions(10, 20))); + + int result = MathUtility.clamp(new BoardDimensions(10, 10).compareTo(new BoardDimensions( + Integer.MAX_VALUE, Integer.MAX_VALUE)), -1, 1); + assertEquals(-1, result); + + result = MathUtility.clamp(new BoardDimensions(Integer.MAX_VALUE, + Integer.MAX_VALUE).compareTo(new BoardDimensions(10, 10)), -1, 1); + assertEquals(1, result); + + result = MathUtility.clamp( + new BoardDimensions(10, 20).compareTo(new BoardDimensions(20, 10)), + -1, 1); + assertEquals(-1, result); + + result = MathUtility.clamp( + new BoardDimensions(20, 10).compareTo(new BoardDimensions(10, 20)), + -1, 1); + assertEquals(1, result); } }