v0.9.4: added gateway traps!
This commit is contained in:
parent
21de6d3886
commit
397096ebd4
|
@ -65,6 +65,9 @@ levels.traps.flocktrap.desc=Perhaps a joke from some amateur mage, triggering th
|
||||||
levels.traps.frosttrap.name=frost trap
|
levels.traps.frosttrap.name=frost trap
|
||||||
levels.traps.frosttrap.desc=When activated, chemicals in this trap will rapidly freeze the air in a wide range around its location.
|
levels.traps.frosttrap.desc=When activated, chemicals in this trap will rapidly freeze the air in a wide range around its location.
|
||||||
|
|
||||||
|
levels.traps.gatewaytrap.name=grim trap
|
||||||
|
levels.traps.gatewaytrap.desc=This special teleportation trap can activate an infinite numbers of times and always teleports to the same location.
|
||||||
|
|
||||||
levels.traps.grimtrap.name=grim trap
|
levels.traps.grimtrap.name=grim trap
|
||||||
levels.traps.grimtrap.ondeath=You were killed by the blast of a grim trap...
|
levels.traps.grimtrap.ondeath=You were killed by the blast of a grim trap...
|
||||||
levels.traps.grimtrap.desc=Extremely powerful destructive magic is stored within this trap, enough to instantly kill all but the healthiest of heroes. Triggering it will send a ranged blast of lethal magic towards the nearest character.\n\nThankfully the trigger mechanism isn't hidden.
|
levels.traps.grimtrap.desc=Extremely powerful destructive magic is stored within this trap, enough to instantly kill all but the healthiest of heroes. Triggering it will send a ranged blast of lethal magic towards the nearest character.\n\nThankfully the trigger mechanism isn't hidden.
|
||||||
|
|
|
@ -0,0 +1,148 @@
|
||||||
|
package com.shatteredpixel.shatteredpixeldungeon.levels.traps;
|
||||||
|
|
||||||
|
import com.shatteredpixel.shatteredpixeldungeon.Assets;
|
||||||
|
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
|
||||||
|
import com.shatteredpixel.shatteredpixeldungeon.actors.Actor;
|
||||||
|
import com.shatteredpixel.shatteredpixeldungeon.actors.Char;
|
||||||
|
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Mob;
|
||||||
|
import com.shatteredpixel.shatteredpixeldungeon.items.Heap;
|
||||||
|
import com.shatteredpixel.shatteredpixeldungeon.items.Item;
|
||||||
|
import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfTeleportation;
|
||||||
|
import com.shatteredpixel.shatteredpixeldungeon.levels.Level;
|
||||||
|
import com.shatteredpixel.shatteredpixeldungeon.levels.Terrain;
|
||||||
|
import com.watabou.noosa.audio.Sample;
|
||||||
|
import com.watabou.utils.Bundle;
|
||||||
|
import com.watabou.utils.PathFinder;
|
||||||
|
import com.watabou.utils.Random;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
|
||||||
|
public class GatewayTrap extends Trap {
|
||||||
|
|
||||||
|
{
|
||||||
|
color = TEAL;
|
||||||
|
shape = CROSSHAIR;
|
||||||
|
}
|
||||||
|
|
||||||
|
private int telePos = -1;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void trigger() {
|
||||||
|
if (Dungeon.level.heroFOV[pos]){
|
||||||
|
Sample.INSTANCE.play(Assets.Sounds.TRAP);
|
||||||
|
}
|
||||||
|
//this trap is not disarmed by being triggered
|
||||||
|
reveal();
|
||||||
|
Level.set(pos, Terrain.TRAP);
|
||||||
|
activate();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void activate() {
|
||||||
|
|
||||||
|
if (telePos == -1){
|
||||||
|
for (int i : PathFinder.NEIGHBOURS9){
|
||||||
|
Char ch = Actor.findChar(pos + i);
|
||||||
|
if (ch != null){
|
||||||
|
if (ScrollOfTeleportation.teleportChar(ch)) {
|
||||||
|
if (ch instanceof Mob && ((Mob) ch).state == ((Mob) ch).HUNTING) {
|
||||||
|
((Mob) ch).state = ((Mob) ch).WANDERING;
|
||||||
|
}
|
||||||
|
telePos = ch.pos;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Heap heap = Dungeon.level.heaps.get(pos + i);
|
||||||
|
if (heap != null){
|
||||||
|
int cell = Dungeon.level.randomRespawnCell( null );
|
||||||
|
|
||||||
|
Item item = heap.pickUp();
|
||||||
|
|
||||||
|
if (cell != -1) {
|
||||||
|
Heap dropped = Dungeon.level.drop( item, cell );
|
||||||
|
dropped.type = heap.type;
|
||||||
|
dropped.sprite.view( dropped );
|
||||||
|
telePos = cell;
|
||||||
|
break;
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (telePos != -1){
|
||||||
|
|
||||||
|
ArrayList<Integer> telePositions = new ArrayList<>();
|
||||||
|
for (int i : PathFinder.NEIGHBOURS8){
|
||||||
|
if (Dungeon.level.passable[telePos+i]
|
||||||
|
&& Actor.findChar( telePos+i ) == null){
|
||||||
|
telePositions.add(telePos+i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Random.shuffle(telePositions);
|
||||||
|
|
||||||
|
if (Dungeon.level.passable[telePos]
|
||||||
|
&& Actor.findChar( telePos ) == null){
|
||||||
|
telePositions.add(0, telePos);
|
||||||
|
}
|
||||||
|
|
||||||
|
ArrayList<Integer> largeCharPositions = new ArrayList<>();
|
||||||
|
for (int pos : telePositions){
|
||||||
|
if (Dungeon.level.openSpace[pos]){
|
||||||
|
largeCharPositions.add(pos);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int i : PathFinder.NEIGHBOURS9){
|
||||||
|
|
||||||
|
Char ch = Actor.findChar(pos + i);
|
||||||
|
if (ch != null){
|
||||||
|
int newPos = -1;
|
||||||
|
if (Char.hasProp(ch, Char.Property.LARGE)){
|
||||||
|
if (!largeCharPositions.isEmpty()){
|
||||||
|
newPos = largeCharPositions.get(0);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (!telePositions.isEmpty()) {
|
||||||
|
newPos = telePositions.get(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (newPos != -1){
|
||||||
|
telePositions.remove((Integer)newPos);
|
||||||
|
largeCharPositions.remove((Integer)newPos);
|
||||||
|
|
||||||
|
if (ScrollOfTeleportation.teleportToLocation(ch, newPos)){
|
||||||
|
if (ch instanceof Mob && ((Mob) ch).state == ((Mob) ch).HUNTING) {
|
||||||
|
((Mob) ch).state = ((Mob) ch).WANDERING;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Heap heap = Dungeon.level.heaps.get(pos + i);
|
||||||
|
if (heap != null){
|
||||||
|
Item item = heap.pickUp();
|
||||||
|
Heap dropped = Dungeon.level.drop( item, telePos );
|
||||||
|
dropped.type = heap.type;
|
||||||
|
dropped.sprite.view( dropped );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private static final String TELE_POS = "tele_pos";
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void storeInBundle(Bundle bundle) {
|
||||||
|
super.storeInBundle(bundle);
|
||||||
|
bundle.put(TELE_POS, telePos);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void restoreFromBundle(Bundle bundle) {
|
||||||
|
super.restoreFromBundle(bundle);
|
||||||
|
telePos = bundle.getInt(TELE_POS);
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user