diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Bestiary.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Bestiary.java
index fafa50660..fe4ee5835 100644
--- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Bestiary.java
+++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Bestiary.java
@@ -222,6 +222,8 @@ public class Bestiary {
cl = Bandit.class;
} else if (cl == Brute.class) {
cl = ArmoredBrute.class;
+ } else if (cl == DM200.class) {
+ cl = DM201.class;
} else if (cl == Monk.class) {
cl = Senior.class;
} else if (cl == Scorpio.class) {
diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/DM201.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/DM201.java
new file mode 100644
index 000000000..d12eb5296
--- /dev/null
+++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/DM201.java
@@ -0,0 +1,122 @@
+/*
+ * Pixel Dungeon
+ * Copyright (C) 2012-2015 Oleg Dolya
+ *
+ * Shattered Pixel Dungeon
+ * Copyright (C) 2014-2020 Evan Debenham
+ *
+ * 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 3 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.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see
+ */
+
+package com.shatteredpixel.shatteredpixeldungeon.actors.mobs;
+
+import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
+import com.shatteredpixel.shatteredpixeldungeon.actors.Char;
+import com.shatteredpixel.shatteredpixeldungeon.actors.blobs.Blob;
+import com.shatteredpixel.shatteredpixeldungeon.actors.blobs.CorrosiveGas;
+import com.shatteredpixel.shatteredpixeldungeon.items.quest.MetalShard;
+import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
+import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene;
+import com.shatteredpixel.shatteredpixeldungeon.sprites.DM201Sprite;
+import com.shatteredpixel.shatteredpixeldungeon.utils.GLog;
+import com.watabou.utils.PathFinder;
+import com.watabou.utils.Random;
+
+public class DM201 extends DM200 {
+
+ {
+ spriteClass = DM201Sprite.class;
+
+ HP = HT = 120;
+
+ properties.add(Property.IMMOVABLE);
+
+ HUNTING = new Mob.Hunting();
+ }
+
+ @Override
+ public int damageRoll() {
+ return Random.NormalIntRange( 15, 25 );
+ }
+
+ private boolean threatened = false;
+
+ @Override
+ protected boolean act() {
+ GameScene.add(Blob.seed(pos, 0, CorrosiveGas.class));
+ if (state == HUNTING && enemy != null && enemySeen
+ && threatened && !Dungeon.level.adjacent(pos, enemy.pos)){
+ if (sprite != null && (sprite.visible || enemy.sprite.visible)) {
+ sprite.zap( enemy.pos );
+ return false;
+ } else {
+ zap();
+ return true;
+ }
+ }
+ return super.act();
+ }
+
+ @Override
+ public void damage(int dmg, Object src) {
+ if ((src instanceof Char && !Dungeon.level.adjacent(pos, ((Char)src).pos))
+ || enemy == null || !Dungeon.level.adjacent(pos, enemy.pos)){
+ threatened = true;
+ }
+ super.damage(dmg, src);
+ }
+
+ public void onZapComplete(){
+ zap();
+ next();
+ }
+
+ private void zap( ){
+ threatened = false;
+ spend(TICK);
+
+ GLog.w(Messages.get(this, "vent"));
+ GameScene.add(Blob.seed(enemy.pos, 15, CorrosiveGas.class).setStrength(8));
+ for (int i : PathFinder.NEIGHBOURS8){
+ if (!Dungeon.level.solid[enemy.pos+i]) {
+ GameScene.add(Blob.seed(enemy.pos + i, 5, CorrosiveGas.class).setStrength(8));
+ }
+ }
+
+ }
+
+ @Override
+ protected boolean getCloser(int target) {
+ return true;
+ }
+
+ @Override
+ protected boolean getFurther(int target) {
+ return true;
+ }
+
+ @Override
+ public void rollToDropLoot() {
+ if (Dungeon.hero.lvl > maxLvl + 2) return;
+
+ super.rollToDropLoot();
+
+ int ofs;
+ do {
+ ofs = PathFinder.NEIGHBOURS8[Random.Int(8)];
+ } while (!Dungeon.level.passable[pos + ofs]);
+ Dungeon.level.drop( new MetalShard(), pos + ofs ).sprite.drop( pos );
+ }
+
+}
diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/sprites/DM201Sprite.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/sprites/DM201Sprite.java
new file mode 100644
index 000000000..1178f3e18
--- /dev/null
+++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/sprites/DM201Sprite.java
@@ -0,0 +1,82 @@
+/*
+ * Pixel Dungeon
+ * Copyright (C) 2012-2015 Oleg Dolya
+ *
+ * Shattered Pixel Dungeon
+ * Copyright (C) 2014-2020 Evan Debenham
+ *
+ * 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 3 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.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see
+ */
+
+package com.shatteredpixel.shatteredpixeldungeon.sprites;
+
+import com.shatteredpixel.shatteredpixeldungeon.Assets;
+import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.DM201;
+import com.shatteredpixel.shatteredpixeldungeon.effects.MagicMissile;
+import com.watabou.noosa.TextureFilm;
+import com.watabou.noosa.audio.Sample;
+import com.watabou.utils.Callback;
+
+//TODO currently just DM-200s with treads chopped off
+public class DM201Sprite extends MobSprite {
+
+ public DM201Sprite () {
+ super();
+
+ texture( Assets.DM300 );
+
+ TextureFilm frames = new TextureFilm( texture, 22, 16 );
+
+ idle = new Animation( 2, true );
+ idle.frames( frames, 0, 1 );
+
+ run = idle.clone();
+
+ attack = new Animation( 15, false );
+ attack.frames( frames, 4, 5, 6, 0 );
+
+ zap = attack.clone();
+
+ die = new Animation( 20, false );
+ die.frames( frames, 0, 7, 0, 7, 0, 7, 0, 7, 0, 7, 0, 7, 8 );
+
+ play( idle );
+ scale.set( 0.8f );
+ }
+
+ @Override
+ public void resetColor() {
+ super.resetColor();
+ }
+
+ public void zap( int cell ) {
+
+ turnTo( ch.pos , cell );
+ play( zap );
+
+ MagicMissile.boltFromChar( parent,
+ MagicMissile.CORROSION,
+ this,
+ cell,
+ new Callback() {
+ @Override
+ public void call() {
+ Sample.INSTANCE.play( Assets.SND_PUFF );
+ ((DM201)ch).onZapComplete();
+ }
+ } );
+ Sample.INSTANCE.play( Assets.SND_MISS, 0.6f, 0.6f, 1.5f );
+ }
+
+}
diff --git a/core/src/main/resources/com/shatteredpixel/shatteredpixeldungeon/messages/actors/actors.properties b/core/src/main/resources/com/shatteredpixel/shatteredpixeldungeon/messages/actors/actors.properties
index 84d8b8b9e..7f2f83fed 100644
--- a/core/src/main/resources/com/shatteredpixel/shatteredpixeldungeon/messages/actors/actors.properties
+++ b/core/src/main/resources/com/shatteredpixel/shatteredpixeldungeon/messages/actors/actors.properties
@@ -493,6 +493,10 @@ actors.mobs.dm200.name=DM-200
actors.mobs.dm200.vent=The DM-200 fires a jet of toxic exhaust!
actors.mobs.dm200.desc=The DM-200 is the second generation of dwarven 'defense machine', which was designed to protect dwarven miners in the caves and city below. They are much larger and bulkier than their predecessors, and attack with devastating hydraulic fists.\n\nTheir increased size is also their primary weakness, as they are unable to fit into the narrow tunnels and doorways of the dungeon. The dwarves were able to compensate for the DM-200's lack of mobility by allowing them to vent their toxic exhaust fumes at distant enemies, or enemies they cannot reach.
+actors.mobs.dm201.name=DM-201
+actors.mobs.dm201.vent=The DM-201 lobs a caustic grenade!
+actors.mobs.dm201.desc=The dwarves briefly experimented with doubling-down on the DM-200's lack of mobility and created some DM models that are entirely stationary. The DM-201 is a retrofitted DM-200 which acts as a sentry turret, with no movement ability. In exchange for the lack of mobility, DM-201s have have significantly more durability and attacking power.\n\nAs DM-201s have no engine to vent exhaust from, the dwarves instead outfitted them with caustic gas grenades! DM-201s are careful with these grenades however, and will only lob them when attacked from a distance.
+
actors.mobs.olddm300.name=DM-300
actors.mobs.olddm300.notice=Unauthorised personnel detected.
actors.mobs.olddm300.defeated=Mission failed. Shutting down.