v0.8.1: Design improvements to DM-300:

- The fight now starts when a player approaches a pylon, not when they leave the entrance
- Increased the speed/intensity of the environment spark particle effects
- Made several changes to DM-300's dialogue, and swapped the current hint for a new one
The goal of these changes is to make the goals of the fight more intuitive
This commit is contained in:
Evan Debenham 2020-05-09 19:31:00 -04:00
parent b369cf28ea
commit 740e4f64ae
3 changed files with 46 additions and 23 deletions

View File

@ -511,11 +511,11 @@ actors.mobs.newdm300.notice=UNAUTHORIZED PERSONNEL DETECTED!
actors.mobs.newdm300.shield=DM-300 pulls power from the exposed wires and shields itself!
actors.mobs.newdm300.vent=DM-300 fires a jet of toxic exhaust!
actors.mobs.newdm300.rocks=DM-300 slams the ground, loosening rocks from the ceiling!
actors.mobs.newdm300.charging=SUSTAINING DAMAGE! CHARGING FROM POWER PYLON...
actors.mobs.newdm300.charging_hint=Sparks erupt all around you! They seem to be gravitating somewhere...
actors.mobs.newdm300.supercharged=SUPERCHARGE COMPLETE, OPERATING AT 200% POWER!
actors.mobs.newdm300.charge_lost=POWER GRID DAMAGED, REVERTING TO LOCAL POWER!
actors.mobs.newdm300.pylons_destroyed=ALERT, INSTABILITY DETECTED IN POWER GRID!
actors.mobs.newdm300.charging=SUSTAINING DAMAGE! ACTIVATING POWER PYLON!
actors.mobs.newdm300.charging_hint=DM-300 is invulnerable while it is being energized by a pylon!
actors.mobs.newdm300.supercharged=DESTROY! DESTROY! DESTROY!
actors.mobs.newdm300.charge_lost=PYLON DESTROYED! REVERTING TO LOCAL POWER!
actors.mobs.newdm300.pylons_destroyed=ALERT! INSTABILITY DETECTED IN POWER GRID!
actors.mobs.newdm300.rankings_desc=Crushed by the DM-300
actors.mobs.newdm300.def_verb=blocked
actors.mobs.newdm300.defeated=CRITICAL DAMAGE! ATTEMPTING SHUTDO-

View File

@ -422,6 +422,8 @@ public class NewDM300 extends Mob {
}
private boolean invulnWarned = false;
@Override
public void damage(int dmg, Object src) {
super.damage(dmg, src);
@ -443,6 +445,10 @@ public class NewDM300 extends Mob {
@Override
public boolean isInvulnerable(Class effect) {
if (supercharged && !invulnWarned){
invulnWarned = true;
GLog.w(Messages.get(this, "charging_hint"));
}
return supercharged;
}
@ -457,7 +463,6 @@ public class NewDM300 extends Mob {
((DM300Sprite)sprite).charge();
chargeAnnounced = false;
GLog.h(Messages.get(this, "charging_hint"));
}
public boolean isSupercharged(){

View File

@ -159,10 +159,30 @@ public class NewCavesBossLevel extends Level {
customArenaVisuals = (ArenaVisuals) c;
}
}
//pre-0.8.1 saves that may not have had pylons added
int gatePos = pointToCell(new Point(gate.left, gate.top));
if (!locked && solid[gatePos]){
for (int i : pylonPositions) {
if (findMob(i) == null) {
Pylon pylon = new Pylon();
pylon.pos = i;
mobs.add(pylon);
}
}
}
}
@Override
protected void createMobs() { }
protected void createMobs() {
for (int i : pylonPositions) {
Pylon pylon = new Pylon();
pylon.pos = i;
mobs.add(pylon);
}
}
@Override
public Actor respawner() {
@ -211,13 +231,15 @@ public class NewCavesBossLevel extends Level {
public void occupyCell(Char ch) {
super.occupyCell(ch);
//seal the level when the hero moves off the entrance, the level isn't already sealed, and the gate hasn't been destroyed
//seal the level when the hero moves near to a pylon, the level isn't already sealed, and the gate hasn't been destroyed
int gatePos = pointToCell(new Point(gate.left, gate.top));
if (ch == Dungeon.hero && (Dungeon.level.distance(ch.pos, entrance) > 1)
&& !locked && solid[gatePos]){
seal();
if (ch == Dungeon.hero && !locked && solid[gatePos]){
for (int pos : pylonPositions){
if (Dungeon.level.distance(ch.pos, pos) <= 3){
seal();
break;
}
}
}
}
@ -240,12 +262,6 @@ public class NewCavesBossLevel extends Level {
} while (!openSpace[boss.pos] || map[boss.pos] == Terrain.EMPTY_SP);
GameScene.add( boss );
for (int i : pylonPositions) {
Pylon pylon = new Pylon();
pylon.pos = i;
GameScene.add(pylon);
}
}
@Override
@ -780,8 +796,11 @@ public class NewCavesBossLevel extends Level {
s.resetStatic(x, y);
s.speed.set((energySourceSprite.x + energySourceSprite.width/2f) - x,
(energySourceSprite.y + energySourceSprite.height/2f) - y);
s.speed.normalize().scale(DungeonTilemap.SIZE);
s.acc.set(s.speed);
s.speed.normalize().scale(DungeonTilemap.SIZE*2f);
//offset the particles slightly so they don't go too far outside of the cell
s.x -= s.speed.x/8f;
s.y -= s.speed.y/8f;
}
@Override
@ -799,8 +818,7 @@ public class NewCavesBossLevel extends Level {
public void use( BlobEmitter emitter ) {
super.use( emitter );
energySourceSprite = null;
//emitter.bound.set( 4/16f, 4/16f, 12/16f, 12/16f);
emitter.pour(DIRECTED_SPARKS, 0.2f);
emitter.pour(DIRECTED_SPARKS, 0.125f);
}
}