diff --git a/megamek/data/images/units/Infantry/Branth.png b/megamek/data/images/units/Infantry/Branth.png
new file mode 100644
index 00000000000..1ea70b12747
Binary files /dev/null and b/megamek/data/images/units/Infantry/Branth.png differ
diff --git a/megamek/data/images/units/Infantry/Camel.png b/megamek/data/images/units/Infantry/Camel.png
new file mode 100644
index 00000000000..dff1d5fccca
Binary files /dev/null and b/megamek/data/images/units/Infantry/Camel.png differ
diff --git a/megamek/data/images/units/Infantry/Donkey.png b/megamek/data/images/units/Infantry/Donkey.png
new file mode 100644
index 00000000000..6e31a60a38e
Binary files /dev/null and b/megamek/data/images/units/Infantry/Donkey.png differ
diff --git a/megamek/data/images/units/Infantry/Horse.png b/megamek/data/images/units/Infantry/Horse.png
new file mode 100644
index 00000000000..46fc66c05a2
Binary files /dev/null and b/megamek/data/images/units/Infantry/Horse.png differ
diff --git a/megamek/data/images/units/mechset.txt b/megamek/data/images/units/mechset.txt
index 0d26d6d1dc7..7cbfd273030 100644
--- a/megamek/data/images/units/mechset.txt
+++ b/megamek/data/images/units/mechset.txt
@@ -7118,6 +7118,12 @@ exact "Foot Platoon (Laser TAG)" "Infantry/laser_infantry_platoon.png"
exact "Foot Platoon (Laser XCT)" "Infantry/laser_infantry_platoon.png"
exact "Foot Platoon (Laser Heavy XCT)" "Infantry/xenoplanetary_infantry.png"
+#Beast Infantry
+chassis "Beast Infantry (Branth)" "Infantry/Branth.png"
+chassis "Beast Infantry (Camel)" "Infantry/Camel.png"
+chassis "Beast Infantry (Donkey)" "Infantry/Donkey.png"
+chassis "Beast Infantry (Horse)" "Infantry/Horse.png"
+
#Jumpships
chassis "Invader Jumpship" "jumpships/invader.png"
chassis "Invader" "jumpships/invader.png"
diff --git a/megamek/data/mechfiles/infantry/3085/Marik/Beast Infantry (Aerial).blk b/megamek/data/mechfiles/infantry/3085/Marik/Beast Infantry (Aerial).blk
new file mode 100644
index 00000000000..793614a5f9a
--- /dev/null
+++ b/megamek/data/mechfiles/infantry/3085/Marik/Beast Infantry (Aerial).blk
@@ -0,0 +1,69 @@
+#building block data file
+
+1
+
+
+##Write the version number just in case...
+
+MAM0
+
+
+
+Infantry
+
+
+
+Beast Infantry
+
+
+
+(Aerial)
+
+
+
+12
+
+
+
+2300
+
+
+
+2300
+
+
+
+IS Level 3
+
+
+
+Beast:Branth
+
+
+
+
+
+
+Branth Irregulars, 5th Legion, Beta Regiment
+
+
+
+
+
+7
+
+
+
+1
+
+
+
+Elephant Gun
+
+
+
+Free Worlds League Infantry Kit
+
+
diff --git a/megamek/data/mechfiles/infantry/Beast Mounted/Branth/Beast Infantry (Branth)(Auto Rifle).blk b/megamek/data/mechfiles/infantry/Beast Mounted/Branth/Beast Infantry (Branth)(Auto Rifle).blk
new file mode 100644
index 00000000000..7b00e154243
--- /dev/null
+++ b/megamek/data/mechfiles/infantry/Beast Mounted/Branth/Beast Infantry (Branth)(Auto Rifle).blk
@@ -0,0 +1,57 @@
+#building block data file
+
+1
+
+
+##Write the version number just in case...
+
+MAM0
+
+
+
+Infantry
+
+
+
+Beast Infantry (Branth)
+
+
+
+(Auto-Rifle)
+
+
+
+2401
+
+
+
+2401
+
+
+
+IS Level 3
+
+
+
+Beast:Branth
+
+
+
+
+
+
+7
+
+
+
+1
+
+
+
+InfantryAssaultRifle
+
+
+
+Clothing, Fatigues/Civilian/Non-Armored
+
+
diff --git a/megamek/data/mechfiles/infantry/Beast Mounted/Branth/Beast Infantry (Branth)(Gyrojet).blk b/megamek/data/mechfiles/infantry/Beast Mounted/Branth/Beast Infantry (Branth)(Gyrojet).blk
new file mode 100644
index 00000000000..e896b76f41b
--- /dev/null
+++ b/megamek/data/mechfiles/infantry/Beast Mounted/Branth/Beast Infantry (Branth)(Gyrojet).blk
@@ -0,0 +1,61 @@
+#building block data file
+
+1
+
+
+##Write the version number just in case...
+
+MAM0
+
+
+
+Infantry
+
+
+
+Beast Infantry (Branth)
+
+
+
+(Gyrojet)
+
+
+
+2680
+
+
+
+2680
+
+
+
+IS Level 3
+
+
+
+Beast:Branth
+
+
+
+
+
+
+7
+
+
+
+1
+
+
+
+Gyrojet Rifle
+
+
+
+5
+
+
+
+Generic Infantry Kit
+
+
diff --git a/megamek/data/mechfiles/infantry/Beast Mounted/Branth/Beast Infantry (Branth)(Laser Rifle).blk b/megamek/data/mechfiles/infantry/Beast Mounted/Branth/Beast Infantry (Branth)(Laser Rifle).blk
new file mode 100644
index 00000000000..ebcd449140c
--- /dev/null
+++ b/megamek/data/mechfiles/infantry/Beast Mounted/Branth/Beast Infantry (Branth)(Laser Rifle).blk
@@ -0,0 +1,57 @@
+#building block data file
+
+1
+
+
+##Write the version number just in case...
+
+MAM0
+
+
+
+Infantry
+
+
+
+Beast Infantry (Branth)
+
+
+
+(Laser Rifle)
+
+
+
+2401
+
+
+
+2401
+
+
+
+IS Level 3
+
+
+
+Beast:Branth
+
+
+
+
+
+
+7
+
+
+
+1
+
+
+
+Laser Rifle
+
+
+
+Generic Infantry Kit
+
+
diff --git a/megamek/data/mechfiles/infantry/Beast Mounted/Branth/Beast Infantry (Branth)(Needler).blk b/megamek/data/mechfiles/infantry/Beast Mounted/Branth/Beast Infantry (Branth)(Needler).blk
new file mode 100644
index 00000000000..a96038d99e5
--- /dev/null
+++ b/megamek/data/mechfiles/infantry/Beast Mounted/Branth/Beast Infantry (Branth)(Needler).blk
@@ -0,0 +1,61 @@
+#building block data file
+
+1
+
+
+##Write the version number just in case...
+
+MAM0
+
+
+
+Infantry
+
+
+
+Beast Infantry (Branth)
+
+
+
+(Needler)
+
+
+
+2680
+
+
+
+2680
+
+
+
+IS Level 3
+
+
+
+Beast:Branth
+
+
+
+
+
+
+7
+
+
+
+1
+
+
+
+Needler Rifle
+
+
+
+5
+
+
+
+Generic Infantry Kit
+
+
diff --git a/megamek/data/mechfiles/infantry/Beast Mounted/Branth/Beast Infantry (Branth)(Pulse Laser).blk b/megamek/data/mechfiles/infantry/Beast Mounted/Branth/Beast Infantry (Branth)(Pulse Laser).blk
new file mode 100644
index 00000000000..230dcb4c0da
--- /dev/null
+++ b/megamek/data/mechfiles/infantry/Beast Mounted/Branth/Beast Infantry (Branth)(Pulse Laser).blk
@@ -0,0 +1,61 @@
+#building block data file
+
+1
+
+
+##Write the version number just in case...
+
+MAM0
+
+
+
+Infantry
+
+
+
+Beast Infantry (Branth)
+
+
+
+(Pulse Laser)
+
+
+
+2680
+
+
+
+2680
+
+
+
+IS Level 3
+
+
+
+Beast:Branth
+
+
+
+
+
+
+7
+
+
+
+1
+
+
+
+Pulse Laser Rifle (Inner Sphere)
+
+
+
+5
+
+
+
+Generic Infantry Kit
+
+
diff --git a/megamek/data/mechfiles/infantry/Beast Mounted/Branth/Beast Infantry (Branth)(SMG).blk b/megamek/data/mechfiles/infantry/Beast Mounted/Branth/Beast Infantry (Branth)(SMG).blk
new file mode 100644
index 00000000000..b7fff2fc755
--- /dev/null
+++ b/megamek/data/mechfiles/infantry/Beast Mounted/Branth/Beast Infantry (Branth)(SMG).blk
@@ -0,0 +1,57 @@
+#building block data file
+
+1
+
+
+##Write the version number just in case...
+
+MAM0
+
+
+
+Infantry
+
+
+
+Beast Infantry (Branth)
+
+
+
+(SMG)
+
+
+
+2401
+
+
+
+2401
+
+
+
+IS Level 3
+
+
+
+Beast:Branth
+
+
+
+
+
+
+7
+
+
+
+1
+
+
+
+Submachine Gun
+
+
+
+Generic Infantry Kit
+
+
diff --git a/megamek/data/mechfiles/infantry/Beast Mounted/Branth/Beast Infantry (Branth)(Shotgun).blk b/megamek/data/mechfiles/infantry/Beast Mounted/Branth/Beast Infantry (Branth)(Shotgun).blk
new file mode 100644
index 00000000000..8a972c94a5b
--- /dev/null
+++ b/megamek/data/mechfiles/infantry/Beast Mounted/Branth/Beast Infantry (Branth)(Shotgun).blk
@@ -0,0 +1,61 @@
+#building block data file
+
+1
+
+
+##Write the version number just in case...
+
+MAM0
+
+
+
+Infantry
+
+
+
+Beast Infantry (Branth)
+
+
+
+(Shotgun)
+
+
+
+2680
+
+
+
+2680
+
+
+
+IS Level 3
+
+
+
+Beast:Branth
+
+
+
+
+
+
+7
+
+
+
+1
+
+
+
+Auto-Shotgun
+
+
+
+5
+
+
+
+Generic Infantry Kit
+
+
diff --git a/megamek/data/mechfiles/infantry/Beast Mounted/Branth/Beast Infantry (Branth)(Sniper).blk b/megamek/data/mechfiles/infantry/Beast Mounted/Branth/Beast Infantry (Branth)(Sniper).blk
new file mode 100644
index 00000000000..acbfaca839c
--- /dev/null
+++ b/megamek/data/mechfiles/infantry/Beast Mounted/Branth/Beast Infantry (Branth)(Sniper).blk
@@ -0,0 +1,61 @@
+#building block data file
+
+1
+
+
+##Write the version number just in case...
+
+MAM0
+
+
+
+Infantry
+
+
+
+Beast Infantry (Branth)
+
+
+
+(Sniper)
+
+
+
+2500
+
+
+
+2500
+
+
+
+IS Level 3
+
+
+
+Beast:Branth
+
+
+
+
+
+
+7
+
+
+
+1
+
+
+
+Sniper Rifle (Bolt Action)
+
+
+
+5
+
+
+
+Generic Infantry Kit
+
+
diff --git a/megamek/data/mechfiles/infantry/Beast Mounted/Camel/Beast Infantry (Camel)(Auto Rifle).blk b/megamek/data/mechfiles/infantry/Beast Mounted/Camel/Beast Infantry (Camel)(Auto Rifle).blk
new file mode 100644
index 00000000000..7c5c46c8058
--- /dev/null
+++ b/megamek/data/mechfiles/infantry/Beast Mounted/Camel/Beast Infantry (Camel)(Auto Rifle).blk
@@ -0,0 +1,61 @@
+#building block data file
+
+1
+
+
+##Write the version number just in case...
+
+MAM0
+
+
+
+Infantry
+
+
+
+Beast Infantry (Camel)
+
+
+
+(Auto-Rifle)
+
+
+
+2000
+
+
+
+2000
+
+
+
+IS Level 3
+
+
+
+Beast:Camel
+
+
+
+
+
+
+7
+
+
+
+3
+
+
+
+InfantryAssaultRifle
+
+
+
+5
+
+
+
+Clothing, Fatigues/Civilian/Non-Armored
+
+
diff --git a/megamek/data/mechfiles/infantry/Beast Mounted/Camel/Beast Infantry (Camel)(Gyrojet).blk b/megamek/data/mechfiles/infantry/Beast Mounted/Camel/Beast Infantry (Camel)(Gyrojet).blk
new file mode 100644
index 00000000000..eda6f3b2dec
--- /dev/null
+++ b/megamek/data/mechfiles/infantry/Beast Mounted/Camel/Beast Infantry (Camel)(Gyrojet).blk
@@ -0,0 +1,61 @@
+#building block data file
+
+1
+
+
+##Write the version number just in case...
+
+MAM0
+
+
+
+Infantry
+
+
+
+Beast Infantry (Camel)
+
+
+
+(Gyrojet)
+
+
+
+2680
+
+
+
+2680
+
+
+
+IS Level 3
+
+
+
+Beast:Camel
+
+
+
+
+
+
+7
+
+
+
+3
+
+
+
+Gyrojet Rifle
+
+
+
+5
+
+
+
+Generic Infantry Kit
+
+
diff --git a/megamek/data/mechfiles/infantry/Beast Mounted/Camel/Beast Infantry (Camel)(Laser Rifle).blk b/megamek/data/mechfiles/infantry/Beast Mounted/Camel/Beast Infantry (Camel)(Laser Rifle).blk
new file mode 100644
index 00000000000..c3226da46dd
--- /dev/null
+++ b/megamek/data/mechfiles/infantry/Beast Mounted/Camel/Beast Infantry (Camel)(Laser Rifle).blk
@@ -0,0 +1,61 @@
+#building block data file
+
+1
+
+
+##Write the version number just in case...
+
+MAM0
+
+
+
+Infantry
+
+
+
+Beast Infantry (Camel)
+
+
+
+(Laser Rifle)
+
+
+
+2230
+
+
+
+2230
+
+
+
+IS Level 3
+
+
+
+Beast:Camel
+
+
+
+
+
+
+7
+
+
+
+3
+
+
+
+Laser Rifle
+
+
+
+5
+
+
+
+Generic Infantry Kit
+
+
diff --git a/megamek/data/mechfiles/infantry/Beast Mounted/Camel/Beast Infantry (Camel)(Needler).blk b/megamek/data/mechfiles/infantry/Beast Mounted/Camel/Beast Infantry (Camel)(Needler).blk
new file mode 100644
index 00000000000..8d1833b632b
--- /dev/null
+++ b/megamek/data/mechfiles/infantry/Beast Mounted/Camel/Beast Infantry (Camel)(Needler).blk
@@ -0,0 +1,61 @@
+#building block data file
+
+1
+
+
+##Write the version number just in case...
+
+MAM0
+
+
+
+Infantry
+
+
+
+Beast Infantry (Camel)
+
+
+
+(Needler)
+
+
+
+2680
+
+
+
+2680
+
+
+
+IS Level 3
+
+
+
+Beast:Camel
+
+
+
+
+
+
+7
+
+
+
+3
+
+
+
+Needler Rifle
+
+
+
+5
+
+
+
+Generic Infantry Kit
+
+
diff --git a/megamek/data/mechfiles/infantry/Beast Mounted/Camel/Beast Infantry (Camel)(Pulse Laser).blk b/megamek/data/mechfiles/infantry/Beast Mounted/Camel/Beast Infantry (Camel)(Pulse Laser).blk
new file mode 100644
index 00000000000..7b610ff75eb
--- /dev/null
+++ b/megamek/data/mechfiles/infantry/Beast Mounted/Camel/Beast Infantry (Camel)(Pulse Laser).blk
@@ -0,0 +1,61 @@
+#building block data file
+
+1
+
+
+##Write the version number just in case...
+
+MAM0
+
+
+
+Infantry
+
+
+
+Beast Infantry (Camel)
+
+
+
+(Pulse Laser)
+
+
+
+2680
+
+
+
+2680
+
+
+
+IS Level 3
+
+
+
+Beast:Camel
+
+
+
+
+
+
+7
+
+
+
+3
+
+
+
+Pulse Laser Rifle (Inner Sphere)
+
+
+
+5
+
+
+
+Generic Infantry Kit
+
+
diff --git a/megamek/data/mechfiles/infantry/Beast Mounted/Camel/Beast Infantry (Camel)(SMG).blk b/megamek/data/mechfiles/infantry/Beast Mounted/Camel/Beast Infantry (Camel)(SMG).blk
new file mode 100644
index 00000000000..a37c06bfedb
--- /dev/null
+++ b/megamek/data/mechfiles/infantry/Beast Mounted/Camel/Beast Infantry (Camel)(SMG).blk
@@ -0,0 +1,61 @@
+#building block data file
+
+1
+
+
+##Write the version number just in case...
+
+MAM0
+
+
+
+Infantry
+
+
+
+Beast Infantry (Camel)
+
+
+
+(SMG)
+
+
+
+2300
+
+
+
+2300
+
+
+
+IS Level 3
+
+
+
+Beast:Camel
+
+
+
+
+
+
+7
+
+
+
+3
+
+
+
+Submachine Gun
+
+
+
+5
+
+
+
+Generic Infantry Kit
+
+
diff --git a/megamek/data/mechfiles/infantry/Beast Mounted/Camel/Beast Infantry (Camel)(Shotgun).blk b/megamek/data/mechfiles/infantry/Beast Mounted/Camel/Beast Infantry (Camel)(Shotgun).blk
new file mode 100644
index 00000000000..698d328f0db
--- /dev/null
+++ b/megamek/data/mechfiles/infantry/Beast Mounted/Camel/Beast Infantry (Camel)(Shotgun).blk
@@ -0,0 +1,61 @@
+#building block data file
+
+1
+
+
+##Write the version number just in case...
+
+MAM0
+
+
+
+Infantry
+
+
+
+Beast Infantry (Camel)
+
+
+
+(Shotgun)
+
+
+
+2680
+
+
+
+2680
+
+
+
+IS Level 3
+
+
+
+Beast:Camel
+
+
+
+
+
+
+7
+
+
+
+3
+
+
+
+Auto-Shotgun
+
+
+
+5
+
+
+
+Generic Infantry Kit
+
+
diff --git a/megamek/data/mechfiles/infantry/Beast Mounted/Camel/Beast Infantry (Camel)(Sniper).blk b/megamek/data/mechfiles/infantry/Beast Mounted/Camel/Beast Infantry (Camel)(Sniper).blk
new file mode 100644
index 00000000000..cd840dc41bd
--- /dev/null
+++ b/megamek/data/mechfiles/infantry/Beast Mounted/Camel/Beast Infantry (Camel)(Sniper).blk
@@ -0,0 +1,61 @@
+#building block data file
+
+1
+
+
+##Write the version number just in case...
+
+MAM0
+
+
+
+Infantry
+
+
+
+Beast Infantry (Camel)
+
+
+
+(Sniper)
+
+
+
+2500
+
+
+
+2500
+
+
+
+IS Level 3
+
+
+
+Beast:Camel
+
+
+
+
+
+
+7
+
+
+
+3
+
+
+
+Sniper Rifle (Bolt Action)
+
+
+
+5
+
+
+
+Generic Infantry Kit
+
+
diff --git a/megamek/data/mechfiles/infantry/Beast Mounted/Coventry Kangaroo/Beast Infantry (Kangaroo)(Auto Rifle).blk b/megamek/data/mechfiles/infantry/Beast Mounted/Coventry Kangaroo/Beast Infantry (Kangaroo)(Auto Rifle).blk
new file mode 100644
index 00000000000..8cd49629a3d
--- /dev/null
+++ b/megamek/data/mechfiles/infantry/Beast Mounted/Coventry Kangaroo/Beast Infantry (Kangaroo)(Auto Rifle).blk
@@ -0,0 +1,61 @@
+#building block data file
+
+1
+
+
+##Write the version number just in case...
+
+MAM0
+
+
+
+Infantry
+
+
+
+Beast Infantry (Kangaroo)
+
+
+
+(Auto-Rifle)
+
+
+
+2380
+
+
+
+2380
+
+
+
+IS Level 3
+
+
+
+Beast:Coventry Kangaroo
+
+
+
+
+
+
+7
+
+
+
+3
+
+
+
+InfantryAssaultRifle
+
+
+
+5
+
+
+
+Clothing, Fatigues/Civilian/Non-Armored
+
+
diff --git a/megamek/data/mechfiles/infantry/Beast Mounted/Coventry Kangaroo/Beast Infantry (Kangaroo)(Gyrojet).blk b/megamek/data/mechfiles/infantry/Beast Mounted/Coventry Kangaroo/Beast Infantry (Kangaroo)(Gyrojet).blk
new file mode 100644
index 00000000000..ce18e845153
--- /dev/null
+++ b/megamek/data/mechfiles/infantry/Beast Mounted/Coventry Kangaroo/Beast Infantry (Kangaroo)(Gyrojet).blk
@@ -0,0 +1,61 @@
+#building block data file
+
+1
+
+
+##Write the version number just in case...
+
+MAM0
+
+
+
+Infantry
+
+
+
+Beast Infantry (Kangaroo)
+
+
+
+(Gyrojet)
+
+
+
+2680
+
+
+
+2680
+
+
+
+IS Level 3
+
+
+
+Beast:Coventry Kangaroo
+
+
+
+
+
+
+7
+
+
+
+3
+
+
+
+Gyrojet Rifle
+
+
+
+5
+
+
+
+Generic Infantry Kit
+
+
diff --git a/megamek/data/mechfiles/infantry/Beast Mounted/Coventry Kangaroo/Beast Infantry (Kangaroo)(Laser Rifle).blk b/megamek/data/mechfiles/infantry/Beast Mounted/Coventry Kangaroo/Beast Infantry (Kangaroo)(Laser Rifle).blk
new file mode 100644
index 00000000000..8d0ff35d185
--- /dev/null
+++ b/megamek/data/mechfiles/infantry/Beast Mounted/Coventry Kangaroo/Beast Infantry (Kangaroo)(Laser Rifle).blk
@@ -0,0 +1,61 @@
+#building block data file
+
+1
+
+
+##Write the version number just in case...
+
+MAM0
+
+
+
+Infantry
+
+
+
+Beast Infantry (Kangaroo)
+
+
+
+(Laser Rifle)
+
+
+
+2340
+
+
+
+2340
+
+
+
+IS Level 3
+
+
+
+Beast:Coventry Kangaroo
+
+
+
+
+
+
+7
+
+
+
+3
+
+
+
+Laser Rifle
+
+
+
+5
+
+
+
+Generic Infantry Kit
+
+
diff --git a/megamek/data/mechfiles/infantry/Beast Mounted/Coventry Kangaroo/Beast Infantry (Kangaroo)(Needler).blk b/megamek/data/mechfiles/infantry/Beast Mounted/Coventry Kangaroo/Beast Infantry (Kangaroo)(Needler).blk
new file mode 100644
index 00000000000..6cfd9dda540
--- /dev/null
+++ b/megamek/data/mechfiles/infantry/Beast Mounted/Coventry Kangaroo/Beast Infantry (Kangaroo)(Needler).blk
@@ -0,0 +1,61 @@
+#building block data file
+
+1
+
+
+##Write the version number just in case...
+
+MAM0
+
+
+
+Infantry
+
+
+
+Beast Infantry (Kangaroo)
+
+
+
+(Needler)
+
+
+
+2680
+
+
+
+2680
+
+
+
+IS Level 3
+
+
+
+Beast:Coventry Kangaroo
+
+
+
+
+
+
+7
+
+
+
+3
+
+
+
+Needler Rifle
+
+
+
+5
+
+
+
+Generic Infantry Kit
+
+
diff --git a/megamek/data/mechfiles/infantry/Beast Mounted/Coventry Kangaroo/Beast Infantry (Kangaroo)(Pulse Laser).blk b/megamek/data/mechfiles/infantry/Beast Mounted/Coventry Kangaroo/Beast Infantry (Kangaroo)(Pulse Laser).blk
new file mode 100644
index 00000000000..a5ce67dd644
--- /dev/null
+++ b/megamek/data/mechfiles/infantry/Beast Mounted/Coventry Kangaroo/Beast Infantry (Kangaroo)(Pulse Laser).blk
@@ -0,0 +1,61 @@
+#building block data file
+
+1
+
+
+##Write the version number just in case...
+
+MAM0
+
+
+
+Infantry
+
+
+
+Beast Infantry (Kangaroo)
+
+
+
+(Pulse Laser)
+
+
+
+2680
+
+
+
+2680
+
+
+
+IS Level 3
+
+
+
+Beast:Coventry Kangaroo
+
+
+
+
+
+
+7
+
+
+
+3
+
+
+
+Pulse Laser Rifle (Inner Sphere)
+
+
+
+5
+
+
+
+Generic Infantry Kit
+
+
diff --git a/megamek/data/mechfiles/infantry/Beast Mounted/Coventry Kangaroo/Beast Infantry (Kangaroo)(SMG).blk b/megamek/data/mechfiles/infantry/Beast Mounted/Coventry Kangaroo/Beast Infantry (Kangaroo)(SMG).blk
new file mode 100644
index 00000000000..a84eea0fdb0
--- /dev/null
+++ b/megamek/data/mechfiles/infantry/Beast Mounted/Coventry Kangaroo/Beast Infantry (Kangaroo)(SMG).blk
@@ -0,0 +1,61 @@
+#building block data file
+
+1
+
+
+##Write the version number just in case...
+
+MAM0
+
+
+
+Infantry
+
+
+
+Beast Infantry (Kangaroo)
+
+
+
+(SMG)
+
+
+
+2340
+
+
+
+2340
+
+
+
+IS Level 3
+
+
+
+Beast:Coventry Kangaroo
+
+
+
+
+
+
+7
+
+
+
+3
+
+
+
+Submachine Gun
+
+
+
+5
+
+
+
+Generic Infantry Kit
+
+
diff --git a/megamek/data/mechfiles/infantry/Beast Mounted/Coventry Kangaroo/Beast Infantry (Kangaroo)(Shotgun).blk b/megamek/data/mechfiles/infantry/Beast Mounted/Coventry Kangaroo/Beast Infantry (Kangaroo)(Shotgun).blk
new file mode 100644
index 00000000000..d5e5e1db0c5
--- /dev/null
+++ b/megamek/data/mechfiles/infantry/Beast Mounted/Coventry Kangaroo/Beast Infantry (Kangaroo)(Shotgun).blk
@@ -0,0 +1,61 @@
+#building block data file
+
+1
+
+
+##Write the version number just in case...
+
+MAM0
+
+
+
+Infantry
+
+
+
+Beast Infantry (Kangaroo)
+
+
+
+(Shotgun)
+
+
+
+2680
+
+
+
+2680
+
+
+
+IS Level 3
+
+
+
+Beast:Coventry Kangaroo
+
+
+
+
+
+
+7
+
+
+
+3
+
+
+
+Auto-Shotgun
+
+
+
+5
+
+
+
+Generic Infantry Kit
+
+
diff --git a/megamek/data/mechfiles/infantry/Beast Mounted/Coventry Kangaroo/Beast Infantry (Kangaroo)(Sniper).blk b/megamek/data/mechfiles/infantry/Beast Mounted/Coventry Kangaroo/Beast Infantry (Kangaroo)(Sniper).blk
new file mode 100644
index 00000000000..ce8bfacf847
--- /dev/null
+++ b/megamek/data/mechfiles/infantry/Beast Mounted/Coventry Kangaroo/Beast Infantry (Kangaroo)(Sniper).blk
@@ -0,0 +1,61 @@
+#building block data file
+
+1
+
+
+##Write the version number just in case...
+
+MAM0
+
+
+
+Infantry
+
+
+
+Beast Infantry (Kangaroo)
+
+
+
+(Sniper)
+
+
+
+2380
+
+
+
+2380
+
+
+
+IS Level 3
+
+
+
+Beast:Coventry Kangaroo
+
+
+
+
+
+
+7
+
+
+
+3
+
+
+
+Sniper Rifle (Bolt Action)
+
+
+
+5
+
+
+
+Generic Infantry Kit
+
+
diff --git a/megamek/data/mechfiles/infantry/Beast Mounted/Donkey/Beast Infantry (Donkey)(Auto Rifle).blk b/megamek/data/mechfiles/infantry/Beast Mounted/Donkey/Beast Infantry (Donkey)(Auto Rifle).blk
new file mode 100644
index 00000000000..47fa0da618f
--- /dev/null
+++ b/megamek/data/mechfiles/infantry/Beast Mounted/Donkey/Beast Infantry (Donkey)(Auto Rifle).blk
@@ -0,0 +1,61 @@
+#building block data file
+
+1
+
+
+##Write the version number just in case...
+
+MAM0
+
+
+
+Infantry
+
+
+
+Beast Infantry (Donkey)
+
+
+
+(Auto-Rifle)
+
+
+
+2000
+
+
+
+2000
+
+
+
+IS Level 3
+
+
+
+Beast:Donkey
+
+
+
+
+
+
+7
+
+
+
+3
+
+
+
+InfantryAssaultRifle
+
+
+
+5
+
+
+
+Clothing, Fatigues/Civilian/Non-Armored
+
+
diff --git a/megamek/data/mechfiles/infantry/Beast Mounted/Donkey/Beast Infantry (Donkey)(Gyrojet).blk b/megamek/data/mechfiles/infantry/Beast Mounted/Donkey/Beast Infantry (Donkey)(Gyrojet).blk
new file mode 100644
index 00000000000..26592f00d94
--- /dev/null
+++ b/megamek/data/mechfiles/infantry/Beast Mounted/Donkey/Beast Infantry (Donkey)(Gyrojet).blk
@@ -0,0 +1,61 @@
+#building block data file
+
+1
+
+
+##Write the version number just in case...
+
+MAM0
+
+
+
+Infantry
+
+
+
+Beast Infantry (Donkey)
+
+
+
+(Gyrojet)
+
+
+
+2680
+
+
+
+2680
+
+
+
+IS Level 3
+
+
+
+Beast:Donkey
+
+
+
+
+
+
+7
+
+
+
+3
+
+
+
+Gyrojet Rifle
+
+
+
+5
+
+
+
+Generic Infantry Kit
+
+
diff --git a/megamek/data/mechfiles/infantry/Beast Mounted/Donkey/Beast Infantry (Donkey)(Laser Rifle).blk b/megamek/data/mechfiles/infantry/Beast Mounted/Donkey/Beast Infantry (Donkey)(Laser Rifle).blk
new file mode 100644
index 00000000000..953b07aae80
--- /dev/null
+++ b/megamek/data/mechfiles/infantry/Beast Mounted/Donkey/Beast Infantry (Donkey)(Laser Rifle).blk
@@ -0,0 +1,61 @@
+#building block data file
+
+1
+
+
+##Write the version number just in case...
+
+MAM0
+
+
+
+Infantry
+
+
+
+Beast Infantry (Donkey)
+
+
+
+(Laser Rifle)
+
+
+
+2230
+
+
+
+2230
+
+
+
+IS Level 3
+
+
+
+Beast:Donkey
+
+
+
+
+
+
+7
+
+
+
+3
+
+
+
+Laser Rifle
+
+
+
+5
+
+
+
+Generic Infantry Kit
+
+
diff --git a/megamek/data/mechfiles/infantry/Beast Mounted/Donkey/Beast Infantry (Donkey)(Needler).blk b/megamek/data/mechfiles/infantry/Beast Mounted/Donkey/Beast Infantry (Donkey)(Needler).blk
new file mode 100644
index 00000000000..3c9abf3dce1
--- /dev/null
+++ b/megamek/data/mechfiles/infantry/Beast Mounted/Donkey/Beast Infantry (Donkey)(Needler).blk
@@ -0,0 +1,61 @@
+#building block data file
+
+1
+
+
+##Write the version number just in case...
+
+MAM0
+
+
+
+Infantry
+
+
+
+Beast Infantry (Donkey)
+
+
+
+(Needler)
+
+
+
+2680
+
+
+
+2680
+
+
+
+IS Level 3
+
+
+
+Beast:Donkey
+
+
+
+
+
+
+7
+
+
+
+3
+
+
+
+Needler Rifle
+
+
+
+5
+
+
+
+Generic Infantry Kit
+
+
diff --git a/megamek/data/mechfiles/infantry/Beast Mounted/Donkey/Beast Infantry (Donkey)(Pulse Laser).blk b/megamek/data/mechfiles/infantry/Beast Mounted/Donkey/Beast Infantry (Donkey)(Pulse Laser).blk
new file mode 100644
index 00000000000..0751007cc22
--- /dev/null
+++ b/megamek/data/mechfiles/infantry/Beast Mounted/Donkey/Beast Infantry (Donkey)(Pulse Laser).blk
@@ -0,0 +1,61 @@
+#building block data file
+
+1
+
+
+##Write the version number just in case...
+
+MAM0
+
+
+
+Infantry
+
+
+
+Beast Infantry (Donkey)
+
+
+
+(Pulse Laser)
+
+
+
+2680
+
+
+
+2680
+
+
+
+IS Level 3
+
+
+
+Beast:Donkey
+
+
+
+
+
+
+7
+
+
+
+3
+
+
+
+Pulse Laser Rifle (Inner Sphere)
+
+
+
+5
+
+
+
+Generic Infantry Kit
+
+
diff --git a/megamek/data/mechfiles/infantry/Beast Mounted/Donkey/Beast Infantry (Donkey)(SMG).blk b/megamek/data/mechfiles/infantry/Beast Mounted/Donkey/Beast Infantry (Donkey)(SMG).blk
new file mode 100644
index 00000000000..3dcf440a13b
--- /dev/null
+++ b/megamek/data/mechfiles/infantry/Beast Mounted/Donkey/Beast Infantry (Donkey)(SMG).blk
@@ -0,0 +1,61 @@
+#building block data file
+
+1
+
+
+##Write the version number just in case...
+
+MAM0
+
+
+
+Infantry
+
+
+
+Beast Infantry (Donkey)
+
+
+
+(SMG)
+
+
+
+2300
+
+
+
+2300
+
+
+
+IS Level 3
+
+
+
+Beast:Donkey
+
+
+
+
+
+
+7
+
+
+
+3
+
+
+
+Submachine Gun
+
+
+
+5
+
+
+
+Generic Infantry Kit
+
+
diff --git a/megamek/data/mechfiles/infantry/Beast Mounted/Donkey/Beast Infantry (Donkey)(Shotgun).blk b/megamek/data/mechfiles/infantry/Beast Mounted/Donkey/Beast Infantry (Donkey)(Shotgun).blk
new file mode 100644
index 00000000000..a98f2aa4db9
--- /dev/null
+++ b/megamek/data/mechfiles/infantry/Beast Mounted/Donkey/Beast Infantry (Donkey)(Shotgun).blk
@@ -0,0 +1,61 @@
+#building block data file
+
+1
+
+
+##Write the version number just in case...
+
+MAM0
+
+
+
+Infantry
+
+
+
+Beast Infantry (Donkey)
+
+
+
+(Shotgun)
+
+
+
+2680
+
+
+
+2680
+
+
+
+IS Level 3
+
+
+
+Beast:Donkey
+
+
+
+
+
+
+7
+
+
+
+3
+
+
+
+Auto-Shotgun
+
+
+
+5
+
+
+
+Generic Infantry Kit
+
+
diff --git a/megamek/data/mechfiles/infantry/Beast Mounted/Donkey/Beast Infantry (Donkey)(Sniper).blk b/megamek/data/mechfiles/infantry/Beast Mounted/Donkey/Beast Infantry (Donkey)(Sniper).blk
new file mode 100644
index 00000000000..5a36c3f50c9
--- /dev/null
+++ b/megamek/data/mechfiles/infantry/Beast Mounted/Donkey/Beast Infantry (Donkey)(Sniper).blk
@@ -0,0 +1,61 @@
+#building block data file
+
+1
+
+
+##Write the version number just in case...
+
+MAM0
+
+
+
+Infantry
+
+
+
+Beast Infantry (Donkey)
+
+
+
+(Sniper)
+
+
+
+2500
+
+
+
+2500
+
+
+
+IS Level 3
+
+
+
+Beast:Donkey
+
+
+
+
+
+
+7
+
+
+
+3
+
+
+
+Sniper Rifle (Bolt Action)
+
+
+
+5
+
+
+
+Generic Infantry Kit
+
+
diff --git a/megamek/data/mechfiles/infantry/Beast Mounted/Elephant/Beast Infantry (Elephant)(Auto-Rifle_MG).blk b/megamek/data/mechfiles/infantry/Beast Mounted/Elephant/Beast Infantry (Elephant)(Auto-Rifle_MG).blk
new file mode 100644
index 00000000000..5d1b1348e8d
--- /dev/null
+++ b/megamek/data/mechfiles/infantry/Beast Mounted/Elephant/Beast Infantry (Elephant)(Auto-Rifle_MG).blk
@@ -0,0 +1,73 @@
+#building block data file
+
+1
+
+
+##Write the version number just in case...
+
+MAM0
+
+
+
+Infantry
+
+
+
+Beast Infantry (Elephant)
+
+
+
+(Auto-Rifle/MG)
+
+
+
+2000
+
+
+
+2000
+
+
+
+IS Level 3
+
+
+
+Beast:Elephant
+
+
+
+
+
+
+2
+
+
+
+5
+
+
+
+1
+
+
+
+InfantryAssaultRifle
+
+
+
+Machine Gun (Support)
+
+
+
+5
+
+
+
+Clothing, Fatigues/Civilian/Non-Armored
+
+
+
+2.0
+
+
diff --git a/megamek/data/mechfiles/infantry/Beast Mounted/Elephant/Beast Infantry (Elephant)(Gyrojet_GL).blk b/megamek/data/mechfiles/infantry/Beast Mounted/Elephant/Beast Infantry (Elephant)(Gyrojet_GL).blk
new file mode 100644
index 00000000000..e3281229497
--- /dev/null
+++ b/megamek/data/mechfiles/infantry/Beast Mounted/Elephant/Beast Infantry (Elephant)(Gyrojet_GL).blk
@@ -0,0 +1,69 @@
+#building block data file
+
+1
+
+
+##Write the version number just in case...
+
+MAM0
+
+
+
+Infantry
+
+
+
+Beast Infantry (Elephant)
+
+
+
+(Gyrojet/GL)
+
+
+
+2680
+
+
+
+2680
+
+
+
+IS Level 3
+
+
+
+Beast:Elephant
+
+
+
+
+
+
+2
+
+
+
+5
+
+
+
+1
+
+
+
+Gyrojet Rifle
+
+
+
+InfantryAutoGL
+
+
+
+5
+
+
+
+Clothing, Fatigues/Civilian/Non-Armored
+
+
diff --git a/megamek/data/mechfiles/infantry/Beast Mounted/Elephant/Beast Infantry (Elephant)(Laser Rifle_MRR).blk b/megamek/data/mechfiles/infantry/Beast Mounted/Elephant/Beast Infantry (Elephant)(Laser Rifle_MRR).blk
new file mode 100644
index 00000000000..08b36053964
--- /dev/null
+++ b/megamek/data/mechfiles/infantry/Beast Mounted/Elephant/Beast Infantry (Elephant)(Laser Rifle_MRR).blk
@@ -0,0 +1,69 @@
+#building block data file
+
+1
+
+
+##Write the version number just in case...
+
+MAM0
+
+
+
+Infantry
+
+
+
+Beast Infantry (Elephant)
+
+
+
+(Laser Refile/MRR)
+
+
+
+2230
+
+
+
+2230
+
+
+
+IS Level 3
+
+
+
+Beast:Elephant
+
+
+
+
+
+
+2
+
+
+
+5
+
+
+
+1
+
+
+
+Laser Rifle
+
+
+
+InfantryMRR
+
+
+
+5
+
+
+
+Clothing, Fatigues/Civilian/Non-Armored
+
+
diff --git a/megamek/data/mechfiles/infantry/Beast Mounted/Elephant/Beast Infantry (Elephant)(Laser Rifle_Support PPC).blk b/megamek/data/mechfiles/infantry/Beast Mounted/Elephant/Beast Infantry (Elephant)(Laser Rifle_Support PPC).blk
new file mode 100644
index 00000000000..5f09e7c2d49
--- /dev/null
+++ b/megamek/data/mechfiles/infantry/Beast Mounted/Elephant/Beast Infantry (Elephant)(Laser Rifle_Support PPC).blk
@@ -0,0 +1,69 @@
+#building block data file
+
+1
+
+
+##Write the version number just in case...
+
+MAM0
+
+
+
+Infantry
+
+
+
+Beast Infantry (Elephant)
+
+
+
+(Laser Rifle/Support PPC)
+
+
+
+2680
+
+
+
+2680
+
+
+
+IS Level 3
+
+
+
+Beast:Elephant
+
+
+
+
+
+
+2
+
+
+
+5
+
+
+
+1
+
+
+
+Laser Rifle
+
+
+
+Particle Cannon (Semi-Portable)
+
+
+
+5
+
+
+
+Clothing, Fatigues/Civilian/Non-Armored
+
+
diff --git a/megamek/data/mechfiles/infantry/Beast Mounted/Elephant/Beast Infantry (Elephant)(Needler_SRM).blk b/megamek/data/mechfiles/infantry/Beast Mounted/Elephant/Beast Infantry (Elephant)(Needler_SRM).blk
new file mode 100644
index 00000000000..d3bd45e09c6
--- /dev/null
+++ b/megamek/data/mechfiles/infantry/Beast Mounted/Elephant/Beast Infantry (Elephant)(Needler_SRM).blk
@@ -0,0 +1,69 @@
+#building block data file
+
+1
+
+
+##Write the version number just in case...
+
+MAM0
+
+
+
+Infantry
+
+
+
+Beast Infantry (Elephant)
+
+
+
+(Needler/SRM)
+
+
+
+2680
+
+
+
+2680
+
+
+
+IS Level 3
+
+
+
+Beast:Elephant
+
+
+
+
+
+
+2
+
+
+
+5
+
+
+
+1
+
+
+
+Needler Rifle
+
+
+
+InfantryStandardSRMInferno
+
+
+
+5
+
+
+
+Clothing, Fatigues/Civilian/Non-Armored
+
+
diff --git a/megamek/data/mechfiles/infantry/Beast Mounted/Elephant/Beast Infantry (Elephant)(Pistol_Mortar).blk b/megamek/data/mechfiles/infantry/Beast Mounted/Elephant/Beast Infantry (Elephant)(Pistol_Mortar).blk
new file mode 100644
index 00000000000..c5674f4a553
--- /dev/null
+++ b/megamek/data/mechfiles/infantry/Beast Mounted/Elephant/Beast Infantry (Elephant)(Pistol_Mortar).blk
@@ -0,0 +1,69 @@
+#building block data file
+
+1
+
+
+##Write the version number just in case...
+
+MAM0
+
+
+
+Infantry
+
+
+
+Beast Infantry (Elephant)
+
+
+
+(Pistol/Mortar)
+
+
+
+2000
+
+
+
+2000
+
+
+
+IS Level 3
+
+
+
+Beast:Elephant
+
+
+
+
+
+
+2
+
+
+
+5
+
+
+
+1
+
+
+
+InfantryAssaultRifle
+
+
+
+InfantryLightMortar
+
+
+
+5
+
+
+
+Clothing, Fatigues/Civilian/Non-Armored
+
+
diff --git a/megamek/data/mechfiles/infantry/Beast Mounted/Elephant/Beast Infantry (Elephant)(Pulse Laser_Plasma Rifle).blk b/megamek/data/mechfiles/infantry/Beast Mounted/Elephant/Beast Infantry (Elephant)(Pulse Laser_Plasma Rifle).blk
new file mode 100644
index 00000000000..e363a55f715
--- /dev/null
+++ b/megamek/data/mechfiles/infantry/Beast Mounted/Elephant/Beast Infantry (Elephant)(Pulse Laser_Plasma Rifle).blk
@@ -0,0 +1,69 @@
+#building block data file
+
+1
+
+
+##Write the version number just in case...
+
+MAM0
+
+
+
+Infantry
+
+
+
+Beast Infantry (Elephant)
+
+
+
+(Pulse Laser/Plasma Rifle)
+
+
+
+3065
+
+
+
+3065
+
+
+
+IS Level 3
+
+
+
+Beast:Elephant
+
+
+
+
+
+
+2
+
+
+
+5
+
+
+
+1
+
+
+
+Pulse Laser Rifle (Inner Sphere)
+
+
+
+Plasma Rifle (Man-Portable)
+
+
+
+5
+
+
+
+Clothing, Fatigues/Civilian/Non-Armored
+
+
diff --git a/megamek/data/mechfiles/infantry/Beast Mounted/Elephant/Beast Infantry (Elephant)(Pulse Laser_Support Pulse).blk b/megamek/data/mechfiles/infantry/Beast Mounted/Elephant/Beast Infantry (Elephant)(Pulse Laser_Support Pulse).blk
new file mode 100644
index 00000000000..5a2fadb9294
--- /dev/null
+++ b/megamek/data/mechfiles/infantry/Beast Mounted/Elephant/Beast Infantry (Elephant)(Pulse Laser_Support Pulse).blk
@@ -0,0 +1,69 @@
+#building block data file
+
+1
+
+
+##Write the version number just in case...
+
+MAM0
+
+
+
+Infantry
+
+
+
+Beast Infantry (Elephant)
+
+
+
+(Pulse Laser/Support Pulse)
+
+
+
+2680
+
+
+
+2680
+
+
+
+IS Level 3
+
+
+
+Beast:Elephant
+
+
+
+
+
+
+2
+
+
+
+5
+
+
+
+1
+
+
+
+Pulse Laser Rifle (Inner Sphere)
+
+
+
+Support Pulse Laser
+
+
+
+5
+
+
+
+Clothing, Fatigues/Civilian/Non-Armored
+
+
diff --git a/megamek/data/mechfiles/infantry/Beast Mounted/Hipposaur/Beast Infantry (Hipposaur)(Auto-Rifle_Auto-Cannon).blk b/megamek/data/mechfiles/infantry/Beast Mounted/Hipposaur/Beast Infantry (Hipposaur)(Auto-Rifle_Auto-Cannon).blk
new file mode 100644
index 00000000000..3fce5bfec93
--- /dev/null
+++ b/megamek/data/mechfiles/infantry/Beast Mounted/Hipposaur/Beast Infantry (Hipposaur)(Auto-Rifle_Auto-Cannon).blk
@@ -0,0 +1,77 @@
+#building block data file
+
+1
+
+
+##Write the version number just in case...
+
+MAM0
+
+
+
+Infantry
+
+
+
+Beast Infantry (Hipposaur)
+
+
+
+(Auto-Rifle/Auto-Cannon)
+
+
+
+2750
+
+
+
+2750
+
+
+
+IS Level 3
+
+
+
+Beast:Hipposaur
+
+
+
+
+
+
+2
+
+
+
+4
+
+
+
+2
+
+
+
+InfantryAssaultRifle
+
+
+
+Autocannon (Semi-Portable)
+
+
+
+Environment Suit, Hostile
+
+
+
+true
+
+
+
+true
+
+
+
+4096
+
+
diff --git a/megamek/data/mechfiles/infantry/Beast Mounted/Hipposaur/Beast Infantry (Hipposaur)(Auto-Rifle_LRR).blk b/megamek/data/mechfiles/infantry/Beast Mounted/Hipposaur/Beast Infantry (Hipposaur)(Auto-Rifle_LRR).blk
new file mode 100644
index 00000000000..0554bfb9389
--- /dev/null
+++ b/megamek/data/mechfiles/infantry/Beast Mounted/Hipposaur/Beast Infantry (Hipposaur)(Auto-Rifle_LRR).blk
@@ -0,0 +1,77 @@
+#building block data file
+
+1
+
+
+##Write the version number just in case...
+
+MAM0
+
+
+
+Infantry
+
+
+
+Beast Infantry (Hipposaur)
+
+
+
+(Auto-Rifle/LRR)
+
+
+
+2750
+
+
+
+2750
+
+
+
+IS Level 3
+
+
+
+Beast:Hipposaur
+
+
+
+
+
+
+2
+
+
+
+4
+
+
+
+2
+
+
+
+InfantryAssaultRifle
+
+
+
+InfantryLRR
+
+
+
+Environment Suit, Hostile
+
+
+
+true
+
+
+
+true
+
+
+
+4096
+
+
diff --git a/megamek/data/mechfiles/infantry/Beast Mounted/Hipposaur/Beast Infantry (Hipposaur)(Auto-Rifle_SRM).blk b/megamek/data/mechfiles/infantry/Beast Mounted/Hipposaur/Beast Infantry (Hipposaur)(Auto-Rifle_SRM).blk
new file mode 100644
index 00000000000..f8a2309f7f4
--- /dev/null
+++ b/megamek/data/mechfiles/infantry/Beast Mounted/Hipposaur/Beast Infantry (Hipposaur)(Auto-Rifle_SRM).blk
@@ -0,0 +1,77 @@
+#building block data file
+
+1
+
+
+##Write the version number just in case...
+
+MAM0
+
+
+
+Infantry
+
+
+
+Beast Infantry (Hipposaur)
+
+
+
+(Auto-Rifle/SRM)
+
+
+
+2750
+
+
+
+2750
+
+
+
+IS Level 3
+
+
+
+Beast:Hipposaur
+
+
+
+
+
+
+2
+
+
+
+4
+
+
+
+2
+
+
+
+Laser Rifle
+
+
+
+InfantryStandardSRM
+
+
+
+Environment Suit, Hostile
+
+
+
+true
+
+
+
+true
+
+
+
+4096
+
+
diff --git a/megamek/data/mechfiles/infantry/Beast Mounted/Hipposaur/Beast Infantry (Hipposaur)(Auto-Rifle_Support MG).blk b/megamek/data/mechfiles/infantry/Beast Mounted/Hipposaur/Beast Infantry (Hipposaur)(Auto-Rifle_Support MG).blk
new file mode 100644
index 00000000000..af738ae1276
--- /dev/null
+++ b/megamek/data/mechfiles/infantry/Beast Mounted/Hipposaur/Beast Infantry (Hipposaur)(Auto-Rifle_Support MG).blk
@@ -0,0 +1,77 @@
+#building block data file
+
+1
+
+
+##Write the version number just in case...
+
+MAM0
+
+
+
+Infantry
+
+
+
+Beast Infantry (Hipposaur)
+
+
+
+(Auto-Rifle/Support MG)
+
+
+
+2750
+
+
+
+2750
+
+
+
+IS Level 3
+
+
+
+Beast:Hipposaur
+
+
+
+
+
+
+2
+
+
+
+4
+
+
+
+2
+
+
+
+InfantryAssaultRifle
+
+
+
+Machine Gun (Support)
+
+
+
+Environment Suit, Hostile
+
+
+
+true
+
+
+
+true
+
+
+
+4096
+
+
diff --git a/megamek/data/mechfiles/infantry/Beast Mounted/Hipposaur/Beast Infantry (Hipposaur)(Laser Rifle_GL).blk b/megamek/data/mechfiles/infantry/Beast Mounted/Hipposaur/Beast Infantry (Hipposaur)(Laser Rifle_GL).blk
new file mode 100644
index 00000000000..18d1280ec7c
--- /dev/null
+++ b/megamek/data/mechfiles/infantry/Beast Mounted/Hipposaur/Beast Infantry (Hipposaur)(Laser Rifle_GL).blk
@@ -0,0 +1,77 @@
+#building block data file
+
+1
+
+
+##Write the version number just in case...
+
+MAM0
+
+
+
+Infantry
+
+
+
+Beast Infantry (Hipposaur)
+
+
+
+(Laser Rifle/GL)
+
+
+
+2750
+
+
+
+2750
+
+
+
+IS Level 3
+
+
+
+Beast:Hipposaur
+
+
+
+
+
+
+2
+
+
+
+4
+
+
+
+2
+
+
+
+Laser Rifle
+
+
+
+InfantryAutoGL
+
+
+
+Environment Suit, Hostile
+
+
+
+true
+
+
+
+true
+
+
+
+4096
+
+
diff --git a/megamek/data/mechfiles/infantry/Beast Mounted/Hipposaur/Beast Infantry (Hipposaur)(SMG_GL).blk b/megamek/data/mechfiles/infantry/Beast Mounted/Hipposaur/Beast Infantry (Hipposaur)(SMG_GL).blk
new file mode 100644
index 00000000000..a3b97d2c9d5
--- /dev/null
+++ b/megamek/data/mechfiles/infantry/Beast Mounted/Hipposaur/Beast Infantry (Hipposaur)(SMG_GL).blk
@@ -0,0 +1,77 @@
+#building block data file
+
+1
+
+
+##Write the version number just in case...
+
+MAM0
+
+
+
+Infantry
+
+
+
+Beast Infantry (Hipposaur)
+
+
+
+(SMG/GL)
+
+
+
+2750
+
+
+
+2750
+
+
+
+IS Level 3
+
+
+
+Beast:Hipposaur
+
+
+
+
+
+
+2
+
+
+
+4
+
+
+
+2
+
+
+
+Submachine Gun
+
+
+
+InfantryAutoGL
+
+
+
+Environment Suit, Hostile
+
+
+
+true
+
+
+
+true
+
+
+
+4096
+
+
diff --git a/megamek/data/mechfiles/infantry/Beast Mounted/Horse/Beast Infantry (Horse)(Auto Rifle).blk b/megamek/data/mechfiles/infantry/Beast Mounted/Horse/Beast Infantry (Horse)(Auto Rifle).blk
new file mode 100644
index 00000000000..6168c398fb1
--- /dev/null
+++ b/megamek/data/mechfiles/infantry/Beast Mounted/Horse/Beast Infantry (Horse)(Auto Rifle).blk
@@ -0,0 +1,61 @@
+#building block data file
+
+1
+
+
+##Write the version number just in case...
+
+MAM0
+
+
+
+Infantry
+
+
+
+Beast Infantry (Horse)
+
+
+
+(Auto-Rifle)
+
+
+
+2000
+
+
+
+2000
+
+
+
+IS Level 3
+
+
+
+Beast:Horse
+
+
+
+
+
+
+7
+
+
+
+3
+
+
+
+InfantryAssaultRifle
+
+
+
+5
+
+
+
+Clothing, Fatigues/Civilian/Non-Armored
+
+
diff --git a/megamek/data/mechfiles/infantry/Beast Mounted/Horse/Beast Infantry (Horse)(Gyrojet).blk b/megamek/data/mechfiles/infantry/Beast Mounted/Horse/Beast Infantry (Horse)(Gyrojet).blk
new file mode 100644
index 00000000000..2e3fd6a12ea
--- /dev/null
+++ b/megamek/data/mechfiles/infantry/Beast Mounted/Horse/Beast Infantry (Horse)(Gyrojet).blk
@@ -0,0 +1,61 @@
+#building block data file
+
+1
+
+
+##Write the version number just in case...
+
+MAM0
+
+
+
+Infantry
+
+
+
+Beast Infantry (Horse)
+
+
+
+(Gyrojet)
+
+
+
+2680
+
+
+
+2680
+
+
+
+IS Level 3
+
+
+
+Beast:Horse
+
+
+
+
+
+
+7
+
+
+
+3
+
+
+
+Gyrojet Rifle
+
+
+
+5
+
+
+
+Generic Infantry Kit
+
+
diff --git a/megamek/data/mechfiles/infantry/Beast Mounted/Horse/Beast Infantry (Horse)(Laser Rifle).blk b/megamek/data/mechfiles/infantry/Beast Mounted/Horse/Beast Infantry (Horse)(Laser Rifle).blk
new file mode 100644
index 00000000000..9a5aa6cf4ad
--- /dev/null
+++ b/megamek/data/mechfiles/infantry/Beast Mounted/Horse/Beast Infantry (Horse)(Laser Rifle).blk
@@ -0,0 +1,61 @@
+#building block data file
+
+1
+
+
+##Write the version number just in case...
+
+MAM0
+
+
+
+Infantry
+
+
+
+Beast Infantry (Horse)
+
+
+
+(Laser Rifle)
+
+
+
+2230
+
+
+
+2230
+
+
+
+IS Level 3
+
+
+
+Beast:Horse
+
+
+
+
+
+
+7
+
+
+
+3
+
+
+
+Laser Rifle
+
+
+
+5
+
+
+
+Generic Infantry Kit
+
+
diff --git a/megamek/data/mechfiles/infantry/Beast Mounted/Horse/Beast Infantry (Horse)(Needler).blk b/megamek/data/mechfiles/infantry/Beast Mounted/Horse/Beast Infantry (Horse)(Needler).blk
new file mode 100644
index 00000000000..e9f6f07b9b1
--- /dev/null
+++ b/megamek/data/mechfiles/infantry/Beast Mounted/Horse/Beast Infantry (Horse)(Needler).blk
@@ -0,0 +1,61 @@
+#building block data file
+
+1
+
+
+##Write the version number just in case...
+
+MAM0
+
+
+
+Infantry
+
+
+
+Beast Infantry (Horse)
+
+
+
+(Needler)
+
+
+
+2680
+
+
+
+2680
+
+
+
+IS Level 3
+
+
+
+Beast:Horse
+
+
+
+
+
+
+7
+
+
+
+3
+
+
+
+Needler Rifle
+
+
+
+5
+
+
+
+Generic Infantry Kit
+
+
diff --git a/megamek/data/mechfiles/infantry/Beast Mounted/Horse/Beast Infantry (Horse)(Pulse Laser).blk b/megamek/data/mechfiles/infantry/Beast Mounted/Horse/Beast Infantry (Horse)(Pulse Laser).blk
new file mode 100644
index 00000000000..1c94fe0ea29
--- /dev/null
+++ b/megamek/data/mechfiles/infantry/Beast Mounted/Horse/Beast Infantry (Horse)(Pulse Laser).blk
@@ -0,0 +1,61 @@
+#building block data file
+
+1
+
+
+##Write the version number just in case...
+
+MAM0
+
+
+
+Infantry
+
+
+
+Beast Infantry (Horse)
+
+
+
+(Pulse Laser)
+
+
+
+2680
+
+
+
+2680
+
+
+
+IS Level 3
+
+
+
+Beast:Horse
+
+
+
+
+
+
+7
+
+
+
+3
+
+
+
+Pulse Laser Rifle (Inner Sphere)
+
+
+
+5
+
+
+
+Generic Infantry Kit
+
+
diff --git a/megamek/data/mechfiles/infantry/Beast Mounted/Horse/Beast Infantry (Horse)(SMG).blk b/megamek/data/mechfiles/infantry/Beast Mounted/Horse/Beast Infantry (Horse)(SMG).blk
new file mode 100644
index 00000000000..a9ce40e6b2e
--- /dev/null
+++ b/megamek/data/mechfiles/infantry/Beast Mounted/Horse/Beast Infantry (Horse)(SMG).blk
@@ -0,0 +1,61 @@
+#building block data file
+
+1
+
+
+##Write the version number just in case...
+
+MAM0
+
+
+
+Infantry
+
+
+
+Beast Infantry (Horse)
+
+
+
+(SMG)
+
+
+
+2300
+
+
+
+2300
+
+
+
+IS Level 3
+
+
+
+Beast:Horse
+
+
+
+
+
+
+7
+
+
+
+3
+
+
+
+Submachine Gun
+
+
+
+5
+
+
+
+Generic Infantry Kit
+
+
diff --git a/megamek/data/mechfiles/infantry/Beast Mounted/Horse/Beast Infantry (Horse)(Shotgun).blk b/megamek/data/mechfiles/infantry/Beast Mounted/Horse/Beast Infantry (Horse)(Shotgun).blk
new file mode 100644
index 00000000000..8d2c68ed52a
--- /dev/null
+++ b/megamek/data/mechfiles/infantry/Beast Mounted/Horse/Beast Infantry (Horse)(Shotgun).blk
@@ -0,0 +1,61 @@
+#building block data file
+
+1
+
+
+##Write the version number just in case...
+
+MAM0
+
+
+
+Infantry
+
+
+
+Beast Infantry (Horse)
+
+
+
+(Shotgun)
+
+
+
+2680
+
+
+
+2680
+
+
+
+IS Level 3
+
+
+
+Beast:Horse
+
+
+
+
+
+
+7
+
+
+
+3
+
+
+
+Auto-Shotgun
+
+
+
+5
+
+
+
+Generic Infantry Kit
+
+
diff --git a/megamek/data/mechfiles/infantry/Beast Mounted/Horse/Beast Infantry (Horse)(Sniper).blk b/megamek/data/mechfiles/infantry/Beast Mounted/Horse/Beast Infantry (Horse)(Sniper).blk
new file mode 100644
index 00000000000..653fc5e600d
--- /dev/null
+++ b/megamek/data/mechfiles/infantry/Beast Mounted/Horse/Beast Infantry (Horse)(Sniper).blk
@@ -0,0 +1,61 @@
+#building block data file
+
+1
+
+
+##Write the version number just in case...
+
+MAM0
+
+
+
+Infantry
+
+
+
+Beast Infantry (Horse)
+
+
+
+(Sniper)
+
+
+
+2500
+
+
+
+2500
+
+
+
+IS Level 3
+
+
+
+Beast:Horse
+
+
+
+
+
+
+7
+
+
+
+3
+
+
+
+Sniper Rifle (Bolt Action)
+
+
+
+5
+
+
+
+Generic Infantry Kit
+
+
diff --git a/megamek/data/mechfiles/infantry/Beast Mounted/Odessan Raxx/Beast Infantry (Odessan Raxx)(Auto-Rifle).blk b/megamek/data/mechfiles/infantry/Beast Mounted/Odessan Raxx/Beast Infantry (Odessan Raxx)(Auto-Rifle).blk
new file mode 100644
index 00000000000..ca5b2c401b9
--- /dev/null
+++ b/megamek/data/mechfiles/infantry/Beast Mounted/Odessan Raxx/Beast Infantry (Odessan Raxx)(Auto-Rifle).blk
@@ -0,0 +1,61 @@
+#building block data file
+
+1
+
+
+##Write the version number just in case...
+
+MAM0
+
+
+
+Infantry
+
+
+
+Beast Infantry (Odessan Raxx)
+
+
+
+(Auto-Rifle)
+
+
+
+2340
+
+
+
+2340
+
+
+
+IS Level 3
+
+
+
+Beast:Odessan Raxx
+
+
+
+
+
+
+7
+
+
+
+3
+
+
+
+InfantryAssaultRifle
+
+
+
+5
+
+
+
+Clothing, Fatigues/Civilian/Non-Armored
+
+
diff --git a/megamek/data/mechfiles/infantry/Beast Mounted/Odessan Raxx/Beast Infantry (Odessan Raxx)(Gyrojet).blk b/megamek/data/mechfiles/infantry/Beast Mounted/Odessan Raxx/Beast Infantry (Odessan Raxx)(Gyrojet).blk
new file mode 100644
index 00000000000..9eaaca4e3ab
--- /dev/null
+++ b/megamek/data/mechfiles/infantry/Beast Mounted/Odessan Raxx/Beast Infantry (Odessan Raxx)(Gyrojet).blk
@@ -0,0 +1,61 @@
+#building block data file
+
+1
+
+
+##Write the version number just in case...
+
+MAM0
+
+
+
+Infantry
+
+
+
+Beast Infantry (Odessan Raxx)
+
+
+
+(Gyrojet)
+
+
+
+2680
+
+
+
+2680
+
+
+
+IS Level 3
+
+
+
+Beast:Odessan Raxx
+
+
+
+
+
+
+7
+
+
+
+3
+
+
+
+Gyrojet Rifle
+
+
+
+5
+
+
+
+Generic Infantry Kit
+
+
diff --git a/megamek/data/mechfiles/infantry/Beast Mounted/Odessan Raxx/Beast Infantry (Odessan Raxx)(Laser Rifle).blk b/megamek/data/mechfiles/infantry/Beast Mounted/Odessan Raxx/Beast Infantry (Odessan Raxx)(Laser Rifle).blk
new file mode 100644
index 00000000000..8f06deabe36
--- /dev/null
+++ b/megamek/data/mechfiles/infantry/Beast Mounted/Odessan Raxx/Beast Infantry (Odessan Raxx)(Laser Rifle).blk
@@ -0,0 +1,61 @@
+#building block data file
+
+1
+
+
+##Write the version number just in case...
+
+MAM0
+
+
+
+Infantry
+
+
+
+Beast Infantry (Odessan Raxx)
+
+
+
+(Laser Rifle)
+
+
+
+2340
+
+
+
+2340
+
+
+
+IS Level 3
+
+
+
+Beast:Odessan Raxx
+
+
+
+
+
+
+7
+
+
+
+3
+
+
+
+Laser Rifle
+
+
+
+5
+
+
+
+Generic Infantry Kit
+
+
diff --git a/megamek/data/mechfiles/infantry/Beast Mounted/Odessan Raxx/Beast Infantry (Odessan Raxx)(Needler).blk b/megamek/data/mechfiles/infantry/Beast Mounted/Odessan Raxx/Beast Infantry (Odessan Raxx)(Needler).blk
new file mode 100644
index 00000000000..38739d412a6
--- /dev/null
+++ b/megamek/data/mechfiles/infantry/Beast Mounted/Odessan Raxx/Beast Infantry (Odessan Raxx)(Needler).blk
@@ -0,0 +1,61 @@
+#building block data file
+
+1
+
+
+##Write the version number just in case...
+
+MAM0
+
+
+
+Infantry
+
+
+
+Beast Infantry (Odessan Raxx)
+
+
+
+(Needler)
+
+
+
+2680
+
+
+
+2680
+
+
+
+IS Level 3
+
+
+
+Beast:Odessan Raxx
+
+
+
+
+
+
+7
+
+
+
+3
+
+
+
+Needler Rifle
+
+
+
+5
+
+
+
+Generic Infantry Kit
+
+
diff --git a/megamek/data/mechfiles/infantry/Beast Mounted/Odessan Raxx/Beast Infantry (Odessan Raxx)(Pulse Laser).blk b/megamek/data/mechfiles/infantry/Beast Mounted/Odessan Raxx/Beast Infantry (Odessan Raxx)(Pulse Laser).blk
new file mode 100644
index 00000000000..7e20cc45f51
--- /dev/null
+++ b/megamek/data/mechfiles/infantry/Beast Mounted/Odessan Raxx/Beast Infantry (Odessan Raxx)(Pulse Laser).blk
@@ -0,0 +1,61 @@
+#building block data file
+
+1
+
+
+##Write the version number just in case...
+
+MAM0
+
+
+
+Infantry
+
+
+
+Beast Infantry (Odessan Raxx)
+
+
+
+(Pulse Laser)
+
+
+
+2680
+
+
+
+2680
+
+
+
+IS Level 3
+
+
+
+Beast:Odessan Raxx
+
+
+
+
+
+
+7
+
+
+
+3
+
+
+
+Pulse Laser Rifle (Inner Sphere)
+
+
+
+5
+
+
+
+Generic Infantry Kit
+
+
diff --git a/megamek/data/mechfiles/infantry/Beast Mounted/Odessan Raxx/Beast Infantry (Odessan Raxx)(SMG).blk b/megamek/data/mechfiles/infantry/Beast Mounted/Odessan Raxx/Beast Infantry (Odessan Raxx)(SMG).blk
new file mode 100644
index 00000000000..a98cbefaa25
--- /dev/null
+++ b/megamek/data/mechfiles/infantry/Beast Mounted/Odessan Raxx/Beast Infantry (Odessan Raxx)(SMG).blk
@@ -0,0 +1,61 @@
+#building block data file
+
+1
+
+
+##Write the version number just in case...
+
+MAM0
+
+
+
+Infantry
+
+
+
+Beast Infantry (Odessan Raxx)
+
+
+
+(SMG)
+
+
+
+2340
+
+
+
+2340
+
+
+
+IS Level 3
+
+
+
+Beast:Odessan Raxx
+
+
+
+
+
+
+7
+
+
+
+3
+
+
+
+Submachine Gun
+
+
+
+5
+
+
+
+Generic Infantry Kit
+
+
diff --git a/megamek/data/mechfiles/infantry/Beast Mounted/Odessan Raxx/Beast Infantry (Odessan Raxx)(Shotgun).blk b/megamek/data/mechfiles/infantry/Beast Mounted/Odessan Raxx/Beast Infantry (Odessan Raxx)(Shotgun).blk
new file mode 100644
index 00000000000..c4e9fca8fa6
--- /dev/null
+++ b/megamek/data/mechfiles/infantry/Beast Mounted/Odessan Raxx/Beast Infantry (Odessan Raxx)(Shotgun).blk
@@ -0,0 +1,61 @@
+#building block data file
+
+1
+
+
+##Write the version number just in case...
+
+MAM0
+
+
+
+Infantry
+
+
+
+Beast Infantry (Odessan Raxx)
+
+
+
+(Shotgun)
+
+
+
+2340
+
+
+
+2340
+
+
+
+IS Level 3
+
+
+
+Beast:Odessan Raxx
+
+
+
+
+
+
+7
+
+
+
+3
+
+
+
+Auto-Shotgun
+
+
+
+5
+
+
+
+Generic Infantry Kit
+
+
diff --git a/megamek/data/mechfiles/infantry/Beast Mounted/Odessan Raxx/Beast Infantry (Odessan Raxx)(Sniper).blk b/megamek/data/mechfiles/infantry/Beast Mounted/Odessan Raxx/Beast Infantry (Odessan Raxx)(Sniper).blk
new file mode 100644
index 00000000000..cac46f96bf9
--- /dev/null
+++ b/megamek/data/mechfiles/infantry/Beast Mounted/Odessan Raxx/Beast Infantry (Odessan Raxx)(Sniper).blk
@@ -0,0 +1,61 @@
+#building block data file
+
+1
+
+
+##Write the version number just in case...
+
+MAM0
+
+
+
+Infantry
+
+
+
+Beast Infantry (Odessan Raxx)
+
+
+
+(Sniper)
+
+
+
+2340
+
+
+
+2340
+
+
+
+IS Level 3
+
+
+
+Beast:Odessan Raxx
+
+
+
+
+
+
+7
+
+
+
+3
+
+
+
+Sniper Rifle (Bolt Action)
+
+
+
+5
+
+
+
+Generic Infantry Kit
+
+
diff --git a/megamek/data/mechfiles/infantry/Beast Mounted/Orca/Beast Infantry (Orca)(Gyrojet_Support Laser).blk b/megamek/data/mechfiles/infantry/Beast Mounted/Orca/Beast Infantry (Orca)(Gyrojet_Support Laser).blk
new file mode 100644
index 00000000000..aae0afb5553
--- /dev/null
+++ b/megamek/data/mechfiles/infantry/Beast Mounted/Orca/Beast Infantry (Orca)(Gyrojet_Support Laser).blk
@@ -0,0 +1,69 @@
+#building block data file
+
+1
+
+
+##Write the version number just in case...
+
+MAM0
+
+
+
+Infantry
+
+
+
+Beast Infantry (Orca)
+
+
+
+(Gyrojet/Support Laser)
+
+
+
+2570
+
+
+
+2570
+
+
+
+IS Level 3
+
+
+
+Beast:Orca
+
+
+
+
+
+
+2
+
+
+
+5
+
+
+
+1
+
+
+
+Gyrojet Rifle
+
+
+
+Support Laser (Heavy)
+
+
+
+Environment Suit, Hostile
+
+
+
+4096
+
+
diff --git a/megamek/data/mechfiles/infantry/Beast Mounted/Orca/Beast Infantry (Orca)(Laser Rifle).blk b/megamek/data/mechfiles/infantry/Beast Mounted/Orca/Beast Infantry (Orca)(Laser Rifle).blk
new file mode 100644
index 00000000000..d52cbd8017e
--- /dev/null
+++ b/megamek/data/mechfiles/infantry/Beast Mounted/Orca/Beast Infantry (Orca)(Laser Rifle).blk
@@ -0,0 +1,61 @@
+#building block data file
+
+1
+
+
+##Write the version number just in case...
+
+MAM0
+
+
+
+Infantry
+
+
+
+Beast Infantry (Orca)
+
+
+
+(Laser Rifle)
+
+
+
+2300
+
+
+
+2300
+
+
+
+IS Level 3
+
+
+
+Beast:Orca
+
+
+
+
+
+
+2
+
+
+
+5
+
+
+
+Laser Rifle
+
+
+
+Environment Suit, Hostile
+
+
+
+4096
+
+
diff --git a/megamek/data/mechfiles/infantry/Beast Mounted/Tabiranth/Beast Infantry (Tabiranth)(Auto Rifle).blk b/megamek/data/mechfiles/infantry/Beast Mounted/Tabiranth/Beast Infantry (Tabiranth)(Auto Rifle).blk
new file mode 100644
index 00000000000..4de8fb70348
--- /dev/null
+++ b/megamek/data/mechfiles/infantry/Beast Mounted/Tabiranth/Beast Infantry (Tabiranth)(Auto Rifle).blk
@@ -0,0 +1,61 @@
+#building block data file
+
+1
+
+
+##Write the version number just in case...
+
+MAM0
+
+
+
+Infantry
+
+
+
+Beast Infantry (Tabiranth)
+
+
+
+(Auto-Rifle)
+
+
+
+2300
+
+
+
+2300
+
+
+
+IS Level 3
+
+
+
+Beast:Tabiranth
+
+
+
+
+
+
+7
+
+
+
+3
+
+
+
+InfantryAssaultRifle
+
+
+
+5
+
+
+
+Clothing, Fatigues/Civilian/Non-Armored
+
+
diff --git a/megamek/data/mechfiles/infantry/Beast Mounted/Tabiranth/Beast Infantry (Tabiranth)(Gyrojet).blk b/megamek/data/mechfiles/infantry/Beast Mounted/Tabiranth/Beast Infantry (Tabiranth)(Gyrojet).blk
new file mode 100644
index 00000000000..aa438804bbf
--- /dev/null
+++ b/megamek/data/mechfiles/infantry/Beast Mounted/Tabiranth/Beast Infantry (Tabiranth)(Gyrojet).blk
@@ -0,0 +1,61 @@
+#building block data file
+
+1
+
+
+##Write the version number just in case...
+
+MAM0
+
+
+
+Infantry
+
+
+
+Beast Infantry (Tabiranth)
+
+
+
+(Gyrojet)
+
+
+
+2680
+
+
+
+2680
+
+
+
+IS Level 3
+
+
+
+Beast:Tabiranth
+
+
+
+
+
+
+7
+
+
+
+3
+
+
+
+Gyrojet Rifle
+
+
+
+5
+
+
+
+Generic Infantry Kit
+
+
diff --git a/megamek/data/mechfiles/infantry/Beast Mounted/Tabiranth/Beast Infantry (Tabiranth)(Laser Rifle).blk b/megamek/data/mechfiles/infantry/Beast Mounted/Tabiranth/Beast Infantry (Tabiranth)(Laser Rifle).blk
new file mode 100644
index 00000000000..9e637a84062
--- /dev/null
+++ b/megamek/data/mechfiles/infantry/Beast Mounted/Tabiranth/Beast Infantry (Tabiranth)(Laser Rifle).blk
@@ -0,0 +1,61 @@
+#building block data file
+
+1
+
+
+##Write the version number just in case...
+
+MAM0
+
+
+
+Infantry
+
+
+
+Beast Infantry (Tabiranth)
+
+
+
+(Laser Rifle)
+
+
+
+2300
+
+
+
+2300
+
+
+
+IS Level 3
+
+
+
+Beast:Tabiranth
+
+
+
+
+
+
+7
+
+
+
+3
+
+
+
+Laser Rifle
+
+
+
+5
+
+
+
+Generic Infantry Kit
+
+
diff --git a/megamek/data/mechfiles/infantry/Beast Mounted/Tabiranth/Beast Infantry (Tabiranth)(Needler).blk b/megamek/data/mechfiles/infantry/Beast Mounted/Tabiranth/Beast Infantry (Tabiranth)(Needler).blk
new file mode 100644
index 00000000000..ebec8f76d82
--- /dev/null
+++ b/megamek/data/mechfiles/infantry/Beast Mounted/Tabiranth/Beast Infantry (Tabiranth)(Needler).blk
@@ -0,0 +1,61 @@
+#building block data file
+
+1
+
+
+##Write the version number just in case...
+
+MAM0
+
+
+
+Infantry
+
+
+
+Beast Infantry (Tabiranth)
+
+
+
+(Needler)
+
+
+
+2680
+
+
+
+2680
+
+
+
+IS Level 3
+
+
+
+Beast:Tabiranth
+
+
+
+
+
+
+7
+
+
+
+3
+
+
+
+Needler Rifle
+
+
+
+5
+
+
+
+Generic Infantry Kit
+
+
diff --git a/megamek/data/mechfiles/infantry/Beast Mounted/Tabiranth/Beast Infantry (Tabiranth)(Pulse Laser).blk b/megamek/data/mechfiles/infantry/Beast Mounted/Tabiranth/Beast Infantry (Tabiranth)(Pulse Laser).blk
new file mode 100644
index 00000000000..4093a6f80e9
--- /dev/null
+++ b/megamek/data/mechfiles/infantry/Beast Mounted/Tabiranth/Beast Infantry (Tabiranth)(Pulse Laser).blk
@@ -0,0 +1,61 @@
+#building block data file
+
+1
+
+
+##Write the version number just in case...
+
+MAM0
+
+
+
+Infantry
+
+
+
+Beast Infantry (Tabiranth)
+
+
+
+(Pulse Laser)
+
+
+
+2680
+
+
+
+2680
+
+
+
+IS Level 3
+
+
+
+Beast:Tabiranth
+
+
+
+
+
+
+7
+
+
+
+3
+
+
+
+Pulse Laser Rifle (Inner Sphere)
+
+
+
+5
+
+
+
+Generic Infantry Kit
+
+
diff --git a/megamek/data/mechfiles/infantry/Beast Mounted/Tabiranth/Beast Infantry (Tabiranth)(SMG).blk b/megamek/data/mechfiles/infantry/Beast Mounted/Tabiranth/Beast Infantry (Tabiranth)(SMG).blk
new file mode 100644
index 00000000000..310c15ac9db
--- /dev/null
+++ b/megamek/data/mechfiles/infantry/Beast Mounted/Tabiranth/Beast Infantry (Tabiranth)(SMG).blk
@@ -0,0 +1,61 @@
+#building block data file
+
+1
+
+
+##Write the version number just in case...
+
+MAM0
+
+
+
+Infantry
+
+
+
+Beast Infantry (Tabiranth)
+
+
+
+(SMG)
+
+
+
+2300
+
+
+
+2300
+
+
+
+IS Level 3
+
+
+
+Beast:Tabiranth
+
+
+
+
+
+
+7
+
+
+
+3
+
+
+
+Submachine Gun
+
+
+
+5
+
+
+
+Generic Infantry Kit
+
+
diff --git a/megamek/data/mechfiles/infantry/Beast Mounted/Tabiranth/Beast Infantry (Tabiranth)(Shotgun).blk b/megamek/data/mechfiles/infantry/Beast Mounted/Tabiranth/Beast Infantry (Tabiranth)(Shotgun).blk
new file mode 100644
index 00000000000..6456fdaa36b
--- /dev/null
+++ b/megamek/data/mechfiles/infantry/Beast Mounted/Tabiranth/Beast Infantry (Tabiranth)(Shotgun).blk
@@ -0,0 +1,61 @@
+#building block data file
+
+1
+
+
+##Write the version number just in case...
+
+MAM0
+
+
+
+Infantry
+
+
+
+Beast Infantry (Tabiranth)
+
+
+
+(Shotgun)
+
+
+
+2680
+
+
+
+2680
+
+
+
+IS Level 3
+
+
+
+Beast:Tabiranth
+
+
+
+
+
+
+7
+
+
+
+3
+
+
+
+Auto-Shotgun
+
+
+
+5
+
+
+
+Generic Infantry Kit
+
+
diff --git a/megamek/data/mechfiles/infantry/Beast Mounted/Tabiranth/Beast Infantry (Tabiranth)(Sniper).blk b/megamek/data/mechfiles/infantry/Beast Mounted/Tabiranth/Beast Infantry (Tabiranth)(Sniper).blk
new file mode 100644
index 00000000000..c45981683d6
--- /dev/null
+++ b/megamek/data/mechfiles/infantry/Beast Mounted/Tabiranth/Beast Infantry (Tabiranth)(Sniper).blk
@@ -0,0 +1,61 @@
+#building block data file
+
+1
+
+
+##Write the version number just in case...
+
+MAM0
+
+
+
+Infantry
+
+
+
+Beast Infantry (Tabiranth)
+
+
+
+(Sniper)
+
+
+
+2300
+
+
+
+2300
+
+
+
+IS Level 3
+
+
+
+Beast:Tabiranth
+
+
+
+
+
+
+7
+
+
+
+3
+
+
+
+Sniper Rifle (Bolt Action)
+
+
+
+5
+
+
+
+Generic Infantry Kit
+
+
diff --git a/megamek/data/mechfiles/infantry/Beast Mounted/Tariq/Beast Infantry (Tariq)(Auto-Rifle).blk b/megamek/data/mechfiles/infantry/Beast Mounted/Tariq/Beast Infantry (Tariq)(Auto-Rifle).blk
new file mode 100644
index 00000000000..9ed4e71f1b7
--- /dev/null
+++ b/megamek/data/mechfiles/infantry/Beast Mounted/Tariq/Beast Infantry (Tariq)(Auto-Rifle).blk
@@ -0,0 +1,61 @@
+#building block data file
+
+1
+
+
+##Write the version number just in case...
+
+MAM0
+
+
+
+Infantry
+
+
+
+Beast Infantry (Tariq)
+
+
+
+(Auto-Rifle)
+
+
+
+2750
+
+
+
+2750
+
+
+
+IS Level 3
+
+
+
+Beast:Tariq
+
+
+
+
+
+
+7
+
+
+
+3
+
+
+
+InfantryAssaultRifle
+
+
+
+5
+
+
+
+Clothing, Fatigues/Civilian/Non-Armored
+
+
diff --git a/megamek/data/mechfiles/infantry/Beast Mounted/Tariq/Beast Infantry (Tariq)(Gyrojet).blk b/megamek/data/mechfiles/infantry/Beast Mounted/Tariq/Beast Infantry (Tariq)(Gyrojet).blk
new file mode 100644
index 00000000000..4b1635edd03
--- /dev/null
+++ b/megamek/data/mechfiles/infantry/Beast Mounted/Tariq/Beast Infantry (Tariq)(Gyrojet).blk
@@ -0,0 +1,61 @@
+#building block data file
+
+1
+
+
+##Write the version number just in case...
+
+MAM0
+
+
+
+Infantry
+
+
+
+Beast Infantry (Tariq)
+
+
+
+(Gyrojet)
+
+
+
+2750
+
+
+
+2750
+
+
+
+IS Level 3
+
+
+
+Beast:Tariq
+
+
+
+
+
+
+7
+
+
+
+3
+
+
+
+Gyrojet Rifle
+
+
+
+5
+
+
+
+Generic Infantry Kit
+
+
diff --git a/megamek/data/mechfiles/infantry/Beast Mounted/Tariq/Beast Infantry (Tariq)(Laser Rifle).blk b/megamek/data/mechfiles/infantry/Beast Mounted/Tariq/Beast Infantry (Tariq)(Laser Rifle).blk
new file mode 100644
index 00000000000..e08e751449b
--- /dev/null
+++ b/megamek/data/mechfiles/infantry/Beast Mounted/Tariq/Beast Infantry (Tariq)(Laser Rifle).blk
@@ -0,0 +1,61 @@
+#building block data file
+
+1
+
+
+##Write the version number just in case...
+
+MAM0
+
+
+
+Infantry
+
+
+
+Beast Infantry (Tariq)
+
+
+
+(Laser Rifle)
+
+
+
+2750
+
+
+
+2750
+
+
+
+IS Level 3
+
+
+
+Beast:Tariq
+
+
+
+
+
+
+7
+
+
+
+3
+
+
+
+Laser Rifle
+
+
+
+5
+
+
+
+Generic Infantry Kit
+
+
diff --git a/megamek/data/mechfiles/infantry/Beast Mounted/Tariq/Beast Infantry (Tariq)(Needler).blk b/megamek/data/mechfiles/infantry/Beast Mounted/Tariq/Beast Infantry (Tariq)(Needler).blk
new file mode 100644
index 00000000000..59fe1e8c9e6
--- /dev/null
+++ b/megamek/data/mechfiles/infantry/Beast Mounted/Tariq/Beast Infantry (Tariq)(Needler).blk
@@ -0,0 +1,61 @@
+#building block data file
+
+1
+
+
+##Write the version number just in case...
+
+MAM0
+
+
+
+Infantry
+
+
+
+Beast Infantry (Tariq)
+
+
+
+(Needler)
+
+
+
+2750
+
+
+
+2750
+
+
+
+IS Level 3
+
+
+
+Beast:Tariq
+
+
+
+
+
+
+7
+
+
+
+3
+
+
+
+Needler Rifle
+
+
+
+5
+
+
+
+Generic Infantry Kit
+
+
diff --git a/megamek/data/mechfiles/infantry/Beast Mounted/Tariq/Beast Infantry (Tariq)(Pulse Laser).blk b/megamek/data/mechfiles/infantry/Beast Mounted/Tariq/Beast Infantry (Tariq)(Pulse Laser).blk
new file mode 100644
index 00000000000..553694e4481
--- /dev/null
+++ b/megamek/data/mechfiles/infantry/Beast Mounted/Tariq/Beast Infantry (Tariq)(Pulse Laser).blk
@@ -0,0 +1,61 @@
+#building block data file
+
+1
+
+
+##Write the version number just in case...
+
+MAM0
+
+
+
+Infantry
+
+
+
+Beast Infantry (Tariq)
+
+
+
+(Pulse Laser)
+
+
+
+2750
+
+
+
+2750
+
+
+
+IS Level 3
+
+
+
+Beast:Tariq
+
+
+
+
+
+
+7
+
+
+
+3
+
+
+
+Pulse Laser Rifle (Inner Sphere)
+
+
+
+5
+
+
+
+Generic Infantry Kit
+
+
diff --git a/megamek/data/mechfiles/infantry/Beast Mounted/Tariq/Beast Infantry (Tariq)(SMG).blk b/megamek/data/mechfiles/infantry/Beast Mounted/Tariq/Beast Infantry (Tariq)(SMG).blk
new file mode 100644
index 00000000000..4f3b4b682c9
--- /dev/null
+++ b/megamek/data/mechfiles/infantry/Beast Mounted/Tariq/Beast Infantry (Tariq)(SMG).blk
@@ -0,0 +1,61 @@
+#building block data file
+
+1
+
+
+##Write the version number just in case...
+
+MAM0
+
+
+
+Infantry
+
+
+
+Beast Infantry (Tariq)
+
+
+
+(SMG)
+
+
+
+2750
+
+
+
+2750
+
+
+
+IS Level 3
+
+
+
+Beast:Tariq
+
+
+
+
+
+
+7
+
+
+
+3
+
+
+
+Submachine Gun
+
+
+
+5
+
+
+
+Generic Infantry Kit
+
+
diff --git a/megamek/data/mechfiles/infantry/Beast Mounted/Tariq/Beast Infantry (Tariq)(Shotgun).blk b/megamek/data/mechfiles/infantry/Beast Mounted/Tariq/Beast Infantry (Tariq)(Shotgun).blk
new file mode 100644
index 00000000000..ba90216b183
--- /dev/null
+++ b/megamek/data/mechfiles/infantry/Beast Mounted/Tariq/Beast Infantry (Tariq)(Shotgun).blk
@@ -0,0 +1,61 @@
+#building block data file
+
+1
+
+
+##Write the version number just in case...
+
+MAM0
+
+
+
+Infantry
+
+
+
+Beast Infantry (Tariq)
+
+
+
+(Shotgun)
+
+
+
+2750
+
+
+
+2750
+
+
+
+IS Level 3
+
+
+
+Beast:Tariq
+
+
+
+
+
+
+7
+
+
+
+3
+
+
+
+Auto-Shotgun
+
+
+
+5
+
+
+
+Generic Infantry Kit
+
+
diff --git a/megamek/data/mechfiles/infantry/Beast Mounted/Tariq/Beast Infantry (Tariq)(Sniper).blk b/megamek/data/mechfiles/infantry/Beast Mounted/Tariq/Beast Infantry (Tariq)(Sniper).blk
new file mode 100644
index 00000000000..0d870a82774
--- /dev/null
+++ b/megamek/data/mechfiles/infantry/Beast Mounted/Tariq/Beast Infantry (Tariq)(Sniper).blk
@@ -0,0 +1,61 @@
+#building block data file
+
+1
+
+
+##Write the version number just in case...
+
+MAM0
+
+
+
+Infantry
+
+
+
+Beast Infantry (Tariq)
+
+
+
+(Sniper)
+
+
+
+2750
+
+
+
+2750
+
+
+
+IS Level 3
+
+
+
+Beast:Tariq
+
+
+
+
+
+
+7
+
+
+
+3
+
+
+
+Sniper Rifle (Bolt Action)
+
+
+
+5
+
+
+
+Generic Infantry Kit
+
+
diff --git a/megamek/i18n/megamek/client/messages.properties b/megamek/i18n/megamek/client/messages.properties
index 99db501900a..9a5b98d8a7f 100644
--- a/megamek/i18n/megamek/client/messages.properties
+++ b/megamek/i18n/megamek/client/messages.properties
@@ -498,6 +498,7 @@ BoardView1.Tooltip.HotLoaded=Hot-Loaded
BoardView1.Tooltip.HotLoadedParens=(Hot-Loaded)
BoardView1.Tooltip.Immobile=Immobile
BoardView1.Tooltip.InfSpec=Specialization: {0}
+BoardView1.Tooltip.InfUWDuration=Rounds of Air: {0}
BoardView1.Tooltip.Internals=Internal: {0}
BoardView1.Tooltip.Jammed=Jammed by Enemy ECM
BoardView1.Tooltip.JumpBoosters=Jump Boosters
@@ -2468,6 +2469,7 @@ MovementDisplay.ConfirmPilotingRoll=You must make the following piloting\nskill
MovementDisplay.ConfirmSprint=Are you sure you want to sprint?
MovementDisplay.ConfirmSuperchargerRoll=The movement you have selected will require a roll of {0} or higher\nto avoid Supercharger failure. Do you wish to proceed?
MovementDisplay.ConfirmLandingGearDamage=Landing in a rough or rubble hex will damage the landing ger.\n\nAre you sure you want to land here?
+MovementDisplay.ConfirmMountSuffocation=This unit will be destroyed if it does not surface for air this round.\nDo you wish to proceed?
MovementDisplay.DFADialog.message=To Hit: {0} ({1}%) ({2})\nDamage to Target: {3} (in 5pt clusters){4}\nDamage to Self: {5} (in 5pt clusters) (using Kick table)
MovementDisplay.DFADialog.title=D.F.A. {0}?
MovementDisplay.Done=Done
@@ -3795,6 +3797,7 @@ WeaponAttackAction.TeNonAeroAirborne=targeting non-aerospace airborne unit
WeaponAttackAction.PutOutInferno=target is inferno fire
WeaponAttackAction.SensorShadow=Target in Sensor Shadow
WeaponAttackAction.SquadTarget=infantry squad target
+WeaponAttackAction.MountSize=mount size
WeaponAttackAction.TeGroundAttack=target making air-to-ground attack
WeaponAttackAction.TeSuperheavyMech=target is superheavy mech
WeaponAttackAction.TeLargeSupportUnit=target is large support unit
@@ -4073,6 +4076,7 @@ GeneralInfoMapSet.over=Over:
GeneralInfoMapSet.vehicle.mpL1=Cruise:
GeneralInfoMapSet.vehicle.mpL2=Flank:
GeneralInfoMapSet.curMoveL=Currently:
+GeneralInfoMapSet.uwCounterL=Rounds of Air Remaining:
GeneralInfoMapSet.currentSensorsL=Current Sensors:
GeneralInfoMapSet.capacity=capacity
GeneralInfoMapSet.heatL=Heat:
diff --git a/megamek/i18n/megamek/common/messages.properties b/megamek/i18n/megamek/common/messages.properties
index a9d87770aa0..05eed7b3bfb 100644
--- a/megamek/i18n/megamek/common/messages.properties
+++ b/megamek/i18n/megamek/common/messages.properties
@@ -577,6 +577,7 @@ TROView.BAModularTurret=Configurable Turret Mount
TROView.Foot=Foot
TROView.Mechanized=Mechanized
TROView.MechanizedSCUBA=Mechanized SCUBA
+TROView.BeastMounted=Beast-Mounted
TROView.InfantryNote.FieldGuns=%d %s with %d rounds of ammo each. Each gun requires %d soldiers to operate.
TROView.InfantryNote.SingleFieldGun=1 %s with %d rounds of ammo. Requires %d soldiers to operate.
TROView.InfantryNote.SCUBA=Weapon range is halved (round down) underwater.
@@ -590,6 +591,9 @@ TROView.InfantryNote.CamoArmor=+3/+2/+1 to-hit modifier to attackers if unit doe
TROView.InfantryNote.IRArmor=Non-infantry units suffer a +1/+1/+2 to-hit modifier for S/M/L ranges.
TROView.InfantryNote.ECMArmor=Invisible to standard/light active probes.
TROView.InfantryNote.Augmented=Cybernetically enhanced infantry:
+TROView.InfantryNote.MountInfantryDamage.format=+%dD6 damage vs. infantry
+TROView.InfantryNote.MountVehicleDamage.format=+%d damage vs. Vehicles/'Mechs
+TROView.InfantryNote.MountSizeMod.format=%d attacker to-hit
MovementType.None=None
MovementType.Biped=Biped
MovementType.Quad=Quad
@@ -622,4 +626,8 @@ MiscType.ton=ton
PilotingSPA.EnvSpec.RainSpec=Rain Specialist
PilotingSPA.EnvSpec.SnowSpec=Snow Specialist
-PilotingSPA.EnvSpec.WindSpec=Wind Specialist
\ No newline at end of file
+PilotingSPA.EnvSpec.WindSpec=Wind Specialist
+
+BeastSize.large=Large
+BeastSize.very_large=Very Large
+BeastSize.monstrous=Monstrous
\ No newline at end of file
diff --git a/megamek/i18n/megamek/common/report-messages.properties b/megamek/i18n/megamek/common/report-messages.properties
index dba621a1c8c..f7763be873b 100755
--- a/megamek/i18n/megamek/common/report-messages.properties
+++ b/megamek/i18n/megamek/common/report-messages.properties
@@ -209,6 +209,7 @@
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
+2412= () runs out of air and is destroyed.
2415= collapes due to nuclear explosion ground zero.
2420= () automatically avoids the skid.
2425= () needs to avoid the skid (), rolls .
diff --git a/megamek/src/megamek/client/ui/swing/DeploymentDisplay.java b/megamek/src/megamek/client/ui/swing/DeploymentDisplay.java
index 78f626d89ae..447df21f3dc 100644
--- a/megamek/src/megamek/client/ui/swing/DeploymentDisplay.java
+++ b/megamek/src/megamek/client/ui/swing/DeploymentDisplay.java
@@ -530,10 +530,12 @@ public void hexMoused(BoardViewEvent b) {
} else if (!isAero && !isWiGE) {
// hovers and naval units go on the surface
if ((ce().getMovementMode() == EntityMovementMode.NAVAL)
- || (ce().getMovementMode() == EntityMovementMode.SUBMARINE)
|| (ce().getMovementMode() == EntityMovementMode.HYDROFOIL)
|| (ce().getMovementMode() == EntityMovementMode.HOVER)) {
ce().setElevation(0);
+ } else if (ce().getMovementMode().isSubmarine()) {
+ // submarines have one level above the surface
+ ce().setElevation(-ce().height());
} else if (isVTOL) {
// VTOLs go to elevation 1... unless set in the Lounge.
// or if mechanized BA, since VTOL movement is then illegal
diff --git a/megamek/src/megamek/client/ui/swing/MovementDisplay.java b/megamek/src/megamek/client/ui/swing/MovementDisplay.java
index 71ba509c442..39ab6c74e55 100644
--- a/megamek/src/megamek/client/ui/swing/MovementDisplay.java
+++ b/megamek/src/megamek/client/ui/swing/MovementDisplay.java
@@ -1703,7 +1703,7 @@ && ce().getGame().getBoard().getHex(cmd.getFinalCoords())
if (landingPath.stream().map(c -> game().getBoard().getHex(c)).filter(Objects::nonNull)
.anyMatch(h -> h.containsTerrain(Terrains.ROUGH) || h.containsTerrain(Terrains.RUBBLE))) {
ConfirmDialog nag = new ConfirmDialog(clientgui.frame,
- Messages.getString("MovementDisplay.areYourSure"),
+ Messages.getString("MovementDisplay.areYouSure"),
Messages.getString("MovementDisplay.ConfirmLandingGearDamage"),
false);
nag.setVisible(true);
@@ -1718,6 +1718,21 @@ && ce().getGame().getBoard().getHex(cmd.getFinalCoords())
isUsingChaff = false;
}
+ if (ce() instanceof Infantry) {
+ InfantryMount mount = ((Infantry) ce()).getMount();
+ if ((mount != null) && ce().getMovementMode().isSubmarine() && (ce().underwaterRounds >= mount.getUWEndurance())
+ && cmd.isAllUnderwater(game())) {
+ ConfirmDialog nag = new ConfirmDialog(clientgui.frame,
+ Messages.getString("MovementDisplay.areYouSure"),
+ Messages.getString("MovementDisplay.ConfirmMountSuffocation"),
+ false);
+ nag.setVisible(true);
+ if (!nag.getAnswer()) {
+ return;
+ }
+ }
+ }
+
disableButtons();
clientgui.getBoardView().clearMovementData();
clientgui.getBoardView().clearMovementEnvelope();
diff --git a/megamek/src/megamek/client/ui/swing/tooltip/UnitToolTip.java b/megamek/src/megamek/client/ui/swing/tooltip/UnitToolTip.java
index 7d46ea42e26..3b9dbb9717e 100644
--- a/megamek/src/megamek/client/ui/swing/tooltip/UnitToolTip.java
+++ b/megamek/src/megamek/client/ui/swing/tooltip/UnitToolTip.java
@@ -1316,6 +1316,17 @@ private static StringBuilder inGameValues(Entity entity, Player localPlayer, boo
}
}
+ if (entity instanceof Infantry) {
+ InfantryMount mount = ((Infantry) entity).getMount();
+ if ((mount != null) && entity.getMovementMode().isSubmarine() && (entity.underwaterRounds > 0)) {
+ String uw = "
" + addToTT("InfUWDuration", NOBR, mount.getUWEndurance() - entity.underwaterRounds).toString();
+ if (entity.underwaterRounds >=mount.getUWEndurance()) {
+ uw = guiScaledFontHTML(GUIP.getWarningColor()) + uw + "";
+ }
+ result += uw;
+ }
+ }
+
String sAeroInfo = "";
if (entity.isAero()) {
diff --git a/megamek/src/megamek/common/Entity.java b/megamek/src/megamek/common/Entity.java
index 423dc5e681e..9a49f73ed52 100644
--- a/megamek/src/megamek/common/Entity.java
+++ b/megamek/src/megamek/common/Entity.java
@@ -289,6 +289,7 @@ public abstract class Entity extends TurnOrdered implements Transporter, Targeta
public int coolFromExternal = 0;
public int delta_distance = 0;
public int mpUsed = 0;
+ public int underwaterRounds = 0;
public EntityMovementType moved = EntityMovementType.MOVE_NONE;
public EntityMovementType movedLastRound = EntityMovementType.MOVE_NONE;
private boolean movedBackwards = false;
@@ -1947,7 +1948,7 @@ public void setElevation(int elevation) {
/**
* A helper function for fiddling with elevation. Takes the current hex, a
* hex being moved to, returns the elevation the Entity will be considered
- * to be at w/r/t it's new hex.
+ * to be at w/r/t its new hex.
*/
public int calcElevation(Hex current, Hex next, int assumedElevation,
boolean climb, boolean wigeEndClimbPrevious) {
@@ -1990,12 +1991,11 @@ public int calcElevation(Hex current, Hex next, int assumedElevation,
}
// Elevation is this height of the level above the actual surface elevation of the hex.
retVal = nextLevel - next.getLevel();
- } else if ((getMovementMode() == EntityMovementMode.SUBMARINE)
- || ((getMovementMode() == EntityMovementMode.INF_UMU)
+ } else if (((getMovementMode().isSubmarine() || getMovementMode().isUMUInfantry())
&& next.containsTerrain(Terrains.WATER) && current.containsTerrain(Terrains.WATER))
- || (getMovementMode() == EntityMovementMode.VTOL)
- || ((getMovementMode() == EntityMovementMode.QUAD_SWIM) && hasUMU())
- || ((getMovementMode() == EntityMovementMode.BIPED_SWIM) && hasUMU())) {
+ || getMovementMode().isVTOL()
+ || (getMovementMode().isQuadSwim() && hasUMU())
+ || (getMovementMode().isBipedSwim() && hasUMU())) {
retVal += current.getLevel();
retVal -= next.getLevel();
} else {
@@ -2350,8 +2350,8 @@ && getMovementMode() == EntityMovementMode.INF_UMU) {
}
// only mechs can move underwater
if (hex.containsTerrain(Terrains.WATER)
- && (assumedAlt < hex.getLevel()) && !(this instanceof Mech)
- && !(this instanceof Protomech)) {
+ && (assumedAlt < hex.getLevel()) && !(this instanceof Mech)
+ && !(this instanceof Protomech)) {
return false;
}
// can move on the ground unless its underwater
diff --git a/megamek/src/megamek/common/Infantry.java b/megamek/src/megamek/common/Infantry.java
index d2de88f3641..e7dd34a47ef 100644
--- a/megamek/src/megamek/common/Infantry.java
+++ b/megamek/src/megamek/common/Infantry.java
@@ -21,6 +21,7 @@
import megamek.MMConstants;
import megamek.client.ui.swing.calculationReport.CalculationReport;
+import megamek.common.annotations.Nullable;
import megamek.common.cost.InfantryCostCalculator;
import megamek.common.enums.AimingMode;
import megamek.common.enums.GamePhase;
@@ -119,6 +120,7 @@ public class Infantry extends Entity {
private boolean isTakingCover = false;
private boolean canCallSupport = true;
private boolean isCallingSupport = false;
+ private InfantryMount mount = null;
/** The maximum number of troopers in an infantry platoon. */
public static final int INF_PLT_MAX_MEN = 30;
@@ -169,6 +171,17 @@ public CrewType defaultCrewType() {
return CrewType.INFANTRY_CREW;
}
+ public TechAdvancement getMotiveTechAdvancement() {
+ return getMotiveTechAdvancement(mount == null ? getMovementMode() : EntityMovementMode.NONE);
+ }
+
+ /**
+ * Generates the {@link TechAdvancement} for the unit's motive type. A value of EntityMovementMode.NONE indicates
+ * Beast-mounted infantry.
+ *
+ * @param movementMode An infantry movement mode.
+ * @return The Tech Advancement data for the movement mode.
+ */
public static TechAdvancement getMotiveTechAdvancement(EntityMovementMode movementMode) {
TechAdvancement techAdvancement = new TechAdvancement(TECH_BASE_ALL)
.setAdvancement(DATE_PS, DATE_PS, DATE_PS)
@@ -214,6 +227,12 @@ public static TechAdvancement getMotiveTechAdvancement(EntityMovementMode moveme
.setAvailability(RATING_D, RATING_D, RATING_D, RATING_D)
.setStaticTechLevel(SimpleTechLevel.ADVANCED);
break;
+ case NONE:
+ // Beast-mounted
+ techAdvancement.setAdvancement(DATE_PS, DATE_PS).setTechRating(RATING_A)
+ .setAvailability(RATING_A, RATING_A, RATING_A, RATING_A)
+ .setStaticTechLevel(SimpleTechLevel.ADVANCED);
+ break;
case INF_LEG:
default:
techAdvancement.setTechRating(RATING_A)
@@ -288,7 +307,7 @@ public static TechAdvancement getAntiMekTA() {
@Override
protected void addSystemTechAdvancement(CompositeTechLevel ctl) {
super.addSystemTechAdvancement(ctl);
- ctl.addComponent(Infantry.getMotiveTechAdvancement(movementMode));
+ ctl.addComponent(getMotiveTechAdvancement());
if (hasSpecialization(COMBAT_ENGINEERS)) {
ctl.addComponent(Infantry.getCombatEngineerTA());
}
@@ -346,33 +365,36 @@ public boolean getIsCallingSupport() {
@Override
public int getWalkMP(MPCalculationSetting mpCalculationSetting) {
int mp = getOriginalWalkMP();
- // Encumbering armor (TacOps, pg. 318)
- if (encumbering) {
- mp = Math.max(mp - 1, 1);
- }
- if ((getSecondaryWeaponsPerSquad() > 1)
- && !hasAbility(OptionsConstants.MD_TSM_IMPLANT)
- && !hasAbility(OptionsConstants.MD_DERMAL_ARMOR)
- && (null != secondaryWeapon) && secondaryWeapon.hasFlag(WeaponType.F_INF_SUPPORT)
- && !getMovementMode().isTracked()
- && !getMovementMode().isJumpInfantry()) {
- mp = Math.max(mp - 1, 0);
- }
- // PL-MASC IntOps p.84
- if ((null != getCrew())
- && hasAbility(OptionsConstants.MD_PL_MASC)
- && getMovementMode().isLegInfantry()
- && isConventionalInfantry()) {
- mp += 1;
- }
+ // Beast mounted infantry depends entirely on the creature
+ if (mount == null) {
+ // Encumbering armor (TacOps, pg. 318)
+ if (encumbering) {
+ mp = Math.max(mp - 1, 1);
+ }
+ if ((getSecondaryWeaponsPerSquad() > 1)
+ && !hasAbility(OptionsConstants.MD_TSM_IMPLANT)
+ && !hasAbility(OptionsConstants.MD_DERMAL_ARMOR)
+ && (null != secondaryWeapon) && secondaryWeapon.hasFlag(WeaponType.F_INF_SUPPORT)
+ && !getMovementMode().isTracked()
+ && !getMovementMode().isJumpInfantry()) {
+ mp = Math.max(mp - 1, 0);
+ }
+ // PL-MASC IntOps p.84
+ if ((null != getCrew())
+ && hasAbility(OptionsConstants.MD_PL_MASC)
+ && getMovementMode().isLegInfantry()
+ && isConventionalInfantry()) {
+ mp += 1;
+ }
- if ((null != getCrew()) && hasAbility(OptionsConstants.INFANTRY_FOOT_CAV)
- && ((getMovementMode().isLegInfantry()) || (getMovementMode().isJumpInfantry()))) {
- mp += 1;
- }
+ if ((null != getCrew()) && hasAbility(OptionsConstants.INFANTRY_FOOT_CAV)
+ && ((getMovementMode().isLegInfantry()) || (getMovementMode().isJumpInfantry()))) {
+ mp += 1;
+ }
- if (hasActiveFieldArtillery()) {
- mp = Math.min(mp, 1);
+ if (hasActiveFieldArtillery()) {
+ mp = Math.min(mp, 1);
+ }
}
if (!mpCalculationSetting.ignoreWeather && (null != game)) {
@@ -428,14 +450,16 @@ public int getRunMP(MPCalculationSetting mpCalculationSetting) {
@Override
public int getJumpMP(MPCalculationSetting mpCalculationSetting) {
int mp = hasUMU() ? 0 : getOriginalJumpMP();
- if ((getSecondaryWeaponsPerSquad() > 1)
- && !hasAbility(OptionsConstants.MD_TSM_IMPLANT)
- && !hasAbility(OptionsConstants.MD_DERMAL_ARMOR)
- && !getMovementMode().isSubmarine()
- && (null != secondaryWeapon) && secondaryWeapon.hasFlag(WeaponType.F_INF_SUPPORT)) {
- mp = Math.max(mp - 1, 0);
- } else if (movementMode.isVTOL() && getSecondaryWeaponsPerSquad() > 0) {
- mp = Math.max(mp - 1, 0);
+ if (mount == null) {
+ if ((getSecondaryWeaponsPerSquad() > 1)
+ && !hasAbility(OptionsConstants.MD_TSM_IMPLANT)
+ && !hasAbility(OptionsConstants.MD_DERMAL_ARMOR)
+ && !getMovementMode().isSubmarine()
+ && (null != secondaryWeapon) && secondaryWeapon.hasFlag(WeaponType.F_INF_SUPPORT)) {
+ mp = Math.max(mp - 1, 0);
+ } else if (movementMode.isVTOL() && getSecondaryWeaponsPerSquad() > 0) {
+ mp = Math.max(mp - 1, 0);
+ }
}
if (!mpCalculationSetting.ignoreGravity) {
@@ -476,6 +500,11 @@ public int getAllUMUCount() {
return hasUMU() ? jumpMP : 0;
}
+ @Override
+ public int height() {
+ return mount == null ? 0 : mount.getSize().height;
+ }
+
@Override
public boolean antiTSMVulnerable() {
if (!hasAbility(OptionsConstants.MD_TSM_IMPLANT)) {
@@ -558,17 +587,36 @@ public boolean isLocationProhibited(Coords c, int currElevation) {
}
if ((hex.terrainLevel(Terrains.WATER) <= 0) && getMovementMode().isSubmarine()) {
- return true;
+ return (mount == null) || (mount.getSecondaryGroundMP() == 0);
}
if ((hex.terrainLevel(Terrains.WATER) > 0) && !hex.containsTerrain(Terrains.ICE)) {
- return !getMovementMode().isHover() && !getMovementMode().isUMUInfantry()
- && !getMovementMode().isSubmarine() && !getMovementMode().isVTOL();
+ if (mount == null) {
+ return !getMovementMode().isHover() && !getMovementMode().isUMUInfantry()
+ && !getMovementMode().isSubmarine() && !getMovementMode().isVTOL();
+ } else {
+ return hex.terrainLevel(Terrains.WATER) > mount.getMaxWaterDepth();
+ }
}
return false;
}
@Override
+ public boolean isElevationValid(int assumedElevation, Hex hex) {
+ if (mount != null) {
+ // Mounted infantry can enter water hexes if the mount allows it
+ if (hex.containsTerrain(Terrains.WATER) && (hex.terrainLevel(Terrains.WATER) <= mount.getMaxWaterDepth())) {
+ return true;
+ }
+ // Aquatic mounts may be able to move onto land
+ if (!hex.containsTerrain(Terrains.WATER) && movementMode.isSubmarine()) {
+ return mount.getSecondaryGroundMP() > 0;
+ }
+ }
+ return super.isElevationValid(assumedElevation, hex);
+ }
+
+ @Override
public String getMovementString(EntityMovementType mtype) {
switch (mtype) {
case MOVE_NONE:
@@ -577,7 +625,7 @@ public String getMovementString(EntityMovementType mtype) {
case MOVE_RUN:
switch (getMovementMode()) {
case INF_LEG:
- return "Walked";
+ return mount == null ? "Walked" : "Rode";
case INF_MOTORIZED:
return "Biked";
case HOVER:
@@ -1215,7 +1263,6 @@ public void setArmorKit(EquipmentType armorKit) {
} catch (LocationFullException ex) {
LogManager.getLogger().error("", ex);
}
- damageDivisor = ((MiscType) armorKit).getDamageDivisor();
encumbering = (armorKit.getSubType() & MiscType.S_ENCUMBERING) != 0;
spaceSuit = (armorKit.getSubType() & MiscType.S_SPACE_SUIT) != 0;
dest = (armorKit.getSubType() & MiscType.S_DEST) != 0;
@@ -1223,10 +1270,15 @@ public void setArmorKit(EquipmentType armorKit) {
sneak_ir = (armorKit.getSubType() & MiscType.S_SNEAK_IR) != 0;
sneak_ecm = (armorKit.getSubType() & MiscType.S_SNEAK_ECM) != 0;
}
+ calcDamageDivisor();
}
public double calcDamageDivisor() {
- double divisor = damageDivisor;
+ double divisor = 1.0;
+ EquipmentType armorKit = getArmorKit();
+ if (armorKit != null) {
+ divisor = ((MiscType) armorKit).getDamageDivisor();
+ }
// TSM implant reduces divisor to 0.5 if no other armor is worn
if ((divisor == 1.0) && hasAbility(OptionsConstants.MD_TSM_IMPLANT)) {
divisor = 0.5;
@@ -1235,6 +1287,9 @@ public double calcDamageDivisor() {
if (hasAbility(OptionsConstants.MD_DERMAL_ARMOR)) {
divisor += 1.0;
}
+ if (mount != null) {
+ divisor *= mount.getDamageDivisor();
+ }
return divisor;
}
@@ -1447,6 +1502,25 @@ public void setMicrolite(boolean microlite) {
this.isMicrolite = microlite;
}
+ public void setMount(InfantryMount mount) {
+ this.mount = mount;
+ if (mount != null) {
+ setMovementMode(mount.getMovementMode());
+ if (mount.getMovementMode().isLegInfantry()) {
+ setOriginalWalkMP(mount.getMP());
+ } else {
+ setOriginalWalkMP(mount.getSecondaryGroundMP());
+ setOriginalJumpMP(mount.getMP());
+ }
+ setArmorDamageDivisor(mount.getDamageDivisor());
+ }
+ calcDamageDivisor();
+ }
+
+ public @Nullable InfantryMount getMount() {
+ return mount;
+ }
+
/**
* Used to check for standard or motorized SCUBA infantry, which have a maximum depth of 2.
* @return true if this is a conventional infantry unit with non-mechanized SCUBA specialization
@@ -1581,7 +1655,7 @@ public void setMovementMode(EntityMovementMode movementMode) {
default:
setOriginalWalkMP(1);
}
- addTechComponent(Infantry.getMotiveTechAdvancement(movementMode));
+ addTechComponent(getMotiveTechAdvancement());
}
}
@@ -1619,6 +1693,13 @@ public boolean canMakeAntiMekAttacks() {
@Override
public double getWeight() {
+ if (mount != null) {
+ if (mount.getSize().troopsPerCreature > 1) {
+ return (mount.getWeight() + 0.2 * getSquadSize()) * getSquadCount();
+ } else {
+ return (mount.getWeight() + 0.2) * activeTroopers;
+ }
+ }
double mult;
switch (getMovementMode()) {
case INF_MOTORIZED:
diff --git a/megamek/src/megamek/common/InfantryMount.java b/megamek/src/megamek/common/InfantryMount.java
new file mode 100644
index 00000000000..32e1a3ea353
--- /dev/null
+++ b/megamek/src/megamek/common/InfantryMount.java
@@ -0,0 +1,305 @@
+/*
+ * MegaMek -
+ * Copyright (c) 2023 - The MegaMek Team. All Rights Reserved.
+ *
+ * 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;
+
+import java.io.Serializable;
+import java.util.List;
+import java.util.StringJoiner;
+
+/**
+ * Stats for beast mounted infantry units. See TO:AU&E, p. 106
+ */
+public class InfantryMount implements Serializable {
+ public enum BeastSize {
+ LARGE(1, 21, 0, 0, true, true, 0, 0, "BeastSize.large"),
+ VERY_LARGE(2, 7, -1, 2, true, false, 1, 1, "BeastSize.very_large"),
+ MONSTROUS(4, 2, -2, 3, false, false, 2, 1, "BeastSize.monstrous");
+
+ /** Maximum number of troopers that can be mounted on each beast. For values > 2,
+ * each creature is a separate squad. */
+ public final int troopsPerCreature;
+ /** Maximum number of creatures allowed in a single platoon */
+ public final int creaturesPerPlatoon;
+ /** Modifer to attack rolls against the beast-mounted infantry due to size */
+ public final int toHitMod;
+ /** Maximum number of support weapons allowed per creature. Divide weapon crew needs by 2, rounding up */
+ public final int supportWeaponsPerCreature;
+ /** Whether the infantry unit is permitted to make anti-mech leg attacks */
+ public final boolean canMakeLegAttacks;
+ /** Whether the infantry unit is permitted to make anti-=mech swarm attacks */
+ public final boolean canMakeSwarmAttacks;
+ /** Additional MP required to enter a building hex. The building takes twice this much CF damage. */
+ public final int buildingMP;
+ public final int height;
+ private final String messageId;
+
+ BeastSize(int troopsPerCreature, int creaturesPerPlatoon, int toHitMod,
+ int supportWeaponsPerCreature, boolean canMakeLegAttacks,
+ boolean canMakeSwarmAttacks, int buildingMP, int height, String messageId) {
+ this.troopsPerCreature = troopsPerCreature;
+ this.creaturesPerPlatoon = creaturesPerPlatoon;
+ this.toHitMod = toHitMod;
+ this.supportWeaponsPerCreature = supportWeaponsPerCreature;
+ this.canMakeLegAttacks = canMakeLegAttacks;
+ this.canMakeSwarmAttacks = canMakeSwarmAttacks;
+ this.buildingMP = buildingMP;
+ this.height = height;
+ this.messageId = messageId;
+ }
+
+ /**
+ * @return The amount of CF damage done to a building when entering its hex.
+ */
+ public int buildingDamage() {
+ return buildingMP * 2;
+ }
+
+ public String displayName() {
+ return Messages.getString(messageId);
+ }
+ }
+
+ private final String name;
+ private final BeastSize size;
+ private final double weight;
+ private final int movementPoints;
+ private final EntityMovementMode movementMode;
+ private final int burstDamage;
+ private final int vehicleDamage;
+ private final double damageDivisor;
+ private final int maxWaterDepth;
+ private final int secondaryGroundMP;
+ private final int uwEndurance;
+ private final boolean custom;
+
+ private InfantryMount(String name, BeastSize size, double weight, int movementPoints,
+ EntityMovementMode movementMode, int burstDamage,
+ int vehicleDamage, double damageDivisor, int maxWaterDepth,
+ int secondaryGroundMP, int uwEndurance, boolean custom) {
+ this.name = name;
+ this.size = size;
+ this.weight = weight;
+ this.movementPoints = movementPoints;
+ this.movementMode = movementMode;
+ this.burstDamage = burstDamage;
+ this.vehicleDamage = vehicleDamage;
+ this.damageDivisor = damageDivisor;
+ this.maxWaterDepth = maxWaterDepth;
+ this.secondaryGroundMP = secondaryGroundMP;
+ this.uwEndurance = uwEndurance;
+ this.custom = custom;
+ }
+
+ public InfantryMount(String name, BeastSize size, double weight, int movementPoints,
+ EntityMovementMode movementMode, int burstDamage,
+ int vehicleDamage, double damageDivisor, int maxWaterDepth,
+ int secondaryGroundMP, int uwEndurance) {
+ this(name, size, weight, movementPoints, movementMode, burstDamage, vehicleDamage, damageDivisor,
+ maxWaterDepth, secondaryGroundMP, uwEndurance, true);
+ }
+
+
+ /**
+ * @return The name of the beast.
+ */
+ public String getName() {
+ return name;
+ }
+
+ /**
+ * @return The size class of the beast.
+ */
+ public BeastSize getSize() {
+ return size;
+ }
+
+ /**
+ * @return The weight of each beast in tons. Add 2t per trooper to get total weight.
+ */
+ public double getWeight() {
+ return weight;
+ }
+
+ /**
+ * @return The number of movement points using the primary movement node.
+ */
+ public int getMP() {
+ return movementPoints;
+ }
+
+ /**
+ * @return The primary movement mode.
+ */
+ public EntityMovementMode getMovementMode() {
+ return movementMode;
+ }
+
+ /**
+ *
+ * @return The number of damage dice to use as burst damage against conventional infantry
+ * in the same hex.
+ */
+ public int getBurstDamageDice() {
+ return burstDamage;
+ }
+
+ /**
+ * @return The amount of additonal damage done to units other than conventional infantry in the same hex.
+ */
+ public int getVehicleDamage() {
+ return vehicleDamage;
+ }
+
+ /**
+ * @return The number used to divide any damage received in combat.
+ */
+ public double getDamageDivisor() {
+ return damageDivisor;
+ }
+
+ /**
+ * @return The maximum depth of water the unit may enter.
+ */
+ public int getMaxWaterDepth() {
+ return maxWaterDepth;
+ }
+
+ /**
+ * @return For units with a primary movement mode other than ground, this is
+ * the number of ground MP available.
+ */
+ public int getSecondaryGroundMP() {
+ return secondaryGroundMP;
+ }
+
+ /**
+ * @return For creatures with underwater movement, this is the number of turns they
+ * can stay underwater before needing to resurface.
+ */
+ public int getUWEndurance() {
+ return uwEndurance;
+ }
+
+ @Override
+ public String toString() {
+ if (custom) {
+ StringJoiner sj = new StringJoiner(",");
+ sj.add(name).add(size.name()).add(String.valueOf(weight)).add(String.valueOf(movementPoints))
+ .add(movementMode.name()).add(String.valueOf(burstDamage)).add(String.valueOf(vehicleDamage))
+ .add(String.valueOf(damageDivisor)).add(String.valueOf(maxWaterDepth))
+ .add(String.valueOf(secondaryGroundMP)).add(String.valueOf(uwEndurance));
+ return "Beast:Custom:" + sj;
+ } else {
+ return "Beast:" + name;
+ }
+ }
+
+ public static InfantryMount parse(String str) {
+ final String toParse = str.trim().replace("Beast:", "");
+ if (toParse.startsWith("Custom:")) {
+ // Provide some decent information about which field is causing the problem
+ String[] fields = toParse.replace("Custom:", "").split(",");
+ if (fields.length < 11) {
+ throw new IllegalArgumentException("Infantry mount string " + str + " does not have enough fields.");
+ }
+ BeastSize size;
+ try {
+ size = BeastSize.valueOf(fields[1]);
+ } catch (Exception ex) {
+ throw new IllegalArgumentException("Could not parse BeastSize " + fields[1]);
+ }
+ double weight;
+ try {
+ weight = Double.parseDouble(fields[2]);
+ } catch (Exception ex) {
+ throw new IllegalArgumentException("Could not parse InfantryMount movementMode " + fields[4]);
+ }
+ EntityMovementMode mode;
+ try {
+ mode = EntityMovementMode.valueOf(fields[4]);
+ } catch (Exception ex) {
+ throw new IllegalArgumentException("Could not parse InfantryMount movementMode " + fields[4]);
+ }
+ double divisor;
+ try {
+ divisor = Double.parseDouble(fields[7]);
+ } catch (Exception ex) {
+ throw new IllegalArgumentException("Could not parse InfantryMount damageDivisor " + fields[7]);
+ }
+ return new InfantryMount(fields[0], size, weight, parseIntField(fields[3], "movementPoints"),
+ mode, parseIntField(fields[5], "burstDamage"), parseIntField(fields[6], "vehicleDamage"),
+ divisor, parseIntField(fields[8], "maxWaterDepth"), parseIntField(fields[9], "secondaryGroundMP"),
+ parseIntField(fields[10], "uwEndurance"));
+ } else {
+ return sampleMounts.stream().filter(it -> it.name.equals(toParse)).findFirst()
+ .orElseThrow(() -> new IllegalArgumentException("Could not parse beast mount " + toParse));
+ }
+ }
+
+ private static int parseIntField(String field, String fieldName) {
+ try {
+ return Integer.parseInt(field);
+ } catch (Exception ex) {
+ throw new IllegalArgumentException("Could not parse InfantryMount field " + fieldName + " value " + field);
+ }
+ }
+
+ public static final InfantryMount DONKEY = new InfantryMount("Donkey", BeastSize.LARGE,
+ 0.15, 2, EntityMovementMode.INF_LEG, 0, 0, 1.0,
+ 0, 0, 0, false);
+
+ public static final InfantryMount COVENTRY_KANGAROO = new InfantryMount("Coventry Kangaroo", BeastSize.LARGE,
+ 0.11, 3, EntityMovementMode.INF_LEG, 1, 1, 1.0,
+ 0, 0, 0, false);
+
+ public static final InfantryMount HORSE = new InfantryMount("Horse", BeastSize.LARGE,
+ 0.5, 3, EntityMovementMode.INF_LEG, 0, 0, 1.0,
+ 0, 0, 0, false);
+
+ public static final InfantryMount CAMEL = new InfantryMount("Camel", BeastSize.LARGE,
+ 0.65, 2, EntityMovementMode.INF_LEG, 0, 0, 1.0,
+ 0, 0, 0, false);
+
+ public static final InfantryMount BRANTH = new InfantryMount("Branth", BeastSize.LARGE,
+ 0.72, 6, EntityMovementMode.VTOL, 2, 1, 1.0,
+ 0, 0, 0, false);
+
+ public static final InfantryMount ODESSAN_RAXX = new InfantryMount("Odessan Raxx", BeastSize.LARGE,
+ 2.4, 2, EntityMovementMode.INF_LEG, 1, 1, 1.0,
+ 0, 0, 0, false);
+
+ public static final InfantryMount TABIRANTH = new InfantryMount("Tabiranth", BeastSize.LARGE,
+ 0.25, 2, EntityMovementMode.INF_LEG, 1, 1, 1.0,
+ 0, 0, 0, false);
+
+ public static final InfantryMount TARIQ = new InfantryMount("Tariq", BeastSize.LARGE,
+ 0.51, 5, EntityMovementMode.INF_LEG, 0, 0, 1.0,
+ 0, 0, 0, false);
+
+ public static final InfantryMount ELEPHANT = new InfantryMount("Elephant", BeastSize.VERY_LARGE,
+ 6.0, 2, EntityMovementMode.INF_LEG, 1, 1, 2.0,
+ 1, 0, 0, false);
+
+ public static final InfantryMount ORCA = new InfantryMount("Orca", BeastSize.VERY_LARGE,
+ 7.2, 5, EntityMovementMode.SUBMARINE, 2, 1, 2.0,
+ Integer.MAX_VALUE, 0, 180, false);
+
+ public static final InfantryMount HIPPOSAUR = new InfantryMount("Hipposaur", BeastSize.MONSTROUS,
+ 35.5, 2, EntityMovementMode.SUBMARINE, 10, 4, 4.0,
+ Integer.MAX_VALUE, 1, 2, false);
+
+ public static final List sampleMounts = List.of(DONKEY, COVENTRY_KANGAROO, HORSE, CAMEL, BRANTH,
+ ODESSAN_RAXX, TABIRANTH, TARIQ, ELEPHANT, ORCA, HIPPOSAUR);
+}
diff --git a/megamek/src/megamek/common/MechFileParser.java b/megamek/src/megamek/common/MechFileParser.java
index f44bca7d6b2..94dc820763b 100644
--- a/megamek/src/megamek/common/MechFileParser.java
+++ b/megamek/src/megamek/common/MechFileParser.java
@@ -734,15 +734,20 @@ else if (m.getType().hasFlag(MiscType.F_APOLLO)
// physical attacks for conventional infantry
else if ((ent instanceof Infantry) && ((Infantry) ent).canMakeAntiMekAttacks()) {
try {
- ent.addEquipment(EquipmentType.get(Infantry.SWARM_MEK),
- Infantry.LOC_INFANTRY, false,
- BattleArmor.MOUNT_LOC_NONE, false);
- ent.addEquipment(EquipmentType.get(Infantry.STOP_SWARM),
- Infantry.LOC_INFANTRY, false,
- BattleArmor.MOUNT_LOC_NONE, false);
- ent.addEquipment(EquipmentType.get(Infantry.LEG_ATTACK),
- Infantry.LOC_INFANTRY, false,
- BattleArmor.MOUNT_LOC_NONE, false);
+ InfantryMount mount = ((Infantry) ent).getMount();
+ if ((mount == null) || mount.getSize().canMakeSwarmAttacks) {
+ ent.addEquipment(EquipmentType.get(Infantry.SWARM_MEK),
+ Infantry.LOC_INFANTRY, false,
+ BattleArmor.MOUNT_LOC_NONE, false);
+ ent.addEquipment(EquipmentType.get(Infantry.STOP_SWARM),
+ Infantry.LOC_INFANTRY, false,
+ BattleArmor.MOUNT_LOC_NONE, false);
+ }
+ if ((mount == null) || mount.getSize().canMakeLegAttacks) {
+ ent.addEquipment(EquipmentType.get(Infantry.LEG_ATTACK),
+ Infantry.LOC_INFANTRY, false,
+ BattleArmor.MOUNT_LOC_NONE, false);
+ }
} catch (LocationFullException ex) {
throw new EntityLoadingException(ex.getMessage());
}
diff --git a/megamek/src/megamek/common/MechView.java b/megamek/src/megamek/common/MechView.java
index f3e5bd4083c..a5ceccc6046 100644
--- a/megamek/src/megamek/common/MechView.java
+++ b/megamek/src/megamek/common/MechView.java
@@ -340,6 +340,9 @@ public MechView(final Entity entity, final boolean showDetail, final boolean use
.append(warningEnd());
}
}
+ if (entity.isConventionalInfantry() && ((Infantry) entity).getMount() != null) {
+ moveString.append(" (").append(((Infantry) entity).getMount().getName()).append(")");
+ }
// TODO : Add STOL message as part of the movement line
if (isConvFighter && ((Aero) entity).isVSTOL()) {
diff --git a/megamek/src/megamek/common/MovePath.java b/megamek/src/megamek/common/MovePath.java
index 91dcb05abf1..0dcc284d871 100644
--- a/megamek/src/megamek/common/MovePath.java
+++ b/megamek/src/megamek/common/MovePath.java
@@ -1669,6 +1669,21 @@ public boolean automaticWiGELanding(boolean includeMovePathHexes) {
}
}
+ /**
+ * @return Whether the entire path is submerged. A unit is only considered submerged when entirely undewater.
+ */
+ public boolean isAllUnderwater(Game game) {
+ for (MoveStep step : steps) {
+ Hex hex = game.getBoard().getHex(step.getPosition());
+ if (!hex.containsTerrain(Terrains.WATER)
+ || (step.getElevation() >= -entity.height())) {
+ return false;
+ }
+ }
+ return game.getBoard().getHex(entity.getPosition()).containsTerrain(Terrains.WATER)
+ && entity.relHeight() < 0;
+ }
+
protected static class MovePathComparator implements Comparator {
private final Coords destination;
boolean backward;
diff --git a/megamek/src/megamek/common/MoveStep.java b/megamek/src/megamek/common/MoveStep.java
index 9618436dd16..4740d116d7a 100644
--- a/megamek/src/megamek/common/MoveStep.java
+++ b/megamek/src/megamek/common/MoveStep.java
@@ -2334,7 +2334,8 @@ && getClearance() < 0) {
if ((getEntity().getMovementMode() == EntityMovementMode.BIPED_SWIM)
|| (getEntity().getMovementMode() == EntityMovementMode.QUAD_SWIM)
|| ((getEntity() instanceof Infantry
- && getEntity().getMovementMode() == EntityMovementMode.SUBMARINE))) {
+ && getEntity().getMovementMode().isSubmarine()
+ && (currHex.terrainLevel(Terrains.WATER) > 0)))) {
tmpWalkMP = entity.getActiveUMUCount();
}
@@ -3167,6 +3168,8 @@ && getClearance() == 0) {
} else if (isMechanizedInfantry) {
// mechanized infantry pays 1 extra
mp += 1;
+ } else if (isInfantry && (((Infantry) entity).getMount() != null)) {
+ mp += ((Infantry) entity).getMount().getSize().buildingMP;
}
}
diff --git a/megamek/src/megamek/common/actions/WeaponAttackAction.java b/megamek/src/megamek/common/actions/WeaponAttackAction.java
index 2f67648ec58..f24806450a7 100644
--- a/megamek/src/megamek/common/actions/WeaponAttackAction.java
+++ b/megamek/src/megamek/common/actions/WeaponAttackAction.java
@@ -4208,9 +4208,15 @@ else if ((atype != null)
toHit.addModifier(1, Messages.getString("WeaponAttackAction.BaTarget"));
}
- // infantry squads are also hard to hit
- if ((te instanceof Infantry) && te.isConventionalInfantry() && ((Infantry) te).isSquad()) {
- toHit.addModifier(1, Messages.getString("WeaponAttackAction.SquadTarget"));
+ if ((te instanceof Infantry) && te.isConventionalInfantry()) {
+ // infantry squads are also hard to hit
+ if (((Infantry) te).isSquad()) {
+ toHit.addModifier(1, Messages.getString("WeaponAttackAction.SquadTarget"));
+ }
+ InfantryMount mount = ((Infantry) te).getMount();
+ if ((mount != null) && (mount.getSize().toHitMod != 0)) {
+ toHit.addModifier(mount.getSize().toHitMod, Messages.getString("WeaponAttackAction.MountSize"));
+ }
}
// pl-masc makes foot infantry harder to hit - IntOps p.84
diff --git a/megamek/src/megamek/common/cost/InfantryCostCalculator.java b/megamek/src/megamek/common/cost/InfantryCostCalculator.java
index b0d27da9383..7ede4d0dbef 100644
--- a/megamek/src/megamek/common/cost/InfantryCostCalculator.java
+++ b/megamek/src/megamek/common/cost/InfantryCostCalculator.java
@@ -92,11 +92,13 @@ public static double calculateCost(Infantry infantry, CalculationReport costRepo
costs[idx++] = -infantry.getPriceMultiplier();
// add in field gun costs
- costs[idx] = infantry.originalFieldWeapons().stream()
+ costs[idx++] = infantry.originalFieldWeapons().stream()
.mapToDouble(m -> m.getType().getCost(infantry, false, m.getLocation())).sum();
+ costs[idx] = infantry.getMount() == null ? 0 : 5000 * infantry.getWeight();
+
double cost = CostCalculator.calculateCost(costs);
- String[] systemNames = { "Weapons", "Armor", "Multiplier", "Field Gun" };
+ String[] systemNames = { "Weapons", "Armor", "Multiplier", "Field Gun", "Mount" };
CostCalculator.fillInReport(costReport, infantry, ignoreAmmo, systemNames, -1, cost, costs);
return cost;
}
diff --git a/megamek/src/megamek/common/loaders/BLKFile.java b/megamek/src/megamek/common/loaders/BLKFile.java
index fee0c2482ca..18667a452c9 100644
--- a/megamek/src/megamek/common/loaders/BLKFile.java
+++ b/megamek/src/megamek/common/loaders/BLKFile.java
@@ -595,7 +595,11 @@ public static BuildingBlock getBlock(Entity t) {
}
blk.writeBlockData("type", type);
- blk.writeBlockData("motion_type", t.getMovementModeAsString());
+ if ((t instanceof Infantry) && ((Infantry) t).getMount() != null) {
+ blk.writeBlockData("motion_type", ((Infantry) t).getMount().toString());
+ } else {
+ blk.writeBlockData("motion_type", t.getMovementModeAsString());
+ }
if(t.getTransports().size() > 0) {
// We should only write the transporters block for units that can and do
diff --git a/megamek/src/megamek/common/loaders/BLKInfantryFile.java b/megamek/src/megamek/common/loaders/BLKInfantryFile.java
index 9db1a166463..cb27ffa9dd6 100644
--- a/megamek/src/megamek/common/loaders/BLKInfantryFile.java
+++ b/megamek/src/megamek/common/loaders/BLKInfantryFile.java
@@ -13,13 +13,7 @@
*/
package megamek.common.loaders;
-import megamek.common.Entity;
-import megamek.common.EntityMovementMode;
-import megamek.common.EquipmentType;
-import megamek.common.Infantry;
-import megamek.common.LocationFullException;
-import megamek.common.MiscType;
-import megamek.common.WeaponType;
+import megamek.common.*;
import megamek.common.util.BuildingBlock;
import megamek.common.weapons.infantry.InfantryWeapon;
@@ -81,15 +75,19 @@ public Entity getEntity() throws EntityLoadingException {
}
String sMotion = dataFile.getDataAsString("motion_type")[0];
t.setMicrolite(sMotion.equalsIgnoreCase("microlite"));
- EntityMovementMode nMotion = EntityMovementMode.parseFromString(sMotion);
- if (nMotion.isNone()) {
- throw new EntityLoadingException("Invalid movement type: " + sMotion);
- }
- if (nMotion == EntityMovementMode.INF_UMU
- && sMotion.toLowerCase().contains("motorized")) {
- t.setMotorizedScuba();
+ if (sMotion.startsWith("Beast:")) {
+ t.setMount(InfantryMount.parse(sMotion));
} else {
- t.setMovementMode(nMotion);
+ EntityMovementMode nMotion = EntityMovementMode.parseFromString(sMotion);
+ if (nMotion.isNone()) {
+ throw new EntityLoadingException("Invalid movement type: " + sMotion);
+ }
+ if (nMotion == EntityMovementMode.INF_UMU
+ && sMotion.toLowerCase().contains("motorized")) {
+ t.setMotorizedScuba();
+ } else {
+ t.setMovementMode(nMotion);
+ }
}
// get primary and secondary weapons
diff --git a/megamek/src/megamek/common/templates/InfantryTROView.java b/megamek/src/megamek/common/templates/InfantryTROView.java
index d5c806a3778..2227f13c342 100644
--- a/megamek/src/megamek/common/templates/InfantryTROView.java
+++ b/megamek/src/megamek/common/templates/InfantryTROView.java
@@ -77,22 +77,26 @@ protected void initModel(EntityVerifier verifier) {
setModelData("notes", String.join(" ", notes));
}
- switch (inf.getMovementMode()) {
- case INF_LEG:
- setModelData("motiveType", Messages.getString("TROView.Foot"));
- break;
- case TRACKED:
- case HOVER:
- case WHEELED:
- setModelData("motiveType",
- Messages.getString("TROView.Mechanized") + "/" + inf.getMovementModeAsString());
- break;
- case SUBMARINE:
- setModelData("motiveType", Messages.getString("TROView.MechanizedSCUBA"));
- break;
- default:
- setModelData("motiveType", inf.getMovementModeAsString());
- break;
+ if (inf.getMount() != null) {
+ setModelData("motiveType", Messages.getString("TROView.BeastMounted") + ", " + inf.getMount().getName());
+ } else {
+ switch (inf.getMovementMode()) {
+ case INF_LEG:
+ setModelData("motiveType", Messages.getString("TROView.Foot"));
+ break;
+ case TRACKED:
+ case HOVER:
+ case WHEELED:
+ setModelData("motiveType",
+ Messages.getString("TROView.Mechanized") + "/" + inf.getMovementModeAsString());
+ break;
+ case SUBMARINE:
+ setModelData("motiveType", Messages.getString("TROView.MechanizedSCUBA"));
+ break;
+ default:
+ setModelData("motiveType", inf.getMovementModeAsString());
+ break;
+ }
}
StringJoiner sj = new StringJoiner(", ");
for (int i = 0; i < Infantry.NUM_SPECIALIZATIONS; i++) {
@@ -193,6 +197,20 @@ private void addWeaponNotes(List notes) {
notes.add(Messages.getString("TROView.InfantryNote.Heat"));
}
}
+ if (inf.getMount() != null) {
+ if (inf.getMount().getBurstDamageDice() > 0) {
+ notes.add(String.format(Messages.getString("TROView.InfantryNote.MountInfantryDamage.format"),
+ inf.getMount().getBurstDamageDice()));
+ }
+ if (inf.getMount().getVehicleDamage() > 0) {
+ notes.add(String.format(Messages.getString("TROView.InfantryNote.MountVehicleDamage.format"),
+ inf.getMount().getVehicleDamage()));
+ }
+ if (inf.getMount().getSize().toHitMod != 0) {
+ notes.add(String.format(Messages.getString("TROView.InfantryNote.MountSizeMod.format"),
+ inf.getMount().getSize().toHitMod));
+ }
+ }
}
private void addArmorNotes(List notes, EquipmentType armorKit) {
diff --git a/megamek/src/megamek/common/verifier/TestInfantry.java b/megamek/src/megamek/common/verifier/TestInfantry.java
index 27719f314d9..5fbe9625110 100644
--- a/megamek/src/megamek/common/verifier/TestInfantry.java
+++ b/megamek/src/megamek/common/verifier/TestInfantry.java
@@ -17,6 +17,8 @@
import megamek.common.Entity;
import megamek.common.EntityMovementMode;
import megamek.common.Infantry;
+import megamek.common.InfantryMount;
+import megamek.common.annotations.Nullable;
import megamek.common.options.OptionsConstants;
/**
@@ -137,6 +139,10 @@ public boolean correctEntity(StringBuffer buff, int ammoTechLvl) {
if (inf.getSecondaryWeapon() != null) {
int secondaryCrew = inf.getSecondaryWeapon().getCrew();
+ // Beast mounted infantry divide crew requirement in half, rounding up.
+ if (inf.getMount() != null) {
+ secondaryCrew = secondaryCrew / 2 + secondaryCrew % 2;
+ }
if (inf.getCrew() != null) {
if (inf.hasAbility(OptionsConstants.MD_TSM_IMPLANT)) {
secondaryCrew--;
@@ -152,14 +158,14 @@ public boolean correctEntity(StringBuffer buff, int ammoTechLvl) {
}
}
- max = maxSquadSize(inf.getMovementMode(), inf.hasMicrolite() || (inf.getAllUMUCount() > 1));
+ max = maxSquadSize(inf.getMovementMode(), inf.hasMicrolite() || (inf.getAllUMUCount() > 1), inf.getMount());
if (inf.getSquadSize() > max) {
buff.append("Maximum squad size is " + max + "\n\n");
correct = false;
}
max = maxUnitSize(inf.getMovementMode(), inf.hasMicrolite() || (inf.getAllUMUCount() > 1),
- inf.hasSpecialization(Infantry.COMBAT_ENGINEERS | Infantry.MOUNTAIN_TROOPS));
+ inf.hasSpecialization(Infantry.COMBAT_ENGINEERS | Infantry.MOUNTAIN_TROOPS), inf.getMount());
if (inf.getShootingStrength() > max) {
buff.append("Maximum platoon size is " + max + "\n\n");
correct = false;
@@ -169,12 +175,17 @@ public boolean correctEntity(StringBuffer buff, int ammoTechLvl) {
}
public static int maxSecondaryWeapons(Infantry inf) {
- int max = 2;
- if (inf.getMovementMode() == EntityMovementMode.VTOL) {
+ int max;
+ if (inf.getMount() != null) {
+ max = inf.getMount().getSize().supportWeaponsPerCreature;
+ } else if (inf.getMovementMode() == EntityMovementMode.VTOL) {
max = inf.hasMicrolite() ? 0 : 1;
} else if (inf.getMovementMode() == EntityMovementMode.INF_UMU) {
max = inf.getAllUMUCount();
+ } else {
+ max = 2;
}
+
if (inf.hasSpecialization(Infantry.COMBAT_ENGINEERS)) {
max = 0;
}
@@ -197,52 +208,64 @@ public static int maxSecondaryWeapons(Infantry inf) {
*
* @param movementMode The platoon's movement mode
* @param alt True indicates that VTOL is microlite and INF_UMU is motorized.
+ * @param mount The mount if the unit is beast-mounted, otherwise null.
* @return The maximum size of a squad.
*/
- public static int maxSquadSize(EntityMovementMode movementMode, boolean alt) {
- switch (movementMode) {
- case HOVER:
- case SUBMARINE:
- return 5;
- case WHEELED:
- return 6;
- case TRACKED:
- return 7;
- case INF_UMU:
- return alt? 6 : 10;
- case VTOL:
- return alt? 2 : 4;
- default:
- return 10;
+ public static int maxSquadSize(EntityMovementMode movementMode, boolean alt, @Nullable InfantryMount mount) {
+ if (mount == null) {
+ switch (movementMode) {
+ case HOVER:
+ case SUBMARINE:
+ return 5;
+ case WHEELED:
+ return 6;
+ case TRACKED:
+ return 7;
+ case INF_UMU:
+ return alt ? 6 : 10;
+ case VTOL:
+ return alt ? 2 : 4;
+ default:
+ return 10;
+ }
+ } else if (mount.getSize().troopsPerCreature == 1) {
+ return 10; // use foot infantry limit
+ } else {
+ return mount.getSize().troopsPerCreature;
}
}
- public static int maxUnitSize(EntityMovementMode movementMode, boolean alt, boolean engOrMountain) {
+ public static int maxUnitSize(EntityMovementMode movementMode, boolean alt, boolean engOrMountain,
+ InfantryMount mount) {
int max;
- switch (movementMode) {
- case INF_UMU:
- if (alt) {
- max = 12;
- } else {
+ if (mount == null) {
+ switch (movementMode) {
+ case INF_UMU:
+ if (alt) {
+ max = 12;
+ } else {
+ max = 30;
+ }
+ break;
+ case HOVER:
+ case SUBMARINE:
+ max = 20;
+ break;
+ case WHEELED:
+ max = 24;
+ break;
+ case TRACKED:
+ max = 28;
+ break;
+ case VTOL:
+ max = maxSquadSize(movementMode, alt, mount) * 4;
+ break;
+ default:
max = 30;
- }
- break;
- case HOVER:
- case SUBMARINE:
- max = 20;
- break;
- case WHEELED:
- max = 24;
- break;
- case TRACKED:
- max = 28;
- break;
- case VTOL:
- max = maxSquadSize(movementMode, alt) * 4;
- break;
- default:
- max = 30;
- break;
+ break;
+ }
+ } else {
+ max = mount.getSize().creaturesPerPlatoon * mount.getSize().troopsPerCreature;
}
if (engOrMountain) {
max = Math.min(max, 20);
diff --git a/megamek/src/megamek/common/weapons/infantry/InfantryWeaponHandler.java b/megamek/src/megamek/common/weapons/infantry/InfantryWeaponHandler.java
index 440251184b2..d12327c0ece 100644
--- a/megamek/src/megamek/common/weapons/infantry/InfantryWeaponHandler.java
+++ b/megamek/src/megamek/common/weapons/infantry/InfantryWeaponHandler.java
@@ -91,9 +91,16 @@ protected int calcHits(Vector vPhaseReport) {
double damage = calculateBaseDamage(ae, weapon, wtype);
if ((ae instanceof Infantry)
- && nRange == 0
- && ae.hasAbility(OptionsConstants.MD_TSM_IMPLANT)) {
- damage += 0.14;
+ && (nRange == 0)) {
+ if (ae.hasAbility(OptionsConstants.MD_TSM_IMPLANT)) {
+ damage += 0.14;
+ }
+ InfantryMount mount = ((Infantry) ae).getMount();
+ if ((mount != null) && target.isConventionalInfantry() && (mount.getBurstDamageDice() > 0)) {
+ damage += Compute.d6(mount.getBurstDamageDice());
+ } else if ((mount != null) && !target.isConventionalInfantry()) {
+ damage += mount.getVehicleDamage();
+ }
}
int damageDealt = (int) Math.round(damage * troopersHit);
diff --git a/megamek/src/megamek/server/GameManager.java b/megamek/src/megamek/server/GameManager.java
index 38f01ab3032..38f97537c0f 100644
--- a/megamek/src/megamek/server/GameManager.java
+++ b/megamek/src/megamek/server/GameManager.java
@@ -8419,6 +8419,19 @@ else if ((step.getElevation() + entity.height()) == 0) {
entity.delta_distance = distance;
entity.moved = moveType;
entity.mpUsed = mpUsed;
+ if (md.isAllUnderwater(game)) {
+ entity.underwaterRounds++;
+ if ((entity instanceof Infantry) && (((Infantry) entity).getMount() != null)
+ && entity.getMovementMode().isSubmarine()
+ && entity.underwaterRounds > ((Infantry) entity).getMount().getUWEndurance()) {
+ r = new Report(2412);
+ r.addDesc(entity);
+ addReport(r);
+ destroyEntity(entity, "mount drowned");
+ }
+ } else {
+ entity.underwaterRounds = 0;
+ }
entity.setClimbMode(curClimbMode);
if (!sideslipped && !fellDuringMovement && !crashedDuringMovement
&& (entity.getMovementMode() == EntityMovementMode.VTOL)) {
@@ -11631,9 +11644,16 @@ public Vector doSetLocationsExposure(Entity entity, Hex hex,
vPhaseReport.addAll(breachCheck(entity, Mech.LOC_CLEG, hex));
}
} else {
+ int status = ILocationExposureStatus.WET;
+ if (entity.relHeight() >= 0) {
+ status = game.getPlanetaryConditions().isVacuum() ?
+ ILocationExposureStatus.VACUUM : ILocationExposureStatus.NORMAL;
+ }
for (int loop = 0; loop < entity.locations(); loop++) {
- entity.setLocationStatus(loop, ILocationExposureStatus.WET);
- vPhaseReport.addAll(breachCheck(entity, loop, hex));
+ entity.setLocationStatus(loop, status);
+ if (status == ILocationExposureStatus.WET) {
+ vPhaseReport.addAll(breachCheck(entity, loop, hex));
+ }
}
}
} else {
@@ -30777,13 +30797,20 @@ private void passBuildingWall(Entity entity, Building bldg, Coords lastPos, Coor
}
}
- // Infantry and BA are damaged by buildings but do not damage them
+ // Damage the building. The CF can never drop below 0.
+ int toBldg;
+ // Infantry and BA are damaged by buildings but do not damage them, except large beast-mounted infantry
if (entity instanceof Infantry) {
- return;
+ InfantryMount mount = ((Infantry) entity).getMount();
+ if ((mount != null) && (mount.getSize().buildingDamage() > 0)) {
+ toBldg = mount.getSize().buildingDamage();
+ } else {
+ return;
+ }
+ } else {
+ toBldg = (int) Math.floor(bldg.getDamageToScale()
+ * Math.ceil(entity.getWeight() / 10.0));
}
- // Damage the building. The CF can never drop below 0.
- int toBldg = (int) Math.floor(bldg.getDamageToScale()
- * Math.ceil(entity.getWeight() / 10.0));
int curCF = bldg.getCurrentCF(entering ? curPos : lastPos);
curCF -= Math.min(curCF, toBldg);
bldg.setCurrentCF(curCF, entering ? curPos : lastPos);