v0.4.2: added support for variable map sizes
This commit is contained in:
@@ -129,7 +129,7 @@ public class Dungeon {
|
||||
public static HashSet<Integer> chapters;
|
||||
|
||||
// Hero's field of view
|
||||
public static boolean[] visible = new boolean[Level.LENGTH];
|
||||
public static boolean[] visible;
|
||||
|
||||
public static SparseArray<ArrayList<Item>> droppedItems;
|
||||
|
||||
@@ -143,8 +143,6 @@ public class Dungeon {
|
||||
Actor.clear();
|
||||
Actor.resetNextID();
|
||||
|
||||
PathFinder.setMapSize( Level.WIDTH, Level.HEIGHT );
|
||||
|
||||
Scroll.initLabels();
|
||||
Potion.initColors();
|
||||
Ring.initGems();
|
||||
@@ -203,8 +201,6 @@ public class Dungeon {
|
||||
}
|
||||
}
|
||||
|
||||
Arrays.fill( visible, false );
|
||||
|
||||
Level level;
|
||||
switch (depth) {
|
||||
case 1:
|
||||
@@ -261,7 +257,8 @@ public class Dungeon {
|
||||
level = new DeadEndLevel();
|
||||
Statistics.deepestFloor--;
|
||||
}
|
||||
|
||||
|
||||
visible = new boolean[level.length()];
|
||||
level.create();
|
||||
|
||||
Statistics.qualifiedForNoKilling = !bossLevel();
|
||||
@@ -273,8 +270,6 @@ public class Dungeon {
|
||||
|
||||
Actor.clear();
|
||||
|
||||
Arrays.fill( visible, false );
|
||||
|
||||
level.reset();
|
||||
switchLevel( level, level.entrance );
|
||||
}
|
||||
@@ -296,6 +291,9 @@ public class Dungeon {
|
||||
|
||||
Dungeon.level = level;
|
||||
Actor.init();
|
||||
|
||||
PathFinder.setMapSize(level.width(), level.height());
|
||||
visible = new boolean[level.length()];
|
||||
|
||||
Actor respawner = level.respawner();
|
||||
if (respawner != null) {
|
||||
@@ -531,10 +529,6 @@ public class Dungeon {
|
||||
Dungeon.level = null;
|
||||
Dungeon.depth = -1;
|
||||
|
||||
if (fullLoad) {
|
||||
PathFinder.setMapSize( Level.WIDTH, Level.HEIGHT );
|
||||
}
|
||||
|
||||
Scroll.restore( bundle );
|
||||
Potion.restore( bundle );
|
||||
Ring.restore( bundle );
|
||||
@@ -677,18 +671,17 @@ public class Dungeon {
|
||||
GameScene.afterObserve();
|
||||
}
|
||||
|
||||
private static boolean[] passable = new boolean[Level.LENGTH];
|
||||
|
||||
public static int findPath( Char ch, int from, int to, boolean pass[], boolean[] visible ) {
|
||||
|
||||
if (Level.adjacent( from, to )) {
|
||||
if (level.adjacent( from, to )) {
|
||||
return Actor.findChar( to ) == null && (pass[to] || Level.avoid[to]) ? to : -1;
|
||||
}
|
||||
|
||||
|
||||
boolean[] passable = new boolean[Dungeon.level.length()];
|
||||
if (ch.flying || ch.buff( Amok.class ) != null) {
|
||||
BArray.or( pass, Level.avoid, passable );
|
||||
} else {
|
||||
System.arraycopy( pass, 0, passable, 0, Level.LENGTH );
|
||||
System.arraycopy( pass, 0, passable, 0, Dungeon.level.length() );
|
||||
}
|
||||
|
||||
for (Char c : Actor.chars()) {
|
||||
@@ -702,11 +695,12 @@ public class Dungeon {
|
||||
}
|
||||
|
||||
public static int flee( Char ch, int cur, int from, boolean pass[], boolean[] visible ) {
|
||||
|
||||
|
||||
boolean[] passable = new boolean[Dungeon.level.length()];
|
||||
if (ch.flying) {
|
||||
BArray.or( pass, Level.avoid, passable );
|
||||
} else {
|
||||
System.arraycopy( pass, 0, passable, 0, Level.LENGTH );
|
||||
System.arraycopy( pass, 0, passable, 0, Dungeon.level.length() );
|
||||
}
|
||||
|
||||
for (Char c : Actor.chars()) {
|
||||
|
||||
@@ -38,7 +38,7 @@ public class DungeonTilemap extends Tilemap {
|
||||
super(
|
||||
Dungeon.level.tilesTex(),
|
||||
new TextureFilm( Dungeon.level.tilesTex(), SIZE, SIZE ) );
|
||||
map( Dungeon.level.map, Level.WIDTH );
|
||||
map( Dungeon.level.map, Dungeon.level.width() );
|
||||
|
||||
instance = this;
|
||||
}
|
||||
@@ -48,7 +48,12 @@ public class DungeonTilemap extends Tilemap {
|
||||
offset( this.point().negate() ).
|
||||
invScale( SIZE ).
|
||||
floor();
|
||||
return p.x >= 0 && p.x < Level.WIDTH && p.y >= 0 && p.y < Level.HEIGHT ? p.x + p.y * Level.WIDTH : -1;
|
||||
return p.x >= 0
|
||||
&& p.x < Dungeon.level.width()
|
||||
&& p.y >= 0
|
||||
&& p.y < Dungeon.level.height() ?
|
||||
p.x + p.y * Dungeon.level.width()
|
||||
: -1;
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -75,13 +80,13 @@ public class DungeonTilemap extends Tilemap {
|
||||
}
|
||||
|
||||
public static PointF tileToWorld( int pos ) {
|
||||
return new PointF( pos % Level.WIDTH, pos / Level.WIDTH ).scale( SIZE );
|
||||
return new PointF( pos % Dungeon.level.width(), pos / Dungeon.level.width() ).scale( SIZE );
|
||||
}
|
||||
|
||||
public static PointF tileCenterToWorld( int pos ) {
|
||||
return new PointF(
|
||||
(pos % Level.WIDTH + 0.5f) * SIZE,
|
||||
(pos / Level.WIDTH + 0.5f) * SIZE );
|
||||
(pos % Dungeon.level.width() + 0.5f) * SIZE,
|
||||
(pos / Dungeon.level.width() + 0.5f) * SIZE );
|
||||
}
|
||||
|
||||
public static Image tile( int index ) {
|
||||
|
||||
@@ -49,6 +49,7 @@ import com.watabou.noosa.audio.Sample;
|
||||
import com.watabou.utils.Bundlable;
|
||||
import com.watabou.utils.Bundle;
|
||||
import com.watabou.utils.GameMath;
|
||||
import com.watabou.utils.PathFinder;
|
||||
import com.watabou.utils.Random;
|
||||
|
||||
import java.util.HashSet;
|
||||
@@ -399,9 +400,9 @@ public abstract class Char extends Actor {
|
||||
|
||||
public void move( int step ) {
|
||||
|
||||
if (Level.adjacent( step, pos ) && buff( Vertigo.class ) != null) {
|
||||
if (Dungeon.level.adjacent( step, pos ) && buff( Vertigo.class ) != null) {
|
||||
sprite.interruptMotion();
|
||||
int newPos = pos + Level.NEIGHBOURS8[Random.Int( 8 )];
|
||||
int newPos = pos + PathFinder.NEIGHBOURS8[Random.Int( 8 )];
|
||||
if (!(Level.passable[newPos] || Level.avoid[newPos]) || Actor.findChar( newPos ) != null)
|
||||
return;
|
||||
else {
|
||||
@@ -426,7 +427,7 @@ public abstract class Char extends Actor {
|
||||
}
|
||||
|
||||
public int distance( Char other ) {
|
||||
return Level.distance( pos, other.pos );
|
||||
return Dungeon.level.distance( pos, other.pos );
|
||||
}
|
||||
|
||||
public void onMotionComplete() {
|
||||
|
||||
+7
-3
@@ -26,6 +26,7 @@ import com.shatteredpixel.shatteredpixeldungeon.effects.BlobEmitter;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.effects.Speck;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.items.Heap;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.items.Item;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.levels.Level;
|
||||
import com.watabou.utils.Bundle;
|
||||
|
||||
public class Alchemy extends Blob {
|
||||
@@ -35,8 +36,8 @@ public class Alchemy extends Blob {
|
||||
@Override
|
||||
public void restoreFromBundle( Bundle bundle ) {
|
||||
super.restoreFromBundle( bundle );
|
||||
|
||||
for (int i=0; i < LENGTH; i++) {
|
||||
|
||||
for (int i=0; i < cur.length; i++) {
|
||||
if (cur[i] > 0) {
|
||||
pos = i;
|
||||
break;
|
||||
@@ -54,7 +55,10 @@ public class Alchemy extends Blob {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void seed( int cell, int amount ) {
|
||||
public void seed( Level level, int cell, int amount ) {
|
||||
if (cur == null) cur = new int[level.length()];
|
||||
if (off == null) off = new int[cur.length];
|
||||
|
||||
cur[pos] = 0;
|
||||
pos = cell;
|
||||
volume = cur[pos] = amount;
|
||||
|
||||
+27
-39
@@ -33,13 +33,9 @@ import java.util.Arrays;
|
||||
public class Blob extends Actor {
|
||||
|
||||
{
|
||||
actPriority = 1; //take prioerity over mobs, but not the hero
|
||||
actPriority = 1; //take priority over mobs, but not the hero
|
||||
}
|
||||
|
||||
public static final int WIDTH = Level.WIDTH;
|
||||
public static final int HEIGHT = Level.HEIGHT;
|
||||
public static final int LENGTH = Level.LENGTH;
|
||||
|
||||
public int volume = 0;
|
||||
|
||||
public int[] cur;
|
||||
@@ -47,16 +43,9 @@ public class Blob extends Actor {
|
||||
|
||||
public BlobEmitter emitter;
|
||||
|
||||
protected Blob() {
|
||||
|
||||
cur = new int[LENGTH];
|
||||
off = new int[LENGTH];
|
||||
|
||||
volume = 0;
|
||||
}
|
||||
|
||||
private static final String CUR = "cur";
|
||||
private static final String START = "start";
|
||||
private static final String LENGTH = "length";
|
||||
|
||||
@Override
|
||||
public void storeInBundle( Bundle bundle ) {
|
||||
@@ -65,19 +54,20 @@ public class Blob extends Actor {
|
||||
if (volume > 0) {
|
||||
|
||||
int start;
|
||||
for (start=0; start < LENGTH; start++) {
|
||||
for (start=0; start < Dungeon.level.length(); start++) {
|
||||
if (cur[start] > 0) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
int end;
|
||||
for (end=LENGTH-1; end > start; end--) {
|
||||
for (end=Dungeon.level.length()-1; end > start; end--) {
|
||||
if (cur[end] > 0) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
bundle.put( START, start );
|
||||
bundle.put( LENGTH, cur.length );
|
||||
bundle.put( CUR, trim( start, end + 1 ) );
|
||||
|
||||
}
|
||||
@@ -94,6 +84,13 @@ public class Blob extends Actor {
|
||||
public void restoreFromBundle( Bundle bundle ) {
|
||||
|
||||
super.restoreFromBundle( bundle );
|
||||
|
||||
if (bundle.contains(LENGTH)) {
|
||||
cur = new int[bundle.getInt(LENGTH)];
|
||||
} else {
|
||||
//compatability with pre-0.4.2
|
||||
cur = new int[1024];
|
||||
}
|
||||
|
||||
int[] data = bundle.getIntArray( CUR );
|
||||
if (data != null) {
|
||||
@@ -103,18 +100,6 @@ public class Blob extends Actor {
|
||||
volume += data[i];
|
||||
}
|
||||
}
|
||||
|
||||
if (Level.resizingNeeded) {
|
||||
int[] cur = new int[Level.LENGTH];
|
||||
Arrays.fill( cur, 0 );
|
||||
|
||||
int loadedMapSize = Level.loadedMapSize;
|
||||
for (int i=0; i < loadedMapSize; i++) {
|
||||
System.arraycopy( this.cur, i * loadedMapSize, cur, i * Level.WIDTH, loadedMapSize );
|
||||
}
|
||||
|
||||
this.cur = cur;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -144,10 +129,10 @@ public class Blob extends Actor {
|
||||
|
||||
boolean[] notBlocking = BArray.not( Level.solid, null );
|
||||
|
||||
for (int i=1; i < HEIGHT-1; i++) {
|
||||
for (int i=1; i < Dungeon.level.height()-1; i++) {
|
||||
|
||||
int from = i * WIDTH + 1;
|
||||
int to = from + WIDTH - 2;
|
||||
int from = i * Dungeon.level.width() + 1;
|
||||
int to = from + Dungeon.level.width() - 2;
|
||||
|
||||
for (int pos=from; pos < to; pos++) {
|
||||
if (notBlocking[pos]) {
|
||||
@@ -163,12 +148,12 @@ public class Blob extends Actor {
|
||||
sum += cur[pos+1];
|
||||
count++;
|
||||
}
|
||||
if (notBlocking[pos-WIDTH]) {
|
||||
sum += cur[pos-WIDTH];
|
||||
if (notBlocking[pos-Dungeon.level.width()]) {
|
||||
sum += cur[pos-Dungeon.level.width()];
|
||||
count++;
|
||||
}
|
||||
if (notBlocking[pos+WIDTH]) {
|
||||
sum += cur[pos+WIDTH];
|
||||
if (notBlocking[pos+Dungeon.level.width()]) {
|
||||
sum += cur[pos+Dungeon.level.width()];
|
||||
count++;
|
||||
}
|
||||
|
||||
@@ -182,8 +167,11 @@ public class Blob extends Actor {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void seed( int cell, int amount ) {
|
||||
|
||||
public void seed( Level level, int cell, int amount ) {
|
||||
if (cur == null) cur = new int[level.length()];
|
||||
if (off == null) off = new int[cur.length];
|
||||
|
||||
cur[cell] += amount;
|
||||
volume += amount;
|
||||
}
|
||||
@@ -195,8 +183,8 @@ public class Blob extends Actor {
|
||||
|
||||
public void fullyClear(){
|
||||
volume = 0;
|
||||
cur = new int[LENGTH];
|
||||
off = new int[LENGTH];
|
||||
cur = new int[Dungeon.level.length()];
|
||||
off = new int[Dungeon.level.length()];
|
||||
}
|
||||
|
||||
public String tileDesc() {
|
||||
@@ -213,7 +201,7 @@ public class Blob extends Actor {
|
||||
Dungeon.level.blobs.put( type, gas );
|
||||
}
|
||||
|
||||
gas.seed( cell, amount );
|
||||
gas.seed( Dungeon.level, cell, amount );
|
||||
|
||||
return gas;
|
||||
|
||||
|
||||
+2
-1
@@ -20,6 +20,7 @@
|
||||
*/
|
||||
package com.shatteredpixel.shatteredpixeldungeon.actors.blobs;
|
||||
|
||||
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.Actor;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.Char;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff;
|
||||
@@ -35,7 +36,7 @@ public class ConfusionGas extends Blob {
|
||||
super.evolve();
|
||||
|
||||
Char ch;
|
||||
for (int i=0; i < LENGTH; i++) {
|
||||
for (int i = 0; i < Dungeon.level.length(); i++) {
|
||||
if (cur[i] > 0 && (ch = Actor.findChar( i )) != null) {
|
||||
if (!ch.immunities().contains(this.getClass()))
|
||||
Buff.prolong( ch, Vertigo.class, 2 );
|
||||
|
||||
@@ -40,8 +40,8 @@ public class Fire extends Blob {
|
||||
|
||||
boolean[] flamable = Level.flamable;
|
||||
|
||||
int from = WIDTH + 1;
|
||||
int to = Level.LENGTH - WIDTH - 1;
|
||||
int from = Dungeon.level.width() + 1;
|
||||
int to = Dungeon.level.length() - Dungeon.level.width() - 1;
|
||||
|
||||
boolean observe = false;
|
||||
|
||||
@@ -68,7 +68,11 @@ public class Fire extends Blob {
|
||||
|
||||
} else {
|
||||
|
||||
if (flamable[pos] && (cur[pos-1] > 0 || cur[pos+1] > 0 || cur[pos-WIDTH] > 0 || cur[pos+WIDTH] > 0)) {
|
||||
if (flamable[pos]
|
||||
&& (cur[pos-1] > 0
|
||||
|| cur[pos+1] > 0
|
||||
|| cur[pos-Dungeon.level.width()] > 0
|
||||
|| cur[pos+Dungeon.level.width()] > 0)) {
|
||||
fire = 4;
|
||||
burn( pos );
|
||||
} else {
|
||||
@@ -103,7 +107,9 @@ public class Fire extends Blob {
|
||||
}
|
||||
}
|
||||
|
||||
public void seed( int cell, int amount ) {
|
||||
public void seed( Level level, int cell, int amount ) {
|
||||
if (cur == null) cur = new int[level.length()];
|
||||
if (off == null) off = new int[cur.length];
|
||||
if (cur[cell] == 0) {
|
||||
volume += amount;
|
||||
cur[cell] = amount;
|
||||
|
||||
+2
-2
@@ -37,8 +37,8 @@ public class Foliage extends Blob {
|
||||
@Override
|
||||
protected void evolve() {
|
||||
|
||||
int from = WIDTH + 1;
|
||||
int to = Level.LENGTH - WIDTH - 1;
|
||||
int from = Dungeon.level.width() + 1;
|
||||
int to = Dungeon.level.length() - Dungeon.level.width() - 1;
|
||||
|
||||
int[] map = Dungeon.level.map;
|
||||
boolean regrowth = false;
|
||||
|
||||
+6
-2
@@ -22,7 +22,9 @@ package com.shatteredpixel.shatteredpixeldungeon.actors.blobs;
|
||||
|
||||
|
||||
|
||||
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.effects.BlobEmitter;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.levels.Level;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.sprites.GooSprite;
|
||||
|
||||
@@ -39,7 +41,7 @@ public class GooWarn extends Blob {
|
||||
|
||||
@Override
|
||||
protected void evolve() {
|
||||
for (int i=0; i < LENGTH; i++) {
|
||||
for (int i = 0; i < Dungeon.level.length(); i++) {
|
||||
|
||||
int offv = cur[i] > 0 ? cur[i] - 1 : 0;
|
||||
off[i] = offv;
|
||||
@@ -52,7 +54,9 @@ public class GooWarn extends Blob {
|
||||
|
||||
}
|
||||
|
||||
public void seed( int cell, int amount ) {
|
||||
public void seed(Level level, int cell, int amount ) {
|
||||
if (cur == null) cur = new int[level.length()];
|
||||
if (off == null) off = new int[cur.length];
|
||||
int diff = amount - cur[cell];
|
||||
if (diff > 0) {
|
||||
cur[cell] = amount;
|
||||
|
||||
+2
-1
@@ -20,6 +20,7 @@
|
||||
*/
|
||||
package com.shatteredpixel.shatteredpixeldungeon.actors.blobs;
|
||||
|
||||
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.Actor;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.Char;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff;
|
||||
@@ -35,7 +36,7 @@ public class ParalyticGas extends Blob {
|
||||
super.evolve();
|
||||
|
||||
Char ch;
|
||||
for (int i=0; i < LENGTH; i++) {
|
||||
for (int i = 0; i < Dungeon.level.length(); i++) {
|
||||
if (cur[i] > 0 && (ch = Actor.findChar( i )) != null) {
|
||||
if (!ch.immunities().contains(this.getClass()))
|
||||
Buff.prolong( ch, Paralysis.class, Paralysis.duration( ch ) );
|
||||
|
||||
+1
-1
@@ -39,7 +39,7 @@ public class Regrowth extends Blob {
|
||||
|
||||
if (volume > 0) {
|
||||
|
||||
for (int i=0; i < LENGTH; i++) {
|
||||
for (int i=0; i < Dungeon.level.length(); i++) {
|
||||
if (off[i] > 0) {
|
||||
int c = Dungeon.level.map[i];
|
||||
int c1 = c;
|
||||
|
||||
+2
-1
@@ -20,6 +20,7 @@
|
||||
*/
|
||||
package com.shatteredpixel.shatteredpixeldungeon.actors.blobs;
|
||||
|
||||
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.Actor;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.Char;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff;
|
||||
@@ -35,7 +36,7 @@ public class StenchGas extends Blob {
|
||||
super.evolve();
|
||||
|
||||
Char ch;
|
||||
for (int i=0; i < LENGTH; i++) {
|
||||
for (int i = 0; i < Dungeon.level.length(); i++) {
|
||||
if (cur[i] > 0 && (ch = Actor.findChar(i)) != null) {
|
||||
if (!ch.immunities().contains(this.getClass()))
|
||||
Buff.prolong( ch, Paralysis.class, Paralysis.duration( ch )/5 );
|
||||
|
||||
+1
-1
@@ -40,7 +40,7 @@ public class ToxicGas extends Blob implements Hero.Doom {
|
||||
int levelDamage = 5 + Dungeon.depth * 5;
|
||||
|
||||
Char ch;
|
||||
for (int i=0; i < LENGTH; i++) {
|
||||
for (int i=0; i < Dungeon.level.length(); i++) {
|
||||
if (cur[i] > 0 && (ch = Actor.findChar( i )) != null) {
|
||||
|
||||
int damage = (ch.HT + levelDamage) / 40;
|
||||
|
||||
+2
-1
@@ -20,6 +20,7 @@
|
||||
*/
|
||||
package com.shatteredpixel.shatteredpixeldungeon.actors.blobs;
|
||||
|
||||
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.Actor;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.Char;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff;
|
||||
@@ -41,7 +42,7 @@ public class VenomGas extends Blob {
|
||||
strength = 0;
|
||||
} else {
|
||||
Char ch;
|
||||
for (int i = 0; i < LENGTH; i++) {
|
||||
for (int i = 0; i < Dungeon.level.length(); i++) {
|
||||
if (cur[i] > 0 && (ch = Actor.findChar(i)) != null) {
|
||||
if (!ch.immunities().contains(this.getClass()))
|
||||
Buff.affect(ch, Venom.class).set(2f, strength);
|
||||
|
||||
+1
-1
@@ -50,7 +50,7 @@ public class WaterOfAwareness extends WellWater {
|
||||
|
||||
hero.belongings.observe();
|
||||
|
||||
for (int i=0; i < Level.LENGTH; i++) {
|
||||
for (int i=0; i < Dungeon.level.length(); i++) {
|
||||
|
||||
int terr = Dungeon.level.map[i];
|
||||
if ((Terrain.flags[terr] & Terrain.SECRET) != 0) {
|
||||
|
||||
@@ -20,12 +20,14 @@
|
||||
*/
|
||||
package com.shatteredpixel.shatteredpixeldungeon.actors.blobs;
|
||||
|
||||
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.Actor;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.Char;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Roots;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.effects.BlobEmitter;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.effects.particles.WebParticle;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.levels.Level;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
|
||||
|
||||
public class Web extends Blob {
|
||||
@@ -33,7 +35,7 @@ public class Web extends Blob {
|
||||
@Override
|
||||
protected void evolve() {
|
||||
|
||||
for (int i=0; i < LENGTH; i++) {
|
||||
for (int i = 0; i < Dungeon.level.length(); i++) {
|
||||
|
||||
int offv = cur[i] > 0 ? cur[i] - 1 : 0;
|
||||
off[i] = offv;
|
||||
@@ -57,7 +59,9 @@ public class Web extends Blob {
|
||||
emitter.pour( WebParticle.FACTORY, 0.4f );
|
||||
}
|
||||
|
||||
public void seed( int cell, int amount ) {
|
||||
public void seed(Level level, int cell, int amount ) {
|
||||
if (cur == null) cur = new int[level.length()];
|
||||
if (off == null) off = new int[cur.length];
|
||||
int diff = amount - cur[cell];
|
||||
if (diff > 0) {
|
||||
cur[cell] = amount;
|
||||
|
||||
+7
-4
@@ -30,6 +30,7 @@ import com.shatteredpixel.shatteredpixeldungeon.levels.Level;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.levels.Terrain;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene;
|
||||
import com.watabou.utils.Bundle;
|
||||
import com.watabou.utils.PathFinder;
|
||||
import com.watabou.utils.Random;
|
||||
|
||||
public class WellWater extends Blob {
|
||||
@@ -39,8 +40,8 @@ public class WellWater extends Blob {
|
||||
@Override
|
||||
public void restoreFromBundle( Bundle bundle ) {
|
||||
super.restoreFromBundle( bundle );
|
||||
|
||||
for (int i=0; i < LENGTH; i++) {
|
||||
|
||||
for (int i=0; i < cur.length; i++) {
|
||||
if (cur[i] > 0) {
|
||||
pos = i;
|
||||
break;
|
||||
@@ -99,7 +100,7 @@ public class WellWater extends Blob {
|
||||
|
||||
int newPlace;
|
||||
do {
|
||||
newPlace = pos + Level.NEIGHBOURS8[Random.Int( 8 )];
|
||||
newPlace = pos + PathFinder.NEIGHBOURS8[Random.Int( 8 )];
|
||||
} while (!Level.passable[newPlace] && !Level.avoid[newPlace]);
|
||||
Dungeon.level.drop( heap.pickUp(), newPlace ).sprite.drop( pos );
|
||||
|
||||
@@ -123,7 +124,9 @@ public class WellWater extends Blob {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void seed( int cell, int amount ) {
|
||||
public void seed( Level level, int cell, int amount ) {
|
||||
if (cur == null) cur = new int[level.length()];
|
||||
if (off == null) off = new int[cur.length];
|
||||
cur[pos] = 0;
|
||||
pos = cell;
|
||||
volume = cur[pos] = amount;
|
||||
|
||||
@@ -43,6 +43,7 @@ import com.watabou.noosa.Image;
|
||||
import com.watabou.noosa.audio.Sample;
|
||||
import com.watabou.utils.Bundle;
|
||||
import com.watabou.utils.Callback;
|
||||
import com.watabou.utils.PathFinder;
|
||||
import com.watabou.utils.Random;
|
||||
|
||||
public class Combo extends Buff implements ActionIndicator.Action {
|
||||
@@ -231,8 +232,8 @@ public class Combo extends Buff implements ActionIndicator.Action {
|
||||
case CLOBBER:
|
||||
if (enemy.isAlive()){
|
||||
if (!enemy.properties().contains(Char.Property.IMMOVABLE)){
|
||||
for (int i=0; i < Level.NEIGHBOURS8.length; i++) {
|
||||
int ofs = Level.NEIGHBOURS8[i];
|
||||
for (int i = 0; i < PathFinder.NEIGHBOURS8.length; i++) {
|
||||
int ofs = PathFinder.NEIGHBOURS8[i];
|
||||
if (enemy.pos - target.pos == ofs) {
|
||||
int newPos = enemy.pos + ofs;
|
||||
if ((Level.passable[newPos] || Level.avoid[newPos]) && Actor.findChar( newPos ) == null) {
|
||||
|
||||
@@ -258,7 +258,7 @@ public class Hero extends Char {
|
||||
@Override
|
||||
public int attackSkill( Char target ) {
|
||||
float accuracy = 1;
|
||||
if (rangedWeapon != null && Level.distance( pos, target.pos ) == 1) {
|
||||
if (rangedWeapon != null && Dungeon.level.distance( pos, target.pos ) == 1) {
|
||||
accuracy *= 0.5f;
|
||||
}
|
||||
|
||||
@@ -391,12 +391,12 @@ public class Hero extends Char {
|
||||
return false;
|
||||
|
||||
//can always attack adjacent enemies
|
||||
if (Level.adjacent(pos, enemy.pos))
|
||||
if (Dungeon.level.adjacent(pos, enemy.pos))
|
||||
return true;
|
||||
|
||||
KindOfWeapon wep = Dungeon.hero.belongings.weapon;
|
||||
|
||||
if (wep != null && Level.distance( pos, enemy.pos ) <= wep.reachFactor(this)){
|
||||
if (wep != null && Dungeon.level.distance( pos, enemy.pos ) <= wep.reachFactor(this)){
|
||||
|
||||
boolean[] passable = BArray.not(Level.solid, null);
|
||||
for (Mob m : Dungeon.level.mobs)
|
||||
@@ -575,7 +575,7 @@ public class Hero extends Char {
|
||||
|
||||
NPC npc = action.npc;
|
||||
|
||||
if (Level.adjacent( pos, npc.pos )) {
|
||||
if (Dungeon.level.adjacent( pos, npc.pos )) {
|
||||
|
||||
ready();
|
||||
sprite.turnTo( pos, npc.pos );
|
||||
@@ -598,7 +598,7 @@ public class Hero extends Char {
|
||||
|
||||
private boolean actBuy( HeroAction.Buy action ) {
|
||||
int dst = action.dst;
|
||||
if (pos == dst || Level.adjacent( pos, dst )) {
|
||||
if (pos == dst || Dungeon.level.adjacent( pos, dst )) {
|
||||
|
||||
ready();
|
||||
|
||||
@@ -690,7 +690,7 @@ public class Hero extends Char {
|
||||
|
||||
private boolean actOpenChest( HeroAction.OpenChest action ) {
|
||||
int dst = action.dst;
|
||||
if (Level.adjacent( pos, dst ) || pos == dst) {
|
||||
if (Dungeon.level.adjacent( pos, dst ) || pos == dst) {
|
||||
|
||||
Heap heap = Dungeon.level.heaps.get( dst );
|
||||
if (heap != null && (heap.type != Type.HEAP && heap.type != Type.FOR_SALE)) {
|
||||
@@ -737,7 +737,7 @@ public class Hero extends Char {
|
||||
|
||||
private boolean actUnlock( HeroAction.Unlock action ) {
|
||||
int doorCell = action.dst;
|
||||
if (Level.adjacent( pos, doorCell )) {
|
||||
if (Dungeon.level.adjacent( pos, doorCell )) {
|
||||
|
||||
boolean hasKey = false;
|
||||
int door = Dungeon.level.map[doorCell];
|
||||
@@ -1015,7 +1015,7 @@ public class Hero extends Char {
|
||||
|
||||
int step = -1;
|
||||
|
||||
if (Level.adjacent( pos, target )) {
|
||||
if (Dungeon.level.adjacent( pos, target )) {
|
||||
|
||||
if (Actor.findChar( target ) == null) {
|
||||
if (Level.pit[target] && !flying && !Level.solid[target]) {
|
||||
@@ -1034,7 +1034,7 @@ public class Hero extends Char {
|
||||
|
||||
} else {
|
||||
|
||||
int len = Level.LENGTH;
|
||||
int len = Dungeon.level.length();
|
||||
boolean[] p = Level.passable;
|
||||
boolean[] v = Dungeon.level.visited;
|
||||
boolean[] m = Dungeon.level.mapped;
|
||||
@@ -1281,7 +1281,7 @@ public class Hero extends Char {
|
||||
|
||||
public static void reallyDie( Object cause ) {
|
||||
|
||||
int length = Level.LENGTH;
|
||||
int length = Dungeon.level.length();
|
||||
int[] map = Dungeon.level.map;
|
||||
boolean[] visited = Dungeon.level.visited;
|
||||
boolean[] discoverable = Level.discoverable;
|
||||
@@ -1308,7 +1308,7 @@ public class Hero extends Char {
|
||||
int pos = Dungeon.hero.pos;
|
||||
|
||||
ArrayList<Integer> passable = new ArrayList<Integer>();
|
||||
for (Integer ofs : Level.NEIGHBOURS8) {
|
||||
for (Integer ofs : PathFinder.NEIGHBOURS8) {
|
||||
int cell = pos + ofs;
|
||||
if ((Level.passable[cell] || Level.avoid[cell]) && Dungeon.level.heaps.get( cell ) == null) {
|
||||
passable.add( cell );
|
||||
@@ -1440,23 +1440,23 @@ public class Hero extends Char {
|
||||
distance = 1;
|
||||
}
|
||||
|
||||
int cx = pos % Level.WIDTH;
|
||||
int cy = pos / Level.WIDTH;
|
||||
int cx = pos % Dungeon.level.width();
|
||||
int cy = pos / Dungeon.level.width();
|
||||
int ax = cx - distance;
|
||||
if (ax < 0) {
|
||||
ax = 0;
|
||||
}
|
||||
int bx = cx + distance;
|
||||
if (bx >= Level.WIDTH) {
|
||||
bx = Level.WIDTH - 1;
|
||||
if (bx >= Dungeon.level.width()) {
|
||||
bx = Dungeon.level.width() - 1;
|
||||
}
|
||||
int ay = cy - distance;
|
||||
if (ay < 0) {
|
||||
ay = 0;
|
||||
}
|
||||
int by = cy + distance;
|
||||
if (by >= Level.HEIGHT) {
|
||||
by = Level.HEIGHT - 1;
|
||||
if (by >= Dungeon.level.height()) {
|
||||
by = Dungeon.level.height() - 1;
|
||||
}
|
||||
|
||||
TalismanOfForesight.Foresight foresight = buff( TalismanOfForesight.Foresight.class );
|
||||
@@ -1467,7 +1467,7 @@ public class Hero extends Char {
|
||||
}
|
||||
|
||||
for (int y = ay; y <= by; y++) {
|
||||
for (int x = ax, p = ax + y * Level.WIDTH; x <= bx; x++, p++) {
|
||||
for (int x = ax, p = ax + y * Dungeon.level.width(); x <= bx; x++, p++) {
|
||||
|
||||
if (Dungeon.visible[p]) {
|
||||
|
||||
|
||||
@@ -121,18 +121,18 @@ public class Bee extends Mob {
|
||||
//if already targeting something, and that thing is still alive and near the pot, keeping targeting it.
|
||||
if (enemy != null && enemy.isAlive() && Dungeon.level.mobs.contains(enemy)
|
||||
&& Level.fieldOfView[enemy.pos] && enemy.invisible == 0
|
||||
&& Level.distance(enemy.pos, potPos) <= 3)
|
||||
&& Dungeon.level.distance(enemy.pos, potPos) <= 3)
|
||||
return enemy;
|
||||
|
||||
//find all mobs near the pot
|
||||
HashSet<Char> enemies = new HashSet<>();
|
||||
for (Mob mob : Dungeon.level.mobs)
|
||||
if (!(mob instanceof Bee) && Level.distance(mob.pos, potPos) <= 3 && (mob.hostile || mob.ally))
|
||||
if (!(mob instanceof Bee) && Dungeon.level.distance(mob.pos, potPos) <= 3 && (mob.hostile || mob.ally))
|
||||
enemies.add(mob);
|
||||
|
||||
//pick one, if there are none, check if the hero is near the pot, go for them, otherwise go for nothing.
|
||||
if (enemies.size() > 0) return Random.element(enemies);
|
||||
else return (Level.distance(Dungeon.hero.pos, potPos) <= 3) ? Dungeon.hero : null ;
|
||||
else return (Dungeon.level.distance(Dungeon.hero.pos, potPos) <= 3) ? Dungeon.hero : null ;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -140,7 +140,7 @@ public class Bee extends Mob {
|
||||
protected boolean getCloser(int target) {
|
||||
if (enemy != null && Actor.findById(potHolder) == enemy) {
|
||||
target = enemy.pos;
|
||||
} else if (potPos != -1 && (state == WANDERING || Level.distance(target, potPos) > 3))
|
||||
} else if (potPos != -1 && (state == WANDERING || Dungeon.level.distance(target, potPos) > 3))
|
||||
this.target = target = potPos;
|
||||
return super.getCloser( target );
|
||||
}
|
||||
|
||||
@@ -106,11 +106,11 @@ public class DM300 extends Mob {
|
||||
}
|
||||
|
||||
int[] cells = {
|
||||
step-1, step+1, step-Level.WIDTH, step+Level.WIDTH,
|
||||
step-1-Level.WIDTH,
|
||||
step-1+Level.WIDTH,
|
||||
step+1-Level.WIDTH,
|
||||
step+1+Level.WIDTH
|
||||
step-1, step+1, step-Dungeon.level.width(), step+Dungeon.level.width(),
|
||||
step-1-Dungeon.level.width(),
|
||||
step-1+Dungeon.level.width(),
|
||||
step+1-Dungeon.level.width(),
|
||||
step+1+Dungeon.level.width()
|
||||
};
|
||||
int cell = cells[Random.Int( cells.length )];
|
||||
|
||||
|
||||
+2
-1
@@ -20,6 +20,7 @@
|
||||
*/
|
||||
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.Fire;
|
||||
@@ -64,7 +65,7 @@ public class GnollTrickster extends Gnoll {
|
||||
@Override
|
||||
protected boolean canAttack( Char enemy ) {
|
||||
Ballistica attack = new Ballistica( pos, enemy.pos, Ballistica.PROJECTILE);
|
||||
return !Level.adjacent(pos, enemy.pos) && attack.collisionPos == enemy.pos;
|
||||
return !Dungeon.level.adjacent(pos, enemy.pos) && attack.collisionPos == enemy.pos;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -43,10 +43,12 @@ import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.sprites.CharSprite;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.sprites.GooSprite;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.ui.BossHealthBar;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.utils.BArray;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.utils.GLog;
|
||||
import com.watabou.noosa.Camera;
|
||||
import com.watabou.noosa.audio.Sample;
|
||||
import com.watabou.utils.Bundle;
|
||||
import com.watabou.utils.PathFinder;
|
||||
import com.watabou.utils.Random;
|
||||
|
||||
import java.util.HashSet;
|
||||
@@ -74,10 +76,10 @@ public class Goo extends Mob {
|
||||
int max = (HP*2 <= HT) ? 15 : 10;
|
||||
if (pumpedUp > 0) {
|
||||
pumpedUp = 0;
|
||||
for (int i = 0; i < Level.NEIGHBOURS9DIST2.length; i++) {
|
||||
int j = pos + Level.NEIGHBOURS9DIST2[i];
|
||||
if (Level.insideMap(j) && Level.passable[j])
|
||||
CellEmitter.get(j).burst(ElmoParticle.FACTORY, 10);
|
||||
PathFinder.buildDistanceMap( pos, BArray.not( Level.solid, null ), 2 );
|
||||
for (int i = 0; i < PathFinder.distance.length; i++) {
|
||||
if (PathFinder.distance[i] < Integer.MAX_VALUE)
|
||||
CellEmitter.get(i).burst(ElmoParticle.FACTORY, 10);
|
||||
}
|
||||
Sample.INSTANCE.play( Assets.SND_BURNING );
|
||||
return Random.NormalIntRange( min*3, max*3 );
|
||||
@@ -142,10 +144,10 @@ public class Goo extends Mob {
|
||||
protected boolean doAttack( Char enemy ) {
|
||||
if (pumpedUp == 1) {
|
||||
((GooSprite)sprite).pumpUp();
|
||||
for (int i = 0; i < Level.NEIGHBOURS9DIST2.length; i++) {
|
||||
int j = pos + Level.NEIGHBOURS9DIST2[i];
|
||||
if (Level.insideMap(j) && Level.passable[j])
|
||||
GameScene.add(Blob.seed(j, 2, GooWarn.class));
|
||||
PathFinder.buildDistanceMap( pos, BArray.not( Level.solid, null ), 2 );
|
||||
for (int i = 0; i < PathFinder.distance.length; i++) {
|
||||
if (PathFinder.distance[i] < Integer.MAX_VALUE)
|
||||
GameScene.add(Blob.seed(i, 2, GooWarn.class));
|
||||
}
|
||||
pumpedUp++;
|
||||
|
||||
@@ -176,9 +178,9 @@ public class Goo extends Mob {
|
||||
|
||||
((GooSprite)sprite).pumpUp();
|
||||
|
||||
for (int i=0; i < Level.NEIGHBOURS9.length; i++) {
|
||||
int j = pos + Level.NEIGHBOURS9[i];
|
||||
if (Level.passable[j]) {
|
||||
for (int i=0; i < PathFinder.NEIGHBOURS9.length; i++) {
|
||||
int j = pos + PathFinder.NEIGHBOURS9[i];
|
||||
if (!Level.solid[j]) {
|
||||
GameScene.add(Blob.seed(j, 2, GooWarn.class));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -72,7 +72,8 @@ public class Guard extends Mob {
|
||||
enemy != null &&
|
||||
enemy.invisible == 0 &&
|
||||
Level.fieldOfView[enemy.pos] &&
|
||||
Level.distance( pos, enemy.pos ) < 5 && !Level.adjacent( pos, enemy.pos ) &&
|
||||
Dungeon.level.distance( pos, enemy.pos ) < 5 &&
|
||||
!Dungeon.level.adjacent( pos, enemy.pos ) &&
|
||||
Random.Int(3) == 0 &&
|
||||
|
||||
chain(enemy.pos)) {
|
||||
|
||||
@@ -105,20 +105,20 @@ public class King extends Mob {
|
||||
@Override
|
||||
protected boolean getCloser( int target ) {
|
||||
return canTryToSummon() ?
|
||||
super.getCloser( CityBossLevel.pedestal( nextPedestal ) ) :
|
||||
super.getCloser( ((CityBossLevel)Dungeon.level).pedestal( nextPedestal ) ) :
|
||||
super.getCloser( target );
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean canAttack( Char enemy ) {
|
||||
return canTryToSummon() ?
|
||||
pos == CityBossLevel.pedestal( nextPedestal ) :
|
||||
Level.adjacent( pos, enemy.pos );
|
||||
pos == ((CityBossLevel)Dungeon.level).pedestal( nextPedestal ) :
|
||||
Dungeon.level.adjacent( pos, enemy.pos );
|
||||
}
|
||||
|
||||
private boolean canTryToSummon() {
|
||||
if (Undead.count < maxArmySize()) {
|
||||
Char ch = Actor.findChar( CityBossLevel.pedestal( nextPedestal ) );
|
||||
Char ch = Actor.findChar( ((CityBossLevel)Dungeon.level).pedestal( nextPedestal ) );
|
||||
return ch == this || ch == null;
|
||||
} else {
|
||||
return false;
|
||||
@@ -127,11 +127,11 @@ public class King extends Mob {
|
||||
|
||||
@Override
|
||||
public boolean attack( Char enemy ) {
|
||||
if (canTryToSummon() && pos == CityBossLevel.pedestal( nextPedestal )) {
|
||||
if (canTryToSummon() && pos == ((CityBossLevel)Dungeon.level).pedestal( nextPedestal )) {
|
||||
summon();
|
||||
return true;
|
||||
} else {
|
||||
if (Actor.findChar( CityBossLevel.pedestal( nextPedestal ) ) == enemy) {
|
||||
if (Actor.findChar( ((CityBossLevel)Dungeon.level).pedestal( nextPedestal ) ) == enemy) {
|
||||
nextPedestal = !nextPedestal;
|
||||
}
|
||||
return super.attack(enemy);
|
||||
@@ -199,7 +199,7 @@ public class King extends Mob {
|
||||
undeadLabel:
|
||||
for (int i=0; i < undeadsToSummon; i++) {
|
||||
do {
|
||||
for (int j=0; j < Level.LENGTH; j++) {
|
||||
for (int j=0; j < Dungeon.level.length(); j++) {
|
||||
if (PathFinder.distance[j] == dist) {
|
||||
|
||||
Undead undead = new Undead();
|
||||
|
||||
@@ -36,6 +36,7 @@ import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.sprites.MimicSprite;
|
||||
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;
|
||||
@@ -115,7 +116,7 @@ public class Mimic extends Mob {
|
||||
Char ch = Actor.findChar( pos );
|
||||
if (ch != null) {
|
||||
ArrayList<Integer> candidates = new ArrayList<>();
|
||||
for (int n : Level.NEIGHBOURS8) {
|
||||
for (int n : PathFinder.NEIGHBOURS8) {
|
||||
int cell = pos + n;
|
||||
if ((Level.passable[cell] || Level.avoid[cell]) && Actor.findChar( cell ) == null) {
|
||||
candidates.add( cell );
|
||||
|
||||
@@ -285,7 +285,7 @@ public abstract class Mob extends Char {
|
||||
}
|
||||
|
||||
protected boolean canAttack( Char enemy ) {
|
||||
return Level.adjacent( pos, enemy.pos );
|
||||
return Dungeon.level.adjacent( pos, enemy.pos );
|
||||
}
|
||||
|
||||
protected boolean getCloser( int target ) {
|
||||
@@ -662,7 +662,7 @@ public abstract class Mob extends Char {
|
||||
public boolean act( boolean enemyInFOV, boolean justAlerted ) {
|
||||
enemySeen = enemyInFOV;
|
||||
//loses target when 0-dist rolls a 6 or greater.
|
||||
if (enemy == null || !enemyInFOV && 1 + Random.Int(Level.distance(pos, target)) >= 6){
|
||||
if (enemy == null || !enemyInFOV && 1 + Random.Int(Dungeon.level.distance(pos, target)) >= 6){
|
||||
target = -1;
|
||||
} else {
|
||||
target = enemy.pos;
|
||||
|
||||
+2
-1
@@ -20,6 +20,7 @@
|
||||
*/
|
||||
package com.shatteredpixel.shatteredpixeldungeon.actors.mobs;
|
||||
|
||||
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.Char;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.blobs.ToxicGas;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff;
|
||||
@@ -52,7 +53,7 @@ public class RotLasher extends Mob {
|
||||
|
||||
@Override
|
||||
protected boolean act() {
|
||||
if (enemy == null || !Level.adjacent(pos, enemy.pos)) {
|
||||
if (enemy == null || !Dungeon.level.adjacent(pos, enemy.pos)) {
|
||||
HP = Math.min(HT, HP + 3);
|
||||
}
|
||||
return super.act();
|
||||
|
||||
+1
-1
@@ -73,7 +73,7 @@ public class Scorpio extends Mob {
|
||||
@Override
|
||||
protected boolean canAttack( Char enemy ) {
|
||||
Ballistica attack = new Ballistica( pos, enemy.pos, Ballistica.PROJECTILE);
|
||||
return !Level.adjacent( pos, enemy.pos ) && attack.collisionPos == enemy.pos;
|
||||
return !Dungeon.level.adjacent( pos, enemy.pos ) && attack.collisionPos == enemy.pos;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -77,7 +77,7 @@ public class Shaman extends Mob implements Callback {
|
||||
@Override
|
||||
protected boolean doAttack( Char enemy ) {
|
||||
|
||||
if (Level.distance( pos, enemy.pos ) <= 1) {
|
||||
if (Dungeon.level.distance( pos, enemy.pos ) <= 1) {
|
||||
|
||||
return super.doAttack( enemy );
|
||||
|
||||
|
||||
+3
-2
@@ -32,6 +32,7 @@ import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.sprites.SkeletonSprite;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.utils.GLog;
|
||||
import com.watabou.noosa.audio.Sample;
|
||||
import com.watabou.utils.PathFinder;
|
||||
import com.watabou.utils.Random;
|
||||
|
||||
import java.util.HashSet;
|
||||
@@ -66,8 +67,8 @@ public class Skeleton extends Mob {
|
||||
super.die( cause );
|
||||
|
||||
boolean heroKilled = false;
|
||||
for (int i=0; i < Level.NEIGHBOURS8.length; i++) {
|
||||
Char ch = findChar( pos + Level.NEIGHBOURS8[i] );
|
||||
for (int i = 0; i < PathFinder.NEIGHBOURS8.length; i++) {
|
||||
Char ch = findChar( pos + PathFinder.NEIGHBOURS8[i] );
|
||||
if (ch != null && ch.isAlive()) {
|
||||
int damage = Math.max( 0, damageRoll() - (ch.drRoll() / 2) );
|
||||
ch.damage( damage, this );
|
||||
|
||||
@@ -103,7 +103,7 @@ public class Statue extends Mob {
|
||||
|
||||
@Override
|
||||
protected boolean canAttack(Char enemy) {
|
||||
return Level.distance( pos, enemy.pos ) <= weapon.RCH;
|
||||
return Dungeon.level.distance( pos, enemy.pos ) <= weapon.RCH;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
+4
-2
@@ -21,6 +21,7 @@
|
||||
package com.shatteredpixel.shatteredpixeldungeon.actors.mobs;
|
||||
|
||||
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.buffs.Buff;
|
||||
@@ -35,6 +36,7 @@ import com.shatteredpixel.shatteredpixeldungeon.levels.Level;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.mechanics.Ballistica;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.sprites.SuccubusSprite;
|
||||
import com.watabou.noosa.audio.Sample;
|
||||
import com.watabou.utils.PathFinder;
|
||||
import com.watabou.utils.Random;
|
||||
|
||||
import java.util.ArrayList;
|
||||
@@ -81,7 +83,7 @@ public class Succubus extends Mob {
|
||||
|
||||
@Override
|
||||
protected boolean getCloser( int target ) {
|
||||
if (Level.fieldOfView[target] && Level.distance( pos, target ) > 2 && delay <= 0) {
|
||||
if (Level.fieldOfView[target] && Dungeon.level.distance( pos, target ) > 2 && delay <= 0) {
|
||||
|
||||
blink( target );
|
||||
spend( -1 / speed() );
|
||||
@@ -106,7 +108,7 @@ public class Succubus extends Mob {
|
||||
|
||||
if (Level.avoid[ cell ]){
|
||||
ArrayList<Integer> candidates = new ArrayList<>();
|
||||
for (int n : Level.NEIGHBOURS8) {
|
||||
for (int n : PathFinder.NEIGHBOURS8) {
|
||||
cell = route.collisionPos + n;
|
||||
if (Level.passable[cell] && Actor.findChar( cell ) == null) {
|
||||
candidates.add( cell );
|
||||
|
||||
@@ -88,7 +88,7 @@ public class Swarm extends Mob {
|
||||
ArrayList<Integer> candidates = new ArrayList<>();
|
||||
boolean[] passable = Level.passable;
|
||||
|
||||
int[] neighbours = {pos + 1, pos - 1, pos + Level.WIDTH, pos - Level.WIDTH};
|
||||
int[] neighbours = {pos + 1, pos - 1, pos + Dungeon.level.width(), pos - Dungeon.level.width()};
|
||||
for (int n : neighbours) {
|
||||
if (passable[n] && Actor.findChar( n ) == null) {
|
||||
candidates.add( n );
|
||||
|
||||
@@ -166,7 +166,7 @@ public class Tengu extends Mob {
|
||||
for (int i=0; i < 4; i++) {
|
||||
int trapPos;
|
||||
do {
|
||||
trapPos = Random.Int( Level.LENGTH );
|
||||
trapPos = Random.Int( Dungeon.level.length() );
|
||||
} while (!Level.fieldOfView[trapPos] || Level.solid[trapPos]);
|
||||
|
||||
if (Dungeon.level.map[trapPos] == Terrain.INACTIVE_TRAP) {
|
||||
@@ -182,20 +182,20 @@ public class Tengu extends Mob {
|
||||
//if we're in phase 1, want to warp around within the room
|
||||
if (HP > HT/2) {
|
||||
do {
|
||||
newPos = Random.Int(Level.LENGTH);
|
||||
newPos = Random.Int(Dungeon.level.length());
|
||||
} while (
|
||||
!(Dungeon.level.map[newPos] == Terrain.INACTIVE_TRAP || Dungeon.level.map[newPos] == Terrain.TRAP)||
|
||||
Level.solid[newPos] ||
|
||||
Level.adjacent(newPos, enemy.pos) ||
|
||||
Dungeon.level.adjacent(newPos, enemy.pos) ||
|
||||
Actor.findChar(newPos) != null);
|
||||
|
||||
//otherwise go wherever, as long as it's a little bit away
|
||||
} else {
|
||||
do {
|
||||
newPos = Random.Int(Level.LENGTH);
|
||||
newPos = Random.Int(Dungeon.level.length());
|
||||
} while (
|
||||
Level.solid[newPos] ||
|
||||
Level.distance(newPos, enemy.pos) < 8 ||
|
||||
Dungeon.level.distance(newPos, enemy.pos) < 8 ||
|
||||
Actor.findChar(newPos) != null);
|
||||
}
|
||||
|
||||
|
||||
@@ -191,7 +191,7 @@ public class Thief extends Mob {
|
||||
if (count-- <= 0) {
|
||||
break;
|
||||
}
|
||||
} while (newPos == -1 || Dungeon.visible[newPos] || Level.distance(newPos, pos) < (count/3));
|
||||
} while (newPos == -1 || Dungeon.visible[newPos] || Dungeon.level.distance(newPos, pos) < (count/3));
|
||||
|
||||
if (newPos != -1) {
|
||||
|
||||
|
||||
+1
-1
@@ -80,7 +80,7 @@ public class Warlock extends Mob implements Callback {
|
||||
|
||||
protected boolean doAttack( Char enemy ) {
|
||||
|
||||
if (Level.adjacent( pos, enemy.pos )) {
|
||||
if (Dungeon.level.adjacent( pos, enemy.pos )) {
|
||||
|
||||
return super.doAttack( enemy );
|
||||
|
||||
|
||||
@@ -31,6 +31,7 @@ import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.sprites.WraithSprite;
|
||||
import com.watabou.noosa.tweeners.AlphaTweener;
|
||||
import com.watabou.utils.Bundle;
|
||||
import com.watabou.utils.PathFinder;
|
||||
import com.watabou.utils.Random;
|
||||
|
||||
import java.util.HashSet;
|
||||
@@ -90,7 +91,7 @@ public class Wraith extends Mob {
|
||||
}
|
||||
|
||||
public static void spawnAround( int pos ) {
|
||||
for (int n : Level.NEIGHBOURS4) {
|
||||
for (int n : PathFinder.NEIGHBOURS4) {
|
||||
int cell = pos + n;
|
||||
if (Level.passable[cell] && Actor.findChar( cell ) == null) {
|
||||
spawnAt( cell );
|
||||
|
||||
@@ -53,6 +53,7 @@ import com.shatteredpixel.shatteredpixeldungeon.sprites.YogSprite;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.ui.BossHealthBar;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.utils.GLog;
|
||||
import com.watabou.utils.Bundle;
|
||||
import com.watabou.utils.PathFinder;
|
||||
import com.watabou.utils.Random;
|
||||
|
||||
import java.util.ArrayList;
|
||||
@@ -83,8 +84,8 @@ public class Yog extends Mob {
|
||||
BurningFist fist2 = new BurningFist();
|
||||
|
||||
do {
|
||||
fist1.pos = pos + Level.NEIGHBOURS8[Random.Int( 8 )];
|
||||
fist2.pos = pos + Level.NEIGHBOURS8[Random.Int( 8 )];
|
||||
fist1.pos = pos + PathFinder.NEIGHBOURS8[Random.Int( 8 )];
|
||||
fist2.pos = pos + PathFinder.NEIGHBOURS8[Random.Int( 8 )];
|
||||
} while (!Level.passable[fist1.pos] || !Level.passable[fist2.pos] || fist1.pos == fist2.pos);
|
||||
|
||||
GameScene.add( fist1 );
|
||||
@@ -128,8 +129,8 @@ public class Yog extends Mob {
|
||||
|
||||
ArrayList<Integer> spawnPoints = new ArrayList<>();
|
||||
|
||||
for (int i=0; i < Level.NEIGHBOURS8.length; i++) {
|
||||
int p = pos + Level.NEIGHBOURS8[i];
|
||||
for (int i=0; i < PathFinder.NEIGHBOURS8.length; i++) {
|
||||
int p = pos + PathFinder.NEIGHBOURS8[i];
|
||||
if (Actor.findChar( p ) == null && (Level.passable[p] || Level.avoid[p])) {
|
||||
spawnPoints.add( p );
|
||||
}
|
||||
@@ -332,7 +333,7 @@ public class Yog extends Mob {
|
||||
@Override
|
||||
public boolean attack( Char enemy ) {
|
||||
|
||||
if (!Level.adjacent( pos, enemy.pos )) {
|
||||
if (!Dungeon.level.adjacent( pos, enemy.pos )) {
|
||||
spend( attackDelay() );
|
||||
|
||||
if (hit( this, enemy, true )) {
|
||||
@@ -362,8 +363,8 @@ public class Yog extends Mob {
|
||||
@Override
|
||||
public boolean act() {
|
||||
|
||||
for (int i=0; i < Level.NEIGHBOURS9.length; i++) {
|
||||
GameScene.add( Blob.seed( pos + Level.NEIGHBOURS9[i], 2, Fire.class ) );
|
||||
for (int i=0; i < PathFinder.NEIGHBOURS9.length; i++) {
|
||||
GameScene.add( Blob.seed( pos + PathFinder.NEIGHBOURS9[i], 2, Fire.class ) );
|
||||
}
|
||||
|
||||
return super.act();
|
||||
|
||||
+2
-1
@@ -24,6 +24,7 @@ import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Mob;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.items.Heap;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.levels.Level;
|
||||
import com.watabou.utils.PathFinder;
|
||||
import com.watabou.utils.Random;
|
||||
|
||||
public abstract class NPC extends Mob {
|
||||
@@ -41,7 +42,7 @@ public abstract class NPC extends Mob {
|
||||
if (heap != null) {
|
||||
int n;
|
||||
do {
|
||||
n = pos + Level.NEIGHBOURS8[Random.Int( 8 )];
|
||||
n = pos + PathFinder.NEIGHBOURS8[Random.Int( 8 )];
|
||||
} while (!Level.passable[n] && !Level.avoid[n]);
|
||||
Dungeon.level.drop( heap.pickUp(), n ).sprite.drop( pos );
|
||||
}
|
||||
|
||||
+1
-1
@@ -259,7 +259,7 @@ public class Wandmaker extends NPC {
|
||||
if (setRoom( rooms )){
|
||||
Wandmaker npc = new Wandmaker();
|
||||
do {
|
||||
npc.pos = room.random();
|
||||
npc.pos = Dungeon.level.pointToCell(room.random());
|
||||
} while (level.map[npc.pos] == Terrain.ENTRANCE || level.map[npc.pos] == Terrain.SIGN);
|
||||
level.mobs.add( npc );
|
||||
|
||||
|
||||
+3
-6
@@ -27,9 +27,6 @@ import com.watabou.noosa.particles.Emitter;
|
||||
import com.watabou.utils.Random;
|
||||
|
||||
public class BlobEmitter extends Emitter {
|
||||
|
||||
private static final int WIDTH = Blob.WIDTH;
|
||||
private static final int LENGTH = Blob.LENGTH;
|
||||
|
||||
private Blob blob;
|
||||
|
||||
@@ -51,10 +48,10 @@ public class BlobEmitter extends Emitter {
|
||||
int[] map = blob.cur;
|
||||
float size = DungeonTilemap.SIZE;
|
||||
|
||||
for (int i=0; i < LENGTH; i++) {
|
||||
for (int i=0; i < Dungeon.level.length(); i++) {
|
||||
if (map[i] > 0 && Dungeon.visible[i]) {
|
||||
float x = ((i % WIDTH) + Random.Float()) * size;
|
||||
float y = ((i / WIDTH) + Random.Float()) * size;
|
||||
float x = ((i % Dungeon.level.width()) + Random.Float()) * size;
|
||||
float y = ((i / Dungeon.level.width()) + Random.Float()) * size;
|
||||
factory.emit( this, index, x, y );
|
||||
}
|
||||
}
|
||||
|
||||
@@ -20,6 +20,7 @@
|
||||
*/
|
||||
package com.shatteredpixel.shatteredpixeldungeon.effects;
|
||||
|
||||
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.DungeonTilemap;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.levels.Level;
|
||||
import com.watabou.noosa.Game;
|
||||
@@ -38,8 +39,8 @@ public class Ripple extends Image {
|
||||
public void reset( int p ) {
|
||||
revive();
|
||||
|
||||
x = (p % Level.WIDTH) * DungeonTilemap.SIZE;
|
||||
y = (p / Level.WIDTH) * DungeonTilemap.SIZE;
|
||||
x = (p % Dungeon.level.width()) * DungeonTilemap.SIZE;
|
||||
y = (p / Dungeon.level.width()) * DungeonTilemap.SIZE;
|
||||
|
||||
origin.set( width / 2, height / 2 );
|
||||
scale.set( 0 );
|
||||
|
||||
@@ -42,8 +42,8 @@ public class Surprise extends Image {
|
||||
public void reset(int p) {
|
||||
revive();
|
||||
|
||||
x = (p % Level.WIDTH) * DungeonTilemap.SIZE + (DungeonTilemap.SIZE - width) / 2;
|
||||
y = (p / Level.WIDTH) * DungeonTilemap.SIZE + (DungeonTilemap.SIZE - height) / 2;
|
||||
x = (p % Dungeon.level.width()) * DungeonTilemap.SIZE + (DungeonTilemap.SIZE - width) / 2;
|
||||
y = (p / Dungeon.level.width()) * DungeonTilemap.SIZE + (DungeonTilemap.SIZE - height) / 2;
|
||||
|
||||
time = TIME_TO_FADE;
|
||||
}
|
||||
|
||||
@@ -47,7 +47,7 @@ public class Swap extends Actor {
|
||||
this.ch1 = ch1;
|
||||
this.ch2 = ch2;
|
||||
|
||||
delay = Level.distance( ch1.pos, ch2.pos ) * 0.1f;
|
||||
delay = Dungeon.level.distance( ch1.pos, ch2.pos ) * 0.1f;
|
||||
|
||||
eff1 = new Effect( ch1.sprite, ch1.pos, ch2.pos );
|
||||
eff2 = new Effect( ch2.sprite, ch2.pos, ch1.pos );
|
||||
|
||||
@@ -41,9 +41,9 @@ public class Wound extends Image {
|
||||
|
||||
public void reset( int p ) {
|
||||
revive();
|
||||
|
||||
x = (p % Level.WIDTH) * DungeonTilemap.SIZE + (DungeonTilemap.SIZE - width) / 2;
|
||||
y = (p / Level.WIDTH) * DungeonTilemap.SIZE + (DungeonTilemap.SIZE - height) / 2;
|
||||
|
||||
x = (p % Dungeon.level.width()) * DungeonTilemap.SIZE + (DungeonTilemap.SIZE - width) / 2;
|
||||
y = (p / Dungeon.level.width()) * DungeonTilemap.SIZE + (DungeonTilemap.SIZE - height) / 2;
|
||||
|
||||
time = TIME_TO_FADE;
|
||||
}
|
||||
|
||||
@@ -37,6 +37,7 @@ import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.utils.GLog;
|
||||
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;
|
||||
@@ -90,7 +91,7 @@ public class Bomb extends Item {
|
||||
}
|
||||
if (Actor.findChar( cell ) != null && !(Actor.findChar( cell ) instanceof Hero) ){
|
||||
ArrayList<Integer> candidates = new ArrayList<>();
|
||||
for (int i : Level.NEIGHBOURS8)
|
||||
for (int i : PathFinder.NEIGHBOURS8)
|
||||
if (Level.passable[cell + i])
|
||||
candidates.add(cell + i);
|
||||
int newCell = candidates.isEmpty() ? cell : Random.element(candidates);
|
||||
@@ -119,9 +120,9 @@ public class Bomb extends Item {
|
||||
}
|
||||
|
||||
boolean terrainAffected = false;
|
||||
for (int n : Level.NEIGHBOURS9) {
|
||||
for (int n : PathFinder.NEIGHBOURS9) {
|
||||
int c = cell + n;
|
||||
if (c >= 0 && c < Level.LENGTH) {
|
||||
if (c >= 0 && c < Dungeon.level.length()) {
|
||||
if (Dungeon.visible[c]) {
|
||||
CellEmitter.get( c ).burst( SmokeParticle.FACTORY, 4 );
|
||||
}
|
||||
|
||||
@@ -34,6 +34,7 @@ import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet;
|
||||
import com.watabou.noosa.audio.Sample;
|
||||
import com.watabou.noosa.tweeners.AlphaTweener;
|
||||
import com.watabou.utils.Bundle;
|
||||
import com.watabou.utils.PathFinder;
|
||||
import com.watabou.utils.Random;
|
||||
|
||||
import java.util.ArrayList;
|
||||
@@ -97,7 +98,7 @@ public class Honeypot extends Item {
|
||||
ArrayList<Integer> candidates = new ArrayList<Integer>();
|
||||
boolean[] passable = Level.passable;
|
||||
|
||||
for (int n : Level.NEIGHBOURS4) {
|
||||
for (int n : PathFinder.NEIGHBOURS4) {
|
||||
int c = pos + n;
|
||||
if (passable[c] && Actor.findChar( c ) == null) {
|
||||
candidates.add( c );
|
||||
|
||||
+4
-2
@@ -35,6 +35,8 @@ import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet;
|
||||
import com.watabou.noosa.Camera;
|
||||
import com.watabou.utils.Callback;
|
||||
import com.watabou.utils.PathFinder;
|
||||
|
||||
public class WarriorArmor extends ClassArmor {
|
||||
|
||||
private static int LEAP_TIME = 1;
|
||||
@@ -74,8 +76,8 @@ public class WarriorArmor extends ClassArmor {
|
||||
Dungeon.level.press(dest, curUser);
|
||||
Dungeon.observe();
|
||||
|
||||
for (int i = 0; i < Level.NEIGHBOURS8.length; i++) {
|
||||
Char mob = Actor.findChar(curUser.pos + Level.NEIGHBOURS8[i]);
|
||||
for (int i = 0; i < PathFinder.NEIGHBOURS8.length; i++) {
|
||||
Char mob = Actor.findChar(curUser.pos + PathFinder.NEIGHBOURS8[i]);
|
||||
if (mob != null && mob != curUser) {
|
||||
Buff.prolong(mob, Paralysis.class, SHOCK_TIME);
|
||||
}
|
||||
|
||||
+2
-1
@@ -20,6 +20,7 @@
|
||||
*/
|
||||
package com.shatteredpixel.shatteredpixeldungeon.items.armor.curses;
|
||||
|
||||
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.Char;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Burning;
|
||||
@@ -43,7 +44,7 @@ public class AntiEntropy extends Glyph {
|
||||
|
||||
if (Random.Int( 8 ) == 0) {
|
||||
|
||||
if (Level.adjacent( attacker.pos, defender.pos )) {
|
||||
if (Dungeon.level.adjacent( attacker.pos, defender.pos )) {
|
||||
Buff.prolong(attacker, Frost.class, Frost.duration(attacker) * Random.Float(0.5f, 1f));
|
||||
CellEmitter.get(attacker.pos).start(SnowParticle.FACTORY, 0.2f, 6);
|
||||
}
|
||||
|
||||
+2
-1
@@ -28,6 +28,7 @@ import com.shatteredpixel.shatteredpixeldungeon.effects.Splash;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.items.armor.Armor;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.levels.Level;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSprite;
|
||||
import com.watabou.utils.PathFinder;
|
||||
import com.watabou.utils.Random;
|
||||
|
||||
public class Corrosion extends Armor.Glyph {
|
||||
@@ -39,7 +40,7 @@ public class Corrosion extends Armor.Glyph {
|
||||
|
||||
if (Random.Int(10) == 0){
|
||||
int pos = defender.pos;
|
||||
for (int i : Level.NEIGHBOURS9){
|
||||
for (int i : PathFinder.NEIGHBOURS9){
|
||||
Splash.at(pos+i, 0x000000, 5);
|
||||
if (Actor.findChar(pos+i) != null)
|
||||
Buff.affect(Actor.findChar(pos+i), Ooze.class);
|
||||
|
||||
+3
-2
@@ -34,6 +34,7 @@ import com.shatteredpixel.shatteredpixeldungeon.levels.Level;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSprite;
|
||||
import com.watabou.utils.Bundle;
|
||||
import com.watabou.utils.PathFinder;
|
||||
import com.watabou.utils.Random;
|
||||
|
||||
import java.util.ArrayList;
|
||||
@@ -48,8 +49,8 @@ public class Multiplicity extends Armor.Glyph {
|
||||
if (Random.Int(20) == 0){
|
||||
ArrayList<Integer> spawnPoints = new ArrayList<>();
|
||||
|
||||
for (int i = 0; i < Level.NEIGHBOURS8.length; i++) {
|
||||
int p = defender.pos + Level.NEIGHBOURS8[i];
|
||||
for (int i = 0; i < PathFinder.NEIGHBOURS8.length; i++) {
|
||||
int p = defender.pos + PathFinder.NEIGHBOURS8[i];
|
||||
if (Actor.findChar( p ) == null && (Level.passable[p] || Level.avoid[p])) {
|
||||
spawnPoints.add( p );
|
||||
}
|
||||
|
||||
+3
-2
@@ -31,6 +31,7 @@ import com.shatteredpixel.shatteredpixeldungeon.levels.Level;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSprite;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSprite.Glowing;
|
||||
import com.watabou.utils.PathFinder;
|
||||
import com.watabou.utils.Random;
|
||||
|
||||
import java.util.ArrayList;
|
||||
@@ -48,8 +49,8 @@ public class Multiplicity extends Glyph {
|
||||
|
||||
ArrayList<Integer> respawnPoints = new ArrayList<Integer>();
|
||||
|
||||
for (int i=0; i < Level.NEIGHBOURS8.length; i++) {
|
||||
int p = defender.pos + Level.NEIGHBOURS8[i];
|
||||
for (int i = 0; i < PathFinder.NEIGHBOURS8.length; i++) {
|
||||
int p = defender.pos + PathFinder.NEIGHBOURS8[i];
|
||||
if (Actor.findChar( p ) == null && (Level.passable[p] || Level.avoid[p])) {
|
||||
respawnPoints.add( p );
|
||||
}
|
||||
|
||||
+1
-1
@@ -93,7 +93,7 @@ public class CapeOfThorns extends Artifact {
|
||||
int deflected = Random.NormalIntRange(0, damage);
|
||||
damage -= deflected;
|
||||
|
||||
if (attacker != null && Level.adjacent(attacker.pos, defender.pos)) {
|
||||
if (attacker != null && Dungeon.level.adjacent(attacker.pos, defender.pos)) {
|
||||
attacker.damage(deflected, this);
|
||||
}
|
||||
|
||||
|
||||
+6
-5
@@ -48,6 +48,7 @@ import com.shatteredpixel.shatteredpixeldungeon.utils.GLog;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.windows.WndQuest;
|
||||
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;
|
||||
@@ -100,8 +101,8 @@ public class DriedRose extends Artifact {
|
||||
else if (cursed) GLog.i( Messages.get(this, "cursed") );
|
||||
else {
|
||||
ArrayList<Integer> spawnPoints = new ArrayList<Integer>();
|
||||
for (int i = 0; i < Level.NEIGHBOURS8.length; i++) {
|
||||
int p = hero.pos + Level.NEIGHBOURS8[i];
|
||||
for (int i = 0; i < PathFinder.NEIGHBOURS8.length; i++) {
|
||||
int p = hero.pos + PathFinder.NEIGHBOURS8[i];
|
||||
if (Actor.findChar(p) == null && (Level.passable[p] || Level.avoid[p])) {
|
||||
spawnPoints.add(p);
|
||||
}
|
||||
@@ -217,8 +218,8 @@ public class DriedRose extends Artifact {
|
||||
|
||||
ArrayList<Integer> spawnPoints = new ArrayList<Integer>();
|
||||
|
||||
for (int i = 0; i < Level.NEIGHBOURS8.length; i++) {
|
||||
int p = target.pos + Level.NEIGHBOURS8[i];
|
||||
for (int i = 0; i < PathFinder.NEIGHBOURS8.length; i++) {
|
||||
int p = target.pos + PathFinder.NEIGHBOURS8[i];
|
||||
if (Actor.findChar(p) == null && (Level.passable[p] || Level.avoid[p])) {
|
||||
spawnPoints.add(p);
|
||||
}
|
||||
@@ -347,7 +348,7 @@ public class DriedRose extends Artifact {
|
||||
|
||||
@Override
|
||||
protected boolean getCloser( int target ) {
|
||||
if (state == WANDERING || Level.distance(target, Dungeon.hero.pos) > 6)
|
||||
if (state == WANDERING || Dungeon.level.distance(target, Dungeon.hero.pos) > 6)
|
||||
this.target = target = Dungeon.hero.pos;
|
||||
return super.getCloser( target );
|
||||
}
|
||||
|
||||
+2
-2
@@ -120,7 +120,7 @@ public class EtherealChains extends Artifact {
|
||||
} else {
|
||||
final int newMobPos = newPos;
|
||||
final Char affected = Actor.findChar( chain.collisionPos );
|
||||
int chargeUse = Level.distance(affected.pos, newMobPos);
|
||||
int chargeUse = Dungeon.level.distance(affected.pos, newMobPos);
|
||||
if (chargeUse > charge) {
|
||||
GLog.w( Messages.get(EtherealChains.class, "no_charge") );
|
||||
return;
|
||||
@@ -159,7 +159,7 @@ public class EtherealChains extends Artifact {
|
||||
GLog.w( Messages.get(EtherealChains.class, "does_nothing") );
|
||||
} else {
|
||||
final int newHeroPos = newPos;
|
||||
int chargeUse = Level.distance(curUser.pos, newHeroPos);
|
||||
int chargeUse = Dungeon.level.distance(curUser.pos, newHeroPos);
|
||||
if (chargeUse > charge){
|
||||
GLog.w( Messages.get(EtherealChains.class, "no_charge") );
|
||||
return;
|
||||
|
||||
+3
-2
@@ -46,6 +46,7 @@ import com.watabou.noosa.Game;
|
||||
import com.watabou.noosa.audio.Sample;
|
||||
import com.watabou.utils.Bundle;
|
||||
import com.watabou.utils.Callback;
|
||||
import com.watabou.utils.PathFinder;
|
||||
|
||||
import java.util.ArrayList;
|
||||
|
||||
@@ -115,8 +116,8 @@ public class LloydsBeacon extends Artifact {
|
||||
return;
|
||||
}
|
||||
|
||||
for (int i=0; i < Level.NEIGHBOURS8.length; i++) {
|
||||
if (Actor.findChar( hero.pos + Level.NEIGHBOURS8[i] ) != null) {
|
||||
for (int i = 0; i < PathFinder.NEIGHBOURS8.length; i++) {
|
||||
if (Actor.findChar( hero.pos + PathFinder.NEIGHBOURS8[i] ) != null) {
|
||||
GLog.w( Messages.get(this, "creatures") );
|
||||
return;
|
||||
}
|
||||
|
||||
+8
-8
@@ -75,7 +75,7 @@ public class TalismanOfForesight extends Artifact {
|
||||
hero.busy();
|
||||
Sample.INSTANCE.play(Assets.SND_BEACON);
|
||||
charge = 0;
|
||||
for (int i = 0; i < Level.LENGTH; i++) {
|
||||
for (int i = 0; i < Dungeon.level.length(); i++) {
|
||||
|
||||
int terr = Dungeon.level.map[i];
|
||||
if ((Terrain.flags[terr] & Terrain.SECRET) != 0) {
|
||||
@@ -130,27 +130,27 @@ public class TalismanOfForesight extends Artifact {
|
||||
|
||||
int distance = 3;
|
||||
|
||||
int cx = target.pos % Level.WIDTH;
|
||||
int cy = target.pos / Level.WIDTH;
|
||||
int cx = target.pos % Dungeon.level.width();
|
||||
int cy = target.pos / Dungeon.level.width();
|
||||
int ax = cx - distance;
|
||||
if (ax < 0) {
|
||||
ax = 0;
|
||||
}
|
||||
int bx = cx + distance;
|
||||
if (bx >= Level.WIDTH) {
|
||||
bx = Level.WIDTH - 1;
|
||||
if (bx >= Dungeon.level.width()) {
|
||||
bx = Dungeon.level.width() - 1;
|
||||
}
|
||||
int ay = cy - distance;
|
||||
if (ay < 0) {
|
||||
ay = 0;
|
||||
}
|
||||
int by = cy + distance;
|
||||
if (by >= Level.HEIGHT) {
|
||||
by = Level.HEIGHT - 1;
|
||||
if (by >= Dungeon.level.height()) {
|
||||
by = Dungeon.level.height() - 1;
|
||||
}
|
||||
|
||||
for (int y = ay; y <= by; y++) {
|
||||
for (int x = ax, p = ax + y * Level.WIDTH; x <= bx; x++, p++) {
|
||||
for (int x = ax, p = ax + y * Dungeon.level.width(); x <= bx; x++, p++) {
|
||||
|
||||
if (Dungeon.visible[p] && Level.secret[p] && Dungeon.level.map[p] != Terrain.SECRET_DOOR)
|
||||
smthFound = true;
|
||||
|
||||
+1
-1
@@ -45,7 +45,7 @@ public class PotionOfFrost extends Potion {
|
||||
Fire fire = (Fire)Dungeon.level.blobs.get( Fire.class );
|
||||
|
||||
boolean visible = false;
|
||||
for (int i=0; i < Level.LENGTH; i++) {
|
||||
for (int i=0; i < Dungeon.level.length(); i++) {
|
||||
if (PathFinder.distance[i] < Integer.MAX_VALUE) {
|
||||
visible = Freezing.affect( i, fire ) || visible;
|
||||
}
|
||||
|
||||
+2
-1
@@ -30,6 +30,7 @@ import com.shatteredpixel.shatteredpixeldungeon.effects.particles.FlameParticle;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.levels.Level;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene;
|
||||
import com.watabou.noosa.audio.Sample;
|
||||
import com.watabou.utils.PathFinder;
|
||||
|
||||
public class PotionOfLiquidFlame extends Potion {
|
||||
|
||||
@@ -47,7 +48,7 @@ public class PotionOfLiquidFlame extends Potion {
|
||||
Sample.INSTANCE.play( Assets.SND_SHATTER );
|
||||
}
|
||||
|
||||
for (int offset : Level.NEIGHBOURS9){
|
||||
for (int offset : PathFinder.NEIGHBOURS9){
|
||||
if (Level.flamable[cell+offset]
|
||||
|| Actor.findChar(cell+offset) != null
|
||||
|| Dungeon.level.heaps.get(cell+offset) != null) {
|
||||
|
||||
+1
-1
@@ -70,7 +70,7 @@ public class PotionOfPurity extends Potion {
|
||||
continue;
|
||||
}
|
||||
|
||||
for (int i=0; i < Level.LENGTH; i++) {
|
||||
for (int i=0; i < Dungeon.level.length(); i++) {
|
||||
if (PathFinder.distance[i] < Integer.MAX_VALUE) {
|
||||
|
||||
int value = blob.cur[i];
|
||||
|
||||
+5
-4
@@ -34,6 +34,7 @@ import com.shatteredpixel.shatteredpixeldungeon.levels.Level;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet;
|
||||
import com.watabou.noosa.audio.Sample;
|
||||
import com.watabou.utils.PathFinder;
|
||||
import com.watabou.utils.Random;
|
||||
|
||||
import java.util.ArrayList;
|
||||
@@ -76,9 +77,9 @@ public class CeremonialCandle extends Item {
|
||||
}
|
||||
|
||||
private static void checkCandles(){
|
||||
Heap heapTop = Dungeon.level.heaps.get(ritualPos - Level.WIDTH);
|
||||
Heap heapTop = Dungeon.level.heaps.get(ritualPos - Dungeon.level.width());
|
||||
Heap heapRight = Dungeon.level.heaps.get(ritualPos + 1);
|
||||
Heap heapBottom = Dungeon.level.heaps.get(ritualPos + Level.WIDTH);
|
||||
Heap heapBottom = Dungeon.level.heaps.get(ritualPos + Dungeon.level.width());
|
||||
Heap heapLeft = Dungeon.level.heaps.get(ritualPos - 1);
|
||||
|
||||
if (heapTop != null &&
|
||||
@@ -100,7 +101,7 @@ public class CeremonialCandle extends Item {
|
||||
Char ch = Actor.findChar( ritualPos );
|
||||
if (ch != null) {
|
||||
ArrayList<Integer> candidates = new ArrayList<>();
|
||||
for (int n : Level.NEIGHBOURS8) {
|
||||
for (int n : PathFinder.NEIGHBOURS8) {
|
||||
int cell = ritualPos + n;
|
||||
if ((Level.passable[cell] || Level.avoid[cell]) && Actor.findChar( cell ) == null) {
|
||||
candidates.add( cell );
|
||||
@@ -117,7 +118,7 @@ public class CeremonialCandle extends Item {
|
||||
elemental.state = elemental.HUNTING;
|
||||
GameScene.add(elemental, 1);
|
||||
|
||||
for (int i : Level.NEIGHBOURS9){
|
||||
for (int i : PathFinder.NEIGHBOURS9){
|
||||
CellEmitter.get(ritualPos+i).burst(ElmoParticle.FACTORY, 10);
|
||||
}
|
||||
Sample.INSTANCE.play(Assets.SND_BURNING);
|
||||
|
||||
+1
-1
@@ -101,7 +101,7 @@ public class CorpseDust extends Item {
|
||||
spawnPower -= powerNeeded;
|
||||
int pos = 0;
|
||||
do{
|
||||
pos = Random.Int(Level.LENGTH);
|
||||
pos = Random.Int(Dungeon.level.length());
|
||||
} while (!Dungeon.visible[pos] || !Level.passable[pos] || Actor.findChar( pos ) != null);
|
||||
Wraith.spawnAt(pos);
|
||||
Sample.INSTANCE.play(Assets.SND_CURSED);
|
||||
|
||||
+3
-2
@@ -40,6 +40,7 @@ import com.shatteredpixel.shatteredpixeldungeon.utils.GLog;
|
||||
import com.watabou.noosa.audio.Sample;
|
||||
import com.watabou.utils.Bundle;
|
||||
import com.watabou.utils.Callback;
|
||||
import com.watabou.utils.PathFinder;
|
||||
|
||||
import java.util.ArrayList;
|
||||
|
||||
@@ -96,9 +97,9 @@ public class Pickaxe extends Weapon {
|
||||
return;
|
||||
}
|
||||
|
||||
for (int i=0; i < Level.NEIGHBOURS8.length; i++) {
|
||||
for (int i = 0; i < PathFinder.NEIGHBOURS8.length; i++) {
|
||||
|
||||
final int pos = hero.pos + Level.NEIGHBOURS8[i];
|
||||
final int pos = hero.pos + PathFinder.NEIGHBOURS8[i];
|
||||
if (Dungeon.level.map[pos] == Terrain.WALL_DECO) {
|
||||
|
||||
hero.spend( TIME_TO_MINE );
|
||||
|
||||
+1
-1
@@ -42,7 +42,7 @@ public class ScrollOfMagicMapping extends Scroll {
|
||||
@Override
|
||||
protected void doRead() {
|
||||
|
||||
int length = Level.LENGTH;
|
||||
int length = Dungeon.level.length();
|
||||
int[] map = Dungeon.level.map;
|
||||
boolean[] mapped = Dungeon.level.mapped;
|
||||
boolean[] discoverable = Level.discoverable;
|
||||
|
||||
+3
-2
@@ -27,6 +27,7 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.npcs.MirrorImage;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.levels.Level;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene;
|
||||
import com.watabou.noosa.audio.Sample;
|
||||
import com.watabou.utils.PathFinder;
|
||||
import com.watabou.utils.Random;
|
||||
|
||||
import java.util.ArrayList;
|
||||
@@ -44,8 +45,8 @@ public class ScrollOfMirrorImage extends Scroll {
|
||||
|
||||
ArrayList<Integer> respawnPoints = new ArrayList<Integer>();
|
||||
|
||||
for (int i=0; i < Level.NEIGHBOURS8.length; i++) {
|
||||
int p = curUser.pos + Level.NEIGHBOURS8[i];
|
||||
for (int i = 0; i < PathFinder.NEIGHBOURS8.length; i++) {
|
||||
int p = curUser.pos + PathFinder.NEIGHBOURS8[i];
|
||||
if (Actor.findChar( p ) == null && (Level.passable[p] || Level.avoid[p])) {
|
||||
respawnPoints.add( p );
|
||||
}
|
||||
|
||||
+1
-1
@@ -356,7 +356,7 @@ public class CursedWand {
|
||||
|
||||
//great forest fire!
|
||||
case 0:
|
||||
for (int i = 0; i < Level.LENGTH; i++){
|
||||
for (int i = 0; i < Dungeon.level.length(); i++){
|
||||
int c = Dungeon.level.map[i];
|
||||
if (c == Terrain.EMPTY ||
|
||||
c == Terrain.EMBERS ||
|
||||
|
||||
+5
-4
@@ -40,6 +40,7 @@ import com.watabou.noosa.Group;
|
||||
import com.watabou.noosa.Image;
|
||||
import com.watabou.noosa.audio.Sample;
|
||||
import com.watabou.utils.Callback;
|
||||
import com.watabou.utils.PathFinder;
|
||||
import com.watabou.utils.PointF;
|
||||
import com.watabou.utils.Random;
|
||||
|
||||
@@ -67,12 +68,12 @@ public class WandOfBlastWave extends DamageWand {
|
||||
int damage = damageRoll();
|
||||
|
||||
//presses all tiles in the AOE first
|
||||
for (int i : Level.NEIGHBOURS9){
|
||||
for (int i : PathFinder.NEIGHBOURS9){
|
||||
Dungeon.level.press(bolt.collisionPos+i, Actor.findChar(bolt.collisionPos+i));
|
||||
}
|
||||
|
||||
//throws other chars around the center.
|
||||
for (int i : Level.NEIGHBOURS8){
|
||||
for (int i : PathFinder.NEIGHBOURS8){
|
||||
Char ch = Actor.findChar(bolt.collisionPos + i);
|
||||
|
||||
if (ch != null){
|
||||
@@ -186,8 +187,8 @@ public class WandOfBlastWave extends DamageWand {
|
||||
public void reset(int pos) {
|
||||
revive();
|
||||
|
||||
x = (pos % Level.WIDTH) * DungeonTilemap.SIZE + (DungeonTilemap.SIZE - width) / 2;
|
||||
y = (pos / Level.WIDTH) * DungeonTilemap.SIZE + (DungeonTilemap.SIZE - height) / 2;
|
||||
x = (pos % Dungeon.level.width()) * DungeonTilemap.SIZE + (DungeonTilemap.SIZE - width) / 2;
|
||||
y = (pos / Dungeon.level.width()) * DungeonTilemap.SIZE + (DungeonTilemap.SIZE - height) / 2;
|
||||
|
||||
time = TIME_TO_FADE;
|
||||
}
|
||||
|
||||
+9
-8
@@ -39,6 +39,7 @@ import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet;
|
||||
import com.watabou.noosa.audio.Sample;
|
||||
import com.watabou.utils.Callback;
|
||||
import com.watabou.utils.PathFinder;
|
||||
|
||||
import java.util.HashSet;
|
||||
|
||||
@@ -100,9 +101,9 @@ public class WandOfFireblast extends DamageWand {
|
||||
affectedCells.add(cell);
|
||||
if (strength >= 1.5f) {
|
||||
visualCells.remove(cell);
|
||||
spreadFlames(cell + Level.NEIGHBOURS8[left(direction)], strength - 1.5f);
|
||||
spreadFlames(cell + Level.NEIGHBOURS8[direction], strength - 1.5f);
|
||||
spreadFlames(cell + Level.NEIGHBOURS8[right(direction)], strength - 1.5f);
|
||||
spreadFlames(cell + PathFinder.NEIGHBOURS8[left(direction)], strength - 1.5f);
|
||||
spreadFlames(cell + PathFinder.NEIGHBOURS8[direction], strength - 1.5f);
|
||||
spreadFlames(cell + PathFinder.NEIGHBOURS8[right(direction)], strength - 1.5f);
|
||||
} else {
|
||||
visualCells.add(cell);
|
||||
}
|
||||
@@ -134,8 +135,8 @@ public class WandOfFireblast extends DamageWand {
|
||||
int maxDist = (int)(4 * Math.pow(1.5,(chargesPerCast()-1)));
|
||||
int dist = Math.min(bolt.dist, maxDist);
|
||||
|
||||
for (int i = 0; i < Level.NEIGHBOURS8.length; i++){
|
||||
if (bolt.sourcePos+Level.NEIGHBOURS8[i] == bolt.path.get(1)){
|
||||
for (int i = 0; i < PathFinder.NEIGHBOURS8.length; i++){
|
||||
if (bolt.sourcePos+PathFinder.NEIGHBOURS8[i] == bolt.path.get(1)){
|
||||
direction = i;
|
||||
break;
|
||||
}
|
||||
@@ -146,9 +147,9 @@ public class WandOfFireblast extends DamageWand {
|
||||
strength--; //as we start at dist 1, not 0.
|
||||
affectedCells.add(c);
|
||||
if (strength > 1) {
|
||||
spreadFlames(c + Level.NEIGHBOURS8[left(direction)], strength - 1);
|
||||
spreadFlames(c + Level.NEIGHBOURS8[direction], strength - 1);
|
||||
spreadFlames(c + Level.NEIGHBOURS8[right(direction)], strength - 1);
|
||||
spreadFlames(c + PathFinder.NEIGHBOURS8[left(direction)], strength - 1);
|
||||
spreadFlames(c + PathFinder.NEIGHBOURS8[direction], strength - 1);
|
||||
spreadFlames(c + PathFinder.NEIGHBOURS8[right(direction)], strength - 1);
|
||||
} else {
|
||||
visualCells.add(c);
|
||||
}
|
||||
|
||||
+18
-20
@@ -33,9 +33,11 @@ import com.shatteredpixel.shatteredpixeldungeon.levels.traps.LightningTrap;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.mechanics.Ballistica;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.utils.BArray;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.utils.GLog;
|
||||
import com.watabou.noosa.Camera;
|
||||
import com.watabou.utils.Callback;
|
||||
import com.watabou.utils.PathFinder;
|
||||
import com.watabou.utils.Random;
|
||||
|
||||
import java.util.ArrayList;
|
||||
@@ -94,28 +96,24 @@ public class WandOfLightning extends DamageWand {
|
||||
|
||||
affected.add( ch );
|
||||
|
||||
for (int i : Level.NEIGHBOURS8) {
|
||||
int cell = ch.pos + i;
|
||||
int dist;
|
||||
if (Level.water[ch.pos] && !ch.flying)
|
||||
dist = 2;
|
||||
else
|
||||
dist = 1;
|
||||
|
||||
Char n = Actor.findChar( cell );
|
||||
if (n != null && !affected.contains( n )) {
|
||||
arcs.add(new Lightning.Arc(ch.pos, n.pos));
|
||||
arc(n);
|
||||
}
|
||||
}
|
||||
|
||||
if (Level.water[ch.pos] && !ch.flying){
|
||||
for (int i : Level.NEIGHBOURS8DIST2) {
|
||||
int cell = ch.pos + i;
|
||||
//player can only be hit by lightning from an adjacent enemy.
|
||||
if (!Level.insideMap(cell) || Actor.findChar(cell) == Dungeon.hero) continue;
|
||||
|
||||
Char n = Actor.findChar( ch.pos + i );
|
||||
if (n != null && !affected.contains( n )) {
|
||||
arcs.add(new Lightning.Arc(ch.pos, n.pos));
|
||||
arc(n);
|
||||
PathFinder.buildDistanceMap( ch.pos, BArray.not( Level.solid, null ), dist );
|
||||
for (int i = 0; i < PathFinder.distance.length; i++) {
|
||||
if (PathFinder.distance[i] < Integer.MAX_VALUE){
|
||||
Char n = Actor.findChar( i );
|
||||
if (n == Dungeon.hero && PathFinder.distance[i] > 1)
|
||||
//the hero is only zapped if they are adjacent
|
||||
continue;
|
||||
else if (n != null && !affected.contains( n )) {
|
||||
arcs.add(new Lightning.Arc(ch.pos, n.pos));
|
||||
arc(n);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+3
-3
@@ -41,8 +41,10 @@ import com.shatteredpixel.shatteredpixeldungeon.levels.Terrain;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.mechanics.Ballistica;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.utils.BArray;
|
||||
import com.watabou.noosa.audio.Sample;
|
||||
import com.watabou.utils.Callback;
|
||||
import com.watabou.utils.PathFinder;
|
||||
import com.watabou.utils.PointF;
|
||||
import com.watabou.utils.Random;
|
||||
|
||||
@@ -100,10 +102,8 @@ public class WandOfPrismaticLight extends DamageWand {
|
||||
private void affectMap(Ballistica beam){
|
||||
boolean noticed = false;
|
||||
for (int c: beam.subPath(0, beam.dist)){
|
||||
for (int n : Level.NEIGHBOURS9DIST2){
|
||||
for (int n : PathFinder.NEIGHBOURS9){
|
||||
int cell = c+n;
|
||||
if (!Level.insideMap(cell))
|
||||
continue;
|
||||
|
||||
if (Level.discoverable[cell])
|
||||
Dungeon.level.mapped[cell] = true;
|
||||
|
||||
+11
-10
@@ -43,6 +43,7 @@ import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet;
|
||||
import com.watabou.noosa.audio.Sample;
|
||||
import com.watabou.utils.Callback;
|
||||
import com.watabou.utils.ColorMath;
|
||||
import com.watabou.utils.PathFinder;
|
||||
import com.watabou.utils.Random;
|
||||
|
||||
import java.util.ArrayList;
|
||||
@@ -110,9 +111,9 @@ public class WandOfRegrowth extends Wand {
|
||||
if (strength >= 0 && Level.passable[cell] && !Level.losBlocking[cell]){
|
||||
affectedCells.add(cell);
|
||||
if (strength >= 1.5f) {
|
||||
spreadRegrowth(cell + Level.NEIGHBOURS8[left(direction)], strength - 1.5f);
|
||||
spreadRegrowth(cell + Level.NEIGHBOURS8[direction], strength - 1.5f);
|
||||
spreadRegrowth(cell + Level.NEIGHBOURS8[right(direction)], strength-1.5f);
|
||||
spreadRegrowth(cell + PathFinder.NEIGHBOURS8[left(direction)], strength - 1.5f);
|
||||
spreadRegrowth(cell + PathFinder.NEIGHBOURS8[direction], strength - 1.5f);
|
||||
spreadRegrowth(cell + PathFinder.NEIGHBOURS8[right(direction)], strength-1.5f);
|
||||
} else {
|
||||
visualCells.add(cell);
|
||||
}
|
||||
@@ -187,8 +188,8 @@ public class WandOfRegrowth extends Wand {
|
||||
int maxDist = Math.round(1.2f + chargesPerCast()*.8f);
|
||||
int dist = Math.min(bolt.dist, maxDist);
|
||||
|
||||
for (int i = 0; i < Level.NEIGHBOURS8.length; i++){
|
||||
if (bolt.sourcePos+Level.NEIGHBOURS8[i] == bolt.path.get(1)){
|
||||
for (int i = 0; i < PathFinder.NEIGHBOURS8.length; i++){
|
||||
if (bolt.sourcePos+PathFinder.NEIGHBOURS8[i] == bolt.path.get(1)){
|
||||
direction = i;
|
||||
break;
|
||||
}
|
||||
@@ -199,9 +200,9 @@ public class WandOfRegrowth extends Wand {
|
||||
strength--; //as we start at dist 1, not 0.
|
||||
if (!Level.losBlocking[c]) {
|
||||
affectedCells.add(c);
|
||||
spreadRegrowth(c + Level.NEIGHBOURS8[left(direction)], strength - 1);
|
||||
spreadRegrowth(c + Level.NEIGHBOURS8[direction], strength - 1);
|
||||
spreadRegrowth(c + Level.NEIGHBOURS8[right(direction)], strength - 1);
|
||||
spreadRegrowth(c + PathFinder.NEIGHBOURS8[left(direction)], strength - 1);
|
||||
spreadRegrowth(c + PathFinder.NEIGHBOURS8[direction], strength - 1);
|
||||
spreadRegrowth(c + PathFinder.NEIGHBOURS8[right(direction)], strength - 1);
|
||||
} else {
|
||||
visualCells.add(c);
|
||||
}
|
||||
@@ -254,7 +255,7 @@ public class WandOfRegrowth extends Wand {
|
||||
int nDrops = Random.NormalIntRange(2, 8);
|
||||
|
||||
ArrayList<Integer> candidates = new ArrayList<Integer>();
|
||||
for (int i : Level.NEIGHBOURS8){
|
||||
for (int i : PathFinder.NEIGHBOURS8){
|
||||
if (Level.passable[pos+i]){
|
||||
candidates.add(pos+i);
|
||||
}
|
||||
@@ -288,7 +289,7 @@ public class WandOfRegrowth extends Wand {
|
||||
int nSeeds = Random.NormalIntRange(1, 5);
|
||||
|
||||
ArrayList<Integer> candidates = new ArrayList<Integer>();
|
||||
for (int i : Level.NEIGHBOURS8){
|
||||
for (int i : PathFinder.NEIGHBOURS8){
|
||||
if (Level.passable[pos+i]){
|
||||
candidates.add(pos+i);
|
||||
}
|
||||
|
||||
+2
-1
@@ -34,6 +34,7 @@ import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet;
|
||||
import com.watabou.noosa.audio.Sample;
|
||||
import com.watabou.utils.Callback;
|
||||
import com.watabou.utils.PathFinder;
|
||||
|
||||
public class WandOfVenom extends Wand {
|
||||
|
||||
@@ -49,7 +50,7 @@ public class WandOfVenom extends Wand {
|
||||
((VenomGas)venomGas).setStrength(level()+1);
|
||||
GameScene.add(venomGas);
|
||||
|
||||
for (int i : Level.NEIGHBOURS9) {
|
||||
for (int i : PathFinder.NEIGHBOURS9) {
|
||||
Char ch = Actor.findChar(bolt.collisionPos + i);
|
||||
if (ch != null) {
|
||||
processSoulMark(ch, chargesPerCast());
|
||||
|
||||
+3
-2
@@ -28,6 +28,7 @@ import com.shatteredpixel.shatteredpixeldungeon.items.weapon.Weapon;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.levels.Level;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.levels.traps.LightningTrap;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSprite;
|
||||
import com.watabou.utils.PathFinder;
|
||||
import com.watabou.utils.Random;
|
||||
|
||||
import java.util.ArrayList;
|
||||
@@ -83,8 +84,8 @@ public class Shocking extends Weapon.Enchantment {
|
||||
ch.sprite.flash();
|
||||
|
||||
HashSet<Char> ns = new HashSet<Char>();
|
||||
for (int i=0; i < Level.NEIGHBOURS8.length; i++) {
|
||||
Char n = Actor.findChar( ch.pos + Level.NEIGHBOURS8[i] );
|
||||
for (int i = 0; i < PathFinder.NEIGHBOURS8.length; i++) {
|
||||
Char n = Actor.findChar( ch.pos + PathFinder.NEIGHBOURS8[i] );
|
||||
if (n != null && !affected.contains( n )) {
|
||||
arcs.add(new Lightning.Arc(ch.pos, n.pos));
|
||||
hit(n, Random.Int(damage / 2, damage));
|
||||
|
||||
+1
-1
@@ -57,7 +57,7 @@ abstract public class MissileWeapon extends Weapon {
|
||||
@Override
|
||||
public int throwPos(Hero user, int dst) {
|
||||
if (hasEnchant(Projecting.class)
|
||||
&& !Level.solid[dst] && Level.distance(user.pos, dst) <= 4){
|
||||
&& !Level.solid[dst] && Dungeon.level.distance(user.pos, dst) <= 4){
|
||||
return dst;
|
||||
} else {
|
||||
return super.throwPos(user, dst);
|
||||
|
||||
+24
-20
@@ -41,6 +41,7 @@ import com.watabou.noosa.Camera;
|
||||
import com.watabou.noosa.Group;
|
||||
import com.watabou.noosa.audio.Sample;
|
||||
import com.watabou.utils.Bundle;
|
||||
import com.watabou.utils.PathFinder;
|
||||
import com.watabou.utils.Random;
|
||||
|
||||
public class CavesBossLevel extends Level {
|
||||
@@ -51,7 +52,10 @@ public class CavesBossLevel extends Level {
|
||||
|
||||
viewDistance = 6;
|
||||
}
|
||||
|
||||
|
||||
private static final int WIDTH = 32;
|
||||
private static final int HEIGHT = 32;
|
||||
|
||||
private static final int ROOM_LEFT = WIDTH / 2 - 2;
|
||||
private static final int ROOM_RIGHT = WIDTH / 2 + 2;
|
||||
private static final int ROOM_TOP = HEIGHT / 2 - 2;
|
||||
@@ -103,21 +107,21 @@ public class CavesBossLevel extends Level {
|
||||
right = ROOM_RIGHT + 3;
|
||||
} else {
|
||||
left = ROOM_LEFT - 3;
|
||||
right = Random.Int( ROOM_RIGHT + 3, WIDTH - 1 );
|
||||
right = Random.Int( ROOM_RIGHT + 3, width() - 1 );
|
||||
}
|
||||
if (Random.Int( 2 ) == 0) {
|
||||
top = Random.Int( 2, ROOM_TOP - 3 );
|
||||
bottom = ROOM_BOTTOM + 3;
|
||||
} else {
|
||||
top = ROOM_LEFT - 3;
|
||||
bottom = Random.Int( ROOM_TOP + 3, HEIGHT - 1 );
|
||||
bottom = Random.Int( ROOM_TOP + 3, height() - 1 );
|
||||
}
|
||||
|
||||
Painter.fill( this, left, top, right - left + 1, bottom - top + 1, Terrain.EMPTY );
|
||||
|
||||
if (top < topMost) {
|
||||
topMost = top;
|
||||
exit = Random.Int( left, right ) + (top - 1) * WIDTH;
|
||||
exit = Random.Int( left, right ) + (top - 1) * width();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -131,21 +135,21 @@ public class CavesBossLevel extends Level {
|
||||
Painter.fill( this, ROOM_LEFT, ROOM_TOP,
|
||||
ROOM_RIGHT - ROOM_LEFT + 1, 1, Terrain.EMPTY_DECO );
|
||||
|
||||
arenaDoor = Random.Int( ROOM_LEFT, ROOM_RIGHT ) + (ROOM_BOTTOM + 1) * WIDTH;
|
||||
arenaDoor = Random.Int( ROOM_LEFT, ROOM_RIGHT ) + (ROOM_BOTTOM + 1) * width();
|
||||
map[arenaDoor] = Terrain.DOOR;
|
||||
|
||||
entrance = Random.Int( ROOM_LEFT + 1, ROOM_RIGHT - 1 ) +
|
||||
Random.Int( ROOM_TOP + 1, ROOM_BOTTOM - 1 ) * WIDTH;
|
||||
Random.Int( ROOM_TOP + 1, ROOM_BOTTOM - 1 ) * width();
|
||||
map[entrance] = Terrain.ENTRANCE;
|
||||
|
||||
boolean[] patch = Patch.generate( 0.45f, 6 );
|
||||
for (int i=0; i < LENGTH; i++) {
|
||||
boolean[] patch = Patch.generate( this, 0.45f, 6 );
|
||||
for (int i=0; i < length(); i++) {
|
||||
if (map[i] == Terrain.EMPTY && patch[i]) {
|
||||
map[i] = Terrain.WATER;
|
||||
}
|
||||
}
|
||||
|
||||
for (int i=0; i < LENGTH; i++) {
|
||||
for (int i=0; i < length(); i++) {
|
||||
if (map[i] == Terrain.EMPTY && Random.Int( 6 ) == 0) {
|
||||
map[i] = Terrain.INACTIVE_TRAP;
|
||||
Trap t = new ToxicTrap().reveal();
|
||||
@@ -160,7 +164,7 @@ public class CavesBossLevel extends Level {
|
||||
@Override
|
||||
protected void decorate() {
|
||||
|
||||
for (int i=WIDTH + 1; i < LENGTH - WIDTH; i++) {
|
||||
for (int i=width() + 1; i < length() - width(); i++) {
|
||||
if (map[i] == Terrain.EMPTY) {
|
||||
int n = 0;
|
||||
if (map[i+1] == Terrain.WALL) {
|
||||
@@ -169,10 +173,10 @@ public class CavesBossLevel extends Level {
|
||||
if (map[i-1] == Terrain.WALL) {
|
||||
n++;
|
||||
}
|
||||
if (map[i+WIDTH] == Terrain.WALL) {
|
||||
if (map[i+width()] == Terrain.WALL) {
|
||||
n++;
|
||||
}
|
||||
if (map[i-WIDTH] == Terrain.WALL) {
|
||||
if (map[i-width()] == Terrain.WALL) {
|
||||
n++;
|
||||
}
|
||||
if (Random.Int( 8 ) <= n) {
|
||||
@@ -181,7 +185,7 @@ public class CavesBossLevel extends Level {
|
||||
}
|
||||
}
|
||||
|
||||
for (int i=0; i < LENGTH; i++) {
|
||||
for (int i=0; i < length(); i++) {
|
||||
if (map[i] == Terrain.WALL && Random.Int( 8 ) == 0) {
|
||||
map[i] = Terrain.WALL_DECO;
|
||||
}
|
||||
@@ -189,7 +193,7 @@ public class CavesBossLevel extends Level {
|
||||
|
||||
int sign;
|
||||
do {
|
||||
sign = Random.Int( ROOM_LEFT, ROOM_RIGHT ) + Random.Int( ROOM_TOP, ROOM_BOTTOM ) * WIDTH;
|
||||
sign = Random.Int( ROOM_LEFT, ROOM_RIGHT ) + Random.Int( ROOM_TOP, ROOM_BOTTOM ) * width();
|
||||
} while (sign == entrance || map[sign] == Terrain.INACTIVE_TRAP);
|
||||
map[sign] = Terrain.SIGN;
|
||||
}
|
||||
@@ -208,7 +212,7 @@ public class CavesBossLevel extends Level {
|
||||
if (item != null) {
|
||||
int pos;
|
||||
do {
|
||||
pos = Random.IntRange( ROOM_LEFT, ROOM_RIGHT ) + Random.IntRange( ROOM_TOP + 1, ROOM_BOTTOM ) * WIDTH;
|
||||
pos = Random.IntRange( ROOM_LEFT, ROOM_RIGHT ) + Random.IntRange( ROOM_TOP + 1, ROOM_BOTTOM ) * width();
|
||||
} while (pos == entrance || map[pos] == Terrain.SIGN);
|
||||
drop( item, pos ).type = Heap.Type.REMAINS;
|
||||
}
|
||||
@@ -216,9 +220,9 @@ public class CavesBossLevel extends Level {
|
||||
|
||||
@Override
|
||||
public int randomRespawnCell() {
|
||||
int cell = entrance + NEIGHBOURS8[Random.Int(8)];
|
||||
int cell = entrance + PathFinder.NEIGHBOURS8[Random.Int(8)];
|
||||
while (!passable[cell]){
|
||||
cell = entrance + NEIGHBOURS8[Random.Int(8)];
|
||||
cell = entrance + PathFinder.NEIGHBOURS8[Random.Int(8)];
|
||||
}
|
||||
return cell;
|
||||
}
|
||||
@@ -236,7 +240,7 @@ public class CavesBossLevel extends Level {
|
||||
Mob boss = Bestiary.mob( Dungeon.depth );
|
||||
boss.state = boss.WANDERING;
|
||||
do {
|
||||
boss.pos = Random.Int( LENGTH );
|
||||
boss.pos = Random.Int( length() );
|
||||
} while (
|
||||
!passable[boss.pos] ||
|
||||
!outsideEntraceRoom( boss.pos ) ||
|
||||
@@ -272,8 +276,8 @@ public class CavesBossLevel extends Level {
|
||||
}
|
||||
|
||||
private boolean outsideEntraceRoom( int cell ) {
|
||||
int cx = cell % WIDTH;
|
||||
int cy = cell / WIDTH;
|
||||
int cx = cell % width();
|
||||
int cy = cell / width();
|
||||
return cx < ROOM_LEFT-1 || cx > ROOM_RIGHT+1 || cy < ROOM_TOP-1 || cy > ROOM_BOTTOM+1;
|
||||
}
|
||||
|
||||
|
||||
+15
-15
@@ -73,11 +73,11 @@ public class CavesLevel extends RegularLevel {
|
||||
}
|
||||
|
||||
protected boolean[] water() {
|
||||
return Patch.generate( feeling == Feeling.WATER ? 0.60f : 0.45f, 6 );
|
||||
return Patch.generate( this, feeling == Feeling.WATER ? 0.60f : 0.45f, 6 );
|
||||
}
|
||||
|
||||
protected boolean[] grass() {
|
||||
return Patch.generate( feeling == Feeling.GRASS ? 0.55f : 0.35f, 3 );
|
||||
return Patch.generate( this, feeling == Feeling.GRASS ? 0.55f : 0.35f, 3 );
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -121,32 +121,32 @@ public class CavesLevel extends RegularLevel {
|
||||
int s = room.square();
|
||||
|
||||
if (Random.Int( s ) > 8) {
|
||||
int corner = (room.left + 1) + (room.top + 1) * WIDTH;
|
||||
if (map[corner - 1] == Terrain.WALL && map[corner - WIDTH] == Terrain.WALL) {
|
||||
int corner = (room.left + 1) + (room.top + 1) * width();
|
||||
if (map[corner - 1] == Terrain.WALL && map[corner - width()] == Terrain.WALL) {
|
||||
map[corner] = Terrain.WALL;
|
||||
traps.remove(corner);
|
||||
}
|
||||
}
|
||||
|
||||
if (Random.Int( s ) > 8) {
|
||||
int corner = (room.right - 1) + (room.top + 1) * WIDTH;
|
||||
if (map[corner + 1] == Terrain.WALL && map[corner - WIDTH] == Terrain.WALL) {
|
||||
int corner = (room.right - 1) + (room.top + 1) * width();
|
||||
if (map[corner + 1] == Terrain.WALL && map[corner - width()] == Terrain.WALL) {
|
||||
map[corner] = Terrain.WALL;
|
||||
traps.remove(corner);
|
||||
}
|
||||
}
|
||||
|
||||
if (Random.Int( s ) > 8) {
|
||||
int corner = (room.left + 1) + (room.bottom - 1) * WIDTH;
|
||||
if (map[corner - 1] == Terrain.WALL && map[corner + WIDTH] == Terrain.WALL) {
|
||||
int corner = (room.left + 1) + (room.bottom - 1) * width();
|
||||
if (map[corner - 1] == Terrain.WALL && map[corner + width()] == Terrain.WALL) {
|
||||
map[corner] = Terrain.WALL;
|
||||
traps.remove(corner);
|
||||
}
|
||||
}
|
||||
|
||||
if (Random.Int( s ) > 8) {
|
||||
int corner = (room.right - 1) + (room.bottom - 1) * WIDTH;
|
||||
if (map[corner + 1] == Terrain.WALL && map[corner + WIDTH] == Terrain.WALL) {
|
||||
int corner = (room.right - 1) + (room.bottom - 1) * width();
|
||||
if (map[corner + 1] == Terrain.WALL && map[corner + width()] == Terrain.WALL) {
|
||||
map[corner] = Terrain.WALL;
|
||||
traps.remove(corner);
|
||||
}
|
||||
@@ -159,7 +159,7 @@ public class CavesLevel extends RegularLevel {
|
||||
}
|
||||
}
|
||||
|
||||
for (int i=WIDTH + 1; i < LENGTH - WIDTH; i++) {
|
||||
for (int i=width() + 1; i < length() - width(); i++) {
|
||||
if (map[i] == Terrain.EMPTY) {
|
||||
int n = 0;
|
||||
if (map[i+1] == Terrain.WALL) {
|
||||
@@ -168,10 +168,10 @@ public class CavesLevel extends RegularLevel {
|
||||
if (map[i-1] == Terrain.WALL) {
|
||||
n++;
|
||||
}
|
||||
if (map[i+WIDTH] == Terrain.WALL) {
|
||||
if (map[i+width()] == Terrain.WALL) {
|
||||
n++;
|
||||
}
|
||||
if (map[i-WIDTH] == Terrain.WALL) {
|
||||
if (map[i-width()] == Terrain.WALL) {
|
||||
n++;
|
||||
}
|
||||
if (Random.Int( 6 ) <= n) {
|
||||
@@ -180,7 +180,7 @@ public class CavesLevel extends RegularLevel {
|
||||
}
|
||||
}
|
||||
|
||||
for (int i=0; i < LENGTH; i++) {
|
||||
for (int i=0; i < length(); i++) {
|
||||
if (map[i] == Terrain.WALL && Random.Int( 12 ) == 0) {
|
||||
map[i] = Terrain.WALL_DECO;
|
||||
}
|
||||
@@ -261,7 +261,7 @@ public class CavesLevel extends RegularLevel {
|
||||
}
|
||||
|
||||
public static void addCavesVisuals( Level level, Group group ) {
|
||||
for (int i=0; i < LENGTH; i++) {
|
||||
for (int i=0; i < level.length(); i++) {
|
||||
if (level.map[i] == Terrain.WALL_DECO) {
|
||||
group.add( new Vein( i ) );
|
||||
}
|
||||
|
||||
+18
-15
@@ -36,6 +36,7 @@ import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene;
|
||||
import com.watabou.noosa.Group;
|
||||
import com.watabou.noosa.tweeners.AlphaTweener;
|
||||
import com.watabou.utils.Bundle;
|
||||
import com.watabou.utils.PathFinder;
|
||||
import com.watabou.utils.Random;
|
||||
|
||||
public class CityBossLevel extends Level {
|
||||
@@ -49,6 +50,8 @@ public class CityBossLevel extends Level {
|
||||
private static final int HALL_WIDTH = 7;
|
||||
private static final int HALL_HEIGHT = 15;
|
||||
private static final int CHAMBER_HEIGHT = 3;
|
||||
|
||||
private static final int WIDTH = 32;
|
||||
|
||||
private static final int LEFT = (WIDTH - HALL_WIDTH) / 2;
|
||||
private static final int CENTER = LEFT + HALL_WIDTH / 2;
|
||||
@@ -95,8 +98,8 @@ public class CityBossLevel extends Level {
|
||||
|
||||
int y = TOP + 1;
|
||||
while (y < TOP + HALL_HEIGHT) {
|
||||
map[y * WIDTH + CENTER - 2] = Terrain.STATUE_SP;
|
||||
map[y * WIDTH + CENTER + 2] = Terrain.STATUE_SP;
|
||||
map[y * width() + CENTER - 2] = Terrain.STATUE_SP;
|
||||
map[y * width() + CENTER + 2] = Terrain.STATUE_SP;
|
||||
y += 2;
|
||||
}
|
||||
|
||||
@@ -107,17 +110,17 @@ public class CityBossLevel extends Level {
|
||||
map[i] = Terrain.EMPTY_SP;
|
||||
}
|
||||
|
||||
exit = (TOP - 1) * WIDTH + CENTER;
|
||||
exit = (TOP - 1) * width() + CENTER;
|
||||
map[exit] = Terrain.LOCKED_EXIT;
|
||||
|
||||
arenaDoor = (TOP + HALL_HEIGHT) * WIDTH + CENTER;
|
||||
arenaDoor = (TOP + HALL_HEIGHT) * width() + CENTER;
|
||||
map[arenaDoor] = Terrain.DOOR;
|
||||
|
||||
Painter.fill( this, LEFT, TOP + HALL_HEIGHT + 1, HALL_WIDTH, CHAMBER_HEIGHT, Terrain.EMPTY );
|
||||
Painter.fill( this, LEFT, TOP + HALL_HEIGHT + 1, 1, CHAMBER_HEIGHT, Terrain.BOOKSHELF );
|
||||
Painter.fill( this, LEFT + HALL_WIDTH - 1, TOP + HALL_HEIGHT + 1, 1, CHAMBER_HEIGHT, Terrain.BOOKSHELF );
|
||||
|
||||
entrance = (TOP + HALL_HEIGHT + 2 + Random.Int( CHAMBER_HEIGHT - 1 )) * WIDTH + LEFT + (/*1 +*/ Random.Int( HALL_WIDTH-2 ));
|
||||
entrance = (TOP + HALL_HEIGHT + 2 + Random.Int( CHAMBER_HEIGHT - 1 )) * width() + LEFT + (/*1 +*/ Random.Int( HALL_WIDTH-2 ));
|
||||
map[entrance] = Terrain.ENTRANCE;
|
||||
|
||||
return true;
|
||||
@@ -126,7 +129,7 @@ public class CityBossLevel extends Level {
|
||||
@Override
|
||||
protected void decorate() {
|
||||
|
||||
for (int i=0; i < LENGTH; i++) {
|
||||
for (int i=0; i < length(); i++) {
|
||||
if (map[i] == Terrain.EMPTY && Random.Int( 10 ) == 0) {
|
||||
map[i] = Terrain.EMPTY_DECO;
|
||||
} else if (map[i] == Terrain.WALL && Random.Int( 8 ) == 0) {
|
||||
@@ -134,15 +137,15 @@ public class CityBossLevel extends Level {
|
||||
}
|
||||
}
|
||||
|
||||
int sign = arenaDoor + WIDTH + 1;
|
||||
int sign = arenaDoor + width() + 1;
|
||||
map[sign] = Terrain.SIGN;
|
||||
}
|
||||
|
||||
public static int pedestal( boolean left ) {
|
||||
public int pedestal( boolean left ) {
|
||||
if (left) {
|
||||
return (TOP + HALL_HEIGHT / 2) * WIDTH + CENTER - 2;
|
||||
return (TOP + HALL_HEIGHT / 2) * width() + CENTER - 2;
|
||||
} else {
|
||||
return (TOP + HALL_HEIGHT / 2) * WIDTH + CENTER + 2;
|
||||
return (TOP + HALL_HEIGHT / 2) * width() + CENTER + 2;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -162,7 +165,7 @@ public class CityBossLevel extends Level {
|
||||
do {
|
||||
pos =
|
||||
Random.IntRange( LEFT + 1, LEFT + HALL_WIDTH - 2 ) +
|
||||
Random.IntRange( TOP + HALL_HEIGHT + 1, TOP + HALL_HEIGHT + CHAMBER_HEIGHT ) * WIDTH;
|
||||
Random.IntRange( TOP + HALL_HEIGHT + 1, TOP + HALL_HEIGHT + CHAMBER_HEIGHT ) * width();
|
||||
} while (pos == entrance || map[pos] == Terrain.SIGN);
|
||||
drop( item, pos ).type = Heap.Type.REMAINS;
|
||||
}
|
||||
@@ -170,9 +173,9 @@ public class CityBossLevel extends Level {
|
||||
|
||||
@Override
|
||||
public int randomRespawnCell() {
|
||||
int cell = entrance + NEIGHBOURS8[Random.Int(8)];
|
||||
int cell = entrance + PathFinder.NEIGHBOURS8[Random.Int(8)];
|
||||
while (!passable[cell]){
|
||||
cell = entrance + NEIGHBOURS8[Random.Int(8)];
|
||||
cell = entrance + PathFinder.NEIGHBOURS8[Random.Int(8)];
|
||||
}
|
||||
return cell;
|
||||
}
|
||||
@@ -191,7 +194,7 @@ public class CityBossLevel extends Level {
|
||||
boss.state = boss.WANDERING;
|
||||
int count = 0;
|
||||
do {
|
||||
boss.pos = Random.Int( LENGTH );
|
||||
boss.pos = Random.Int( length() );
|
||||
} while (
|
||||
!passable[boss.pos] ||
|
||||
!outsideEntraceRoom( boss.pos ) ||
|
||||
@@ -227,7 +230,7 @@ public class CityBossLevel extends Level {
|
||||
}
|
||||
|
||||
private boolean outsideEntraceRoom( int cell ) {
|
||||
return cell / WIDTH < arenaDoor / WIDTH;
|
||||
return cell / width() < arenaDoor / width();
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -68,11 +68,11 @@ public class CityLevel extends RegularLevel {
|
||||
}
|
||||
|
||||
protected boolean[] water() {
|
||||
return Patch.generate( feeling == Feeling.WATER ? 0.65f : 0.45f, 4 );
|
||||
return Patch.generate( this, feeling == Feeling.WATER ? 0.65f : 0.45f, 4 );
|
||||
}
|
||||
|
||||
protected boolean[] grass() {
|
||||
return Patch.generate( feeling == Feeling.GRASS ? 0.60f : 0.40f, 3 );
|
||||
return Patch.generate( this, feeling == Feeling.GRASS ? 0.60f : 0.40f, 3 );
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -107,7 +107,7 @@ public class CityLevel extends RegularLevel {
|
||||
@Override
|
||||
protected void decorate() {
|
||||
|
||||
for (int i=0; i < LENGTH; i++) {
|
||||
for (int i=0; i < length(); i++) {
|
||||
if (map[i] == Terrain.EMPTY && Random.Int( 10 ) == 0) {
|
||||
map[i] = Terrain.EMPTY_DECO;
|
||||
} else if (map[i] == Terrain.WALL && Random.Int( 8 ) == 0) {
|
||||
@@ -167,7 +167,7 @@ public class CityLevel extends RegularLevel {
|
||||
}
|
||||
|
||||
public static void addCityVisuals( Level level, Group group ) {
|
||||
for (int i=0; i < LENGTH; i++) {
|
||||
for (int i=0; i < level.length(); i++) {
|
||||
if (level.map[i] == Terrain.WALL_DECO) {
|
||||
group.add( new Smoke( i ) );
|
||||
}
|
||||
|
||||
+9
-9
@@ -52,22 +52,22 @@ public class DeadEndLevel extends Level {
|
||||
|
||||
for (int i=2; i < SIZE; i++) {
|
||||
for (int j=2; j < SIZE; j++) {
|
||||
map[i * WIDTH + j] = Terrain.EMPTY;
|
||||
map[i * width() + j] = Terrain.EMPTY;
|
||||
}
|
||||
}
|
||||
|
||||
for (int i=1; i <= SIZE; i++) {
|
||||
map[WIDTH + i] =
|
||||
map[WIDTH * SIZE + i] =
|
||||
map[WIDTH * i + 1] =
|
||||
map[WIDTH * i + SIZE] =
|
||||
map[width() + i] =
|
||||
map[width() * SIZE + i] =
|
||||
map[width() * i + 1] =
|
||||
map[width() * i + SIZE] =
|
||||
Terrain.WATER;
|
||||
}
|
||||
|
||||
entrance = SIZE * WIDTH + SIZE / 2 + 1;
|
||||
entrance = SIZE * width() + SIZE / 2 + 1;
|
||||
map[entrance] = Terrain.ENTRANCE;
|
||||
|
||||
map[(SIZE / 2 + 1) * (WIDTH + 1)] = Terrain.SIGN;
|
||||
map[(SIZE / 2 + 1) * (width() + 1)] = Terrain.SIGN;
|
||||
|
||||
exit = 0;
|
||||
|
||||
@@ -76,7 +76,7 @@ public class DeadEndLevel extends Level {
|
||||
|
||||
@Override
|
||||
protected void decorate() {
|
||||
for (int i=0; i < LENGTH; i++) {
|
||||
for (int i=0; i < length(); i++) {
|
||||
if (map[i] == Terrain.EMPTY && Random.Int( 10 ) == 0) {
|
||||
map[i] = Terrain.EMPTY_DECO;
|
||||
} else if (map[i] == Terrain.WALL && Random.Int( 8 ) == 0) {
|
||||
@@ -99,7 +99,7 @@ public class DeadEndLevel extends Level {
|
||||
|
||||
@Override
|
||||
public int randomRespawnCell() {
|
||||
return entrance-WIDTH;
|
||||
return entrance-width();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
+19
-15
@@ -36,6 +36,7 @@ import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene;
|
||||
import com.watabou.noosa.Group;
|
||||
import com.watabou.utils.Bundle;
|
||||
import com.watabou.utils.PathFinder;
|
||||
import com.watabou.utils.Random;
|
||||
|
||||
public class HallsBossLevel extends Level {
|
||||
@@ -46,7 +47,10 @@ public class HallsBossLevel extends Level {
|
||||
|
||||
viewDistance = 3;
|
||||
}
|
||||
|
||||
|
||||
private static final int WIDTH = 32;
|
||||
private static final int HEIGHT = 32;
|
||||
|
||||
private static final int ROOM_LEFT = WIDTH / 2 - 1;
|
||||
private static final int ROOM_RIGHT = WIDTH / 2 + 1;
|
||||
private static final int ROOM_TOP = HEIGHT / 2 - 1;
|
||||
@@ -96,13 +100,13 @@ public class HallsBossLevel extends Level {
|
||||
Painter.fill( this, 2 + i * 4, top, 4, bottom - top + 1, Terrain.EMPTY );
|
||||
|
||||
if (i == 2) {
|
||||
exit = (i * 4 + 3) + (top - 1) * WIDTH ;
|
||||
exit = (i * 4 + 3) + (top - 1) * width() ;
|
||||
}
|
||||
|
||||
for (int j=0; j < 4; j++) {
|
||||
if (Random.Int( 2 ) == 0) {
|
||||
int y = Random.IntRange( top + 1, bottom - 1 );
|
||||
map[i*4+j + y*WIDTH] = Terrain.WALL_DECO;
|
||||
map[i*4+j + y*width()] = Terrain.WALL_DECO;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -115,11 +119,11 @@ public class HallsBossLevel extends Level {
|
||||
ROOM_RIGHT - ROOM_LEFT + 1, ROOM_BOTTOM - ROOM_TOP + 1, Terrain.EMPTY );
|
||||
|
||||
entrance = Random.Int( ROOM_LEFT + 1, ROOM_RIGHT - 1 ) +
|
||||
Random.Int( ROOM_TOP + 1, ROOM_BOTTOM - 1 ) * WIDTH;
|
||||
Random.Int( ROOM_TOP + 1, ROOM_BOTTOM - 1 ) * width();
|
||||
map[entrance] = Terrain.ENTRANCE;
|
||||
|
||||
boolean[] patch = Patch.generate( 0.45f, 6 );
|
||||
for (int i=0; i < LENGTH; i++) {
|
||||
boolean[] patch = Patch.generate( this, 0.45f, 6 );
|
||||
for (int i=0; i < length(); i++) {
|
||||
if (map[i] == Terrain.EMPTY && patch[i]) {
|
||||
map[i] = Terrain.WATER;
|
||||
}
|
||||
@@ -131,7 +135,7 @@ public class HallsBossLevel extends Level {
|
||||
@Override
|
||||
protected void decorate() {
|
||||
|
||||
for (int i=0; i < LENGTH; i++) {
|
||||
for (int i=0; i < length(); i++) {
|
||||
if (map[i] == Terrain.EMPTY && Random.Int( 10 ) == 0) {
|
||||
map[i] = Terrain.EMPTY_DECO;
|
||||
}
|
||||
@@ -152,7 +156,7 @@ public class HallsBossLevel extends Level {
|
||||
if (item != null) {
|
||||
int pos;
|
||||
do {
|
||||
pos = Random.IntRange( ROOM_LEFT, ROOM_RIGHT ) + Random.IntRange( ROOM_TOP + 1, ROOM_BOTTOM ) * WIDTH;
|
||||
pos = Random.IntRange( ROOM_LEFT, ROOM_RIGHT ) + Random.IntRange( ROOM_TOP + 1, ROOM_BOTTOM ) * width();
|
||||
} while (pos == entrance || map[pos] == Terrain.SIGN);
|
||||
drop( item, pos ).type = Heap.Type.REMAINS;
|
||||
}
|
||||
@@ -161,9 +165,9 @@ public class HallsBossLevel extends Level {
|
||||
@Override
|
||||
public int randomRespawnCell() {
|
||||
if (entrance == -1) return entrance;
|
||||
int cell = entrance + NEIGHBOURS8[Random.Int(8)];
|
||||
int cell = entrance + PathFinder.NEIGHBOURS8[Random.Int(8)];
|
||||
while (!passable[cell]){
|
||||
cell = entrance + NEIGHBOURS8[Random.Int(8)];
|
||||
cell = entrance + PathFinder.NEIGHBOURS8[Random.Int(8)];
|
||||
}
|
||||
return cell;
|
||||
}
|
||||
@@ -179,12 +183,12 @@ public class HallsBossLevel extends Level {
|
||||
seal();
|
||||
|
||||
for (int i=ROOM_LEFT-1; i <= ROOM_RIGHT + 1; i++) {
|
||||
doMagic( (ROOM_TOP - 1) * WIDTH + i );
|
||||
doMagic( (ROOM_BOTTOM + 1) * WIDTH + i );
|
||||
doMagic( (ROOM_TOP - 1) * width() + i );
|
||||
doMagic( (ROOM_BOTTOM + 1) * width() + i );
|
||||
}
|
||||
for (int i=ROOM_TOP; i < ROOM_BOTTOM + 1; i++) {
|
||||
doMagic( i * WIDTH + ROOM_LEFT - 1 );
|
||||
doMagic( i * WIDTH + ROOM_RIGHT + 1 );
|
||||
doMagic( i * width() + ROOM_LEFT - 1 );
|
||||
doMagic( i * width() + ROOM_RIGHT + 1 );
|
||||
}
|
||||
doMagic( entrance );
|
||||
GameScene.updateMap();
|
||||
@@ -193,7 +197,7 @@ public class HallsBossLevel extends Level {
|
||||
|
||||
Yog boss = new Yog();
|
||||
do {
|
||||
boss.pos = Random.Int( LENGTH );
|
||||
boss.pos = Random.Int( length() );
|
||||
} while (
|
||||
!passable[boss.pos] ||
|
||||
Dungeon.visible[boss.pos]);
|
||||
|
||||
@@ -48,6 +48,7 @@ import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
|
||||
import com.watabou.noosa.Game;
|
||||
import com.watabou.noosa.Group;
|
||||
import com.watabou.noosa.particles.PixelParticle;
|
||||
import com.watabou.utils.PathFinder;
|
||||
import com.watabou.utils.PointF;
|
||||
import com.watabou.utils.Random;
|
||||
|
||||
@@ -81,11 +82,11 @@ public class HallsLevel extends RegularLevel {
|
||||
}
|
||||
|
||||
protected boolean[] water() {
|
||||
return Patch.generate( feeling == Feeling.WATER ? 0.55f : 0.40f, 6 );
|
||||
return Patch.generate( this, feeling == Feeling.WATER ? 0.55f : 0.40f, 6 );
|
||||
}
|
||||
|
||||
protected boolean[] grass() {
|
||||
return Patch.generate( feeling == Feeling.GRASS ? 0.55f : 0.30f, 3 );
|
||||
return Patch.generate( this, feeling == Feeling.GRASS ? 0.55f : 0.30f, 3 );
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -107,12 +108,12 @@ public class HallsLevel extends RegularLevel {
|
||||
@Override
|
||||
protected void decorate() {
|
||||
|
||||
for (int i=WIDTH + 1; i < LENGTH - WIDTH - 1; i++) {
|
||||
for (int i=width() + 1; i < length() - width() - 1; i++) {
|
||||
if (map[i] == Terrain.EMPTY) {
|
||||
|
||||
int count = 0;
|
||||
for (int j=0; j < NEIGHBOURS8.length; j++) {
|
||||
if ((Terrain.flags[map[i + NEIGHBOURS8[j]]] & Terrain.PASSABLE) > 0) {
|
||||
for (int j=0; j < PathFinder.NEIGHBOURS8.length; j++) {
|
||||
if ((Terrain.flags[map[i + PathFinder.NEIGHBOURS8[j]]] & Terrain.PASSABLE) > 0) {
|
||||
count++;
|
||||
}
|
||||
}
|
||||
@@ -123,7 +124,7 @@ public class HallsLevel extends RegularLevel {
|
||||
|
||||
} else
|
||||
if (map[i] == Terrain.WALL &&
|
||||
map[i-1] != Terrain.WALL_DECO && map[i-WIDTH] != Terrain.WALL_DECO &&
|
||||
map[i-1] != Terrain.WALL_DECO && map[i-width()] != Terrain.WALL_DECO &&
|
||||
Random.Int( 20 ) == 0) {
|
||||
|
||||
map[i] = Terrain.WALL_DECO;
|
||||
@@ -174,7 +175,7 @@ public class HallsLevel extends RegularLevel {
|
||||
}
|
||||
|
||||
public static void addHallsVisuals( Level level, Group group ) {
|
||||
for (int i=0; i < LENGTH; i++) {
|
||||
for (int i=0; i < level.length(); i++) {
|
||||
if (level.map[i] == Terrain.WATER) {
|
||||
group.add( new Stream( i ) );
|
||||
}
|
||||
|
||||
@@ -27,6 +27,7 @@ import com.shatteredpixel.shatteredpixeldungeon.levels.painters.Painter;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
|
||||
import com.watabou.noosa.Group;
|
||||
import com.watabou.utils.Bundle;
|
||||
import com.watabou.utils.PathFinder;
|
||||
import com.watabou.utils.Random;
|
||||
|
||||
import java.util.Arrays;
|
||||
@@ -57,7 +58,7 @@ public class LastLevel extends Level {
|
||||
@Override
|
||||
public void create() {
|
||||
super.create();
|
||||
for (int i=0; i < LENGTH; i++) {
|
||||
for (int i=0; i < length(); i++) {
|
||||
int flags = Terrain.flags[map[i]];
|
||||
if ((flags & Terrain.PIT) != 0){
|
||||
passable[i] = avoid[i] = false;
|
||||
@@ -82,23 +83,23 @@ public class LastLevel extends Level {
|
||||
//Painter.fill( this, 2, 2, SIZE-2, SIZE-2, Terrain.EMPTY );
|
||||
//Painter.fill( this, SIZE/2, SIZE/2, 3, 3, Terrain.EMPTY_SP );
|
||||
|
||||
entrance = SIZE * WIDTH + SIZE / 2 + 1;
|
||||
entrance = SIZE * width() + SIZE / 2 + 1;
|
||||
map[entrance] = Terrain.ENTRANCE;
|
||||
|
||||
pedestal = (SIZE / 2 + 1) * (WIDTH + 1) - 4*WIDTH;
|
||||
pedestal = (SIZE / 2 + 1) * (width() + 1) - 4*width();
|
||||
map[pedestal] = Terrain.PEDESTAL;
|
||||
map[pedestal-1-WIDTH] = map[pedestal+1-WIDTH] = map[pedestal-1+WIDTH] = map[pedestal+1+WIDTH] = Terrain.STATUE_SP;
|
||||
map[pedestal-1-width()] = map[pedestal+1-width()] = map[pedestal-1+width()] = map[pedestal+1+width()] = Terrain.STATUE_SP;
|
||||
|
||||
exit = pedestal;
|
||||
|
||||
int pos = pedestal;
|
||||
|
||||
map[pos-WIDTH] = map[pos-1] = map[pos+1] = map[pos-2] = map[pos+2] = Terrain.WATER;
|
||||
pos+=WIDTH;
|
||||
map[pos-width()] = map[pos-1] = map[pos+1] = map[pos-2] = map[pos+2] = Terrain.WATER;
|
||||
pos+=width();
|
||||
map[pos] = map[pos-2] = map[pos+2] = map[pos-3] = map[pos+3] = Terrain.WATER;
|
||||
pos+=WIDTH;
|
||||
pos+=width();
|
||||
map[pos-3] = map[pos-2] = map[pos-1] = map[pos] = map[pos+1] = map[pos+2] = map[pos+3] = Terrain.WATER;
|
||||
pos+=WIDTH;
|
||||
pos+=width();
|
||||
map[pos-2] = map[pos+2] = Terrain.WATER;
|
||||
|
||||
|
||||
@@ -110,7 +111,7 @@ public class LastLevel extends Level {
|
||||
|
||||
@Override
|
||||
protected void decorate() {
|
||||
for (int i=0; i < LENGTH; i++) {
|
||||
for (int i=0; i < length(); i++) {
|
||||
if (map[i] == Terrain.EMPTY && Random.Int( 10 ) == 0) {
|
||||
map[i] = Terrain.EMPTY_DECO;
|
||||
}
|
||||
@@ -132,9 +133,9 @@ public class LastLevel extends Level {
|
||||
|
||||
@Override
|
||||
public int randomRespawnCell() {
|
||||
int cell = entrance + NEIGHBOURS8[Random.Int(8)];
|
||||
int cell = entrance + PathFinder.NEIGHBOURS8[Random.Int(8)];
|
||||
while (!passable[cell]){
|
||||
cell = entrance + NEIGHBOURS8[Random.Int(8)];
|
||||
cell = entrance + PathFinder.NEIGHBOURS8[Random.Int(8)];
|
||||
}
|
||||
return cell;
|
||||
}
|
||||
@@ -181,7 +182,7 @@ public class LastLevel extends Level {
|
||||
@Override
|
||||
public void restoreFromBundle(Bundle bundle) {
|
||||
super.restoreFromBundle(bundle);
|
||||
for (int i=0; i < LENGTH; i++) {
|
||||
for (int i=0; i < length(); i++) {
|
||||
int flags = Terrain.flags[map[i]];
|
||||
if ((flags & Terrain.PIT) != 0){
|
||||
passable[i] = avoid[i] = false;
|
||||
|
||||
+5
-5
@@ -134,7 +134,7 @@ public class LastShopLevel extends RegularLevel {
|
||||
@Override
|
||||
protected void decorate() {
|
||||
|
||||
for (int i=0; i < LENGTH; i++) {
|
||||
for (int i=0; i < length(); i++) {
|
||||
if (map[i] == Terrain.EMPTY && Random.Int( 10 ) == 0) {
|
||||
|
||||
map[i] = Terrain.EMPTY_DECO;
|
||||
@@ -169,7 +169,7 @@ public class LastShopLevel extends RegularLevel {
|
||||
if (item != null) {
|
||||
int pos;
|
||||
do {
|
||||
pos = roomEntrance.random();
|
||||
pos = pointToCell(roomEntrance.random());
|
||||
} while (pos == entrance || map[pos] == Terrain.SIGN);
|
||||
drop( item, pos ).type = Heap.Type.REMAINS;
|
||||
}
|
||||
@@ -177,7 +177,7 @@ public class LastShopLevel extends RegularLevel {
|
||||
|
||||
@Override
|
||||
public int randomRespawnCell() {
|
||||
return roomEntrance.random();
|
||||
return pointToCell( roomEntrance.random() );
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -216,12 +216,12 @@ public class LastShopLevel extends RegularLevel {
|
||||
|
||||
@Override
|
||||
protected boolean[] water() {
|
||||
return Patch.generate( 0.35f, 4 );
|
||||
return Patch.generate( this, 0.35f, 4 );
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean[] grass() {
|
||||
return Patch.generate( 0.30f, 3 );
|
||||
return Patch.generate( this, 0.30f, 3 );
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -80,6 +80,9 @@ import com.watabou.noosa.Group;
|
||||
import com.watabou.noosa.audio.Sample;
|
||||
import com.watabou.utils.Bundlable;
|
||||
import com.watabou.utils.Bundle;
|
||||
import com.watabou.utils.PathFinder;
|
||||
import com.watabou.utils.Point;
|
||||
import com.watabou.utils.PointF;
|
||||
import com.watabou.utils.Random;
|
||||
import com.watabou.utils.SparseArray;
|
||||
|
||||
@@ -98,32 +101,11 @@ public abstract class Level implements Bundlable {
|
||||
GRASS,
|
||||
DARK
|
||||
}
|
||||
|
||||
public static final int WIDTH = 32;
|
||||
public static final int HEIGHT = 32;
|
||||
public static final int LENGTH = WIDTH * HEIGHT;
|
||||
|
||||
public static final int[] NEIGHBOURS4 = {-WIDTH, +1, +WIDTH, -1};
|
||||
public static final int[] NEIGHBOURS8 = {-WIDTH, +1-WIDTH, +1, +1+WIDTH, +WIDTH, -1+WIDTH, -1, -1-WIDTH};
|
||||
public static final int[] NEIGHBOURS9 = {0, -WIDTH, +1-WIDTH, +1, +1+WIDTH, +WIDTH, -1+WIDTH, -1, -1-WIDTH};
|
||||
|
||||
//make sure to check insideMap() when using these, as there's a risk something may be outside the map
|
||||
public static final int[] NEIGHBOURS8DIST2 = {+2+2*WIDTH, +1+2*WIDTH, 2*WIDTH, -1+2*WIDTH, -2+2*WIDTH,
|
||||
+2+WIDTH, +1+WIDTH, +WIDTH, -1+WIDTH, -2+WIDTH,
|
||||
+2, +1, -1, -2,
|
||||
+2-WIDTH, +1-WIDTH, -WIDTH, -1-WIDTH, -2-WIDTH,
|
||||
+2-2*WIDTH, +1-2*WIDTH, -2*WIDTH, -1-2*WIDTH, -2-2*WIDTH};
|
||||
public static final int[] NEIGHBOURS9DIST2 = {+2+2*WIDTH, +1+2*WIDTH, 2*WIDTH, -1+2*WIDTH, -2+2*WIDTH,
|
||||
+2+WIDTH, +1+WIDTH, +WIDTH, -1+WIDTH, -2+WIDTH,
|
||||
+2, +1, 0, -1, -2,
|
||||
+2-WIDTH, +1-WIDTH, -WIDTH, -1-WIDTH, -2-WIDTH,
|
||||
+2-2*WIDTH, +1-2*WIDTH, -2*WIDTH, -1-2*WIDTH, -2-2*WIDTH};
|
||||
|
||||
protected int width;
|
||||
protected int height;
|
||||
|
||||
protected static final float TIME_TO_RESPAWN = 50;
|
||||
|
||||
public static boolean resizingNeeded;
|
||||
public static int loadedMapSize;
|
||||
|
||||
public int version;
|
||||
public int[] map;
|
||||
@@ -131,19 +113,20 @@ public abstract class Level implements Bundlable {
|
||||
public boolean[] mapped;
|
||||
|
||||
public int viewDistance = Dungeon.isChallenged( Challenges.DARKNESS ) ? 3: 8;
|
||||
|
||||
//FIXME should not be static!
|
||||
public static boolean[] fieldOfView;
|
||||
|
||||
public static boolean[] fieldOfView = new boolean[LENGTH];
|
||||
public static boolean[] passable;
|
||||
public static boolean[] losBlocking;
|
||||
public static boolean[] flamable;
|
||||
public static boolean[] secret;
|
||||
public static boolean[] solid;
|
||||
public static boolean[] avoid;
|
||||
public static boolean[] water;
|
||||
public static boolean[] pit;
|
||||
|
||||
public static boolean[] passable = new boolean[LENGTH];
|
||||
public static boolean[] losBlocking = new boolean[LENGTH];
|
||||
public static boolean[] flamable = new boolean[LENGTH];
|
||||
public static boolean[] secret = new boolean[LENGTH];
|
||||
public static boolean[] solid = new boolean[LENGTH];
|
||||
public static boolean[] avoid = new boolean[LENGTH];
|
||||
public static boolean[] water = new boolean[LENGTH];
|
||||
public static boolean[] pit = new boolean[LENGTH];
|
||||
|
||||
public static boolean[] discoverable = new boolean[LENGTH];
|
||||
public static boolean[] discoverable;
|
||||
|
||||
public Feeling feeling = Feeling.NONE;
|
||||
|
||||
@@ -187,13 +170,22 @@ public abstract class Level implements Bundlable {
|
||||
private static final String FEELING = "feeling";
|
||||
|
||||
public void create() {
|
||||
|
||||
setupSize();
|
||||
PathFinder.setMapSize(width(), height());
|
||||
passable = new boolean[length()];
|
||||
losBlocking = new boolean[length()];
|
||||
flamable = new boolean[length()];
|
||||
secret = new boolean[length()];
|
||||
solid = new boolean[length()];
|
||||
avoid = new boolean[length()];
|
||||
water = new boolean[length()];
|
||||
pit = new boolean[length()];
|
||||
|
||||
resizingNeeded = false;
|
||||
|
||||
map = new int[LENGTH];
|
||||
visited = new boolean[LENGTH];
|
||||
map = new int[length()];
|
||||
visited = new boolean[length()];
|
||||
Arrays.fill( visited, false );
|
||||
mapped = new boolean[LENGTH];
|
||||
mapped = new boolean[length()];
|
||||
Arrays.fill( mapped, false );
|
||||
|
||||
if (!(Dungeon.bossLevel() || Dungeon.depth == 21) /*final shop floor*/) {
|
||||
@@ -282,6 +274,10 @@ public abstract class Level implements Bundlable {
|
||||
createMobs();
|
||||
createItems();
|
||||
}
|
||||
|
||||
protected void setupSize(){
|
||||
width = height = 32;
|
||||
}
|
||||
|
||||
public void reset() {
|
||||
|
||||
@@ -297,6 +293,13 @@ public abstract class Level implements Bundlable {
|
||||
public void restoreFromBundle( Bundle bundle ) {
|
||||
|
||||
version = bundle.getInt( VERSION );
|
||||
|
||||
if (bundle.contains("width") && bundle.contains("height")){
|
||||
width = bundle.getInt("width");
|
||||
height = bundle.getInt("height");
|
||||
} else
|
||||
width = height = 32; //default sizes
|
||||
PathFinder.setMapSize(width(), height());
|
||||
|
||||
mobs = new HashSet<>();
|
||||
heaps = new SparseArray<>();
|
||||
@@ -316,8 +319,6 @@ public abstract class Level implements Bundlable {
|
||||
locked = bundle.getBoolean( LOCKED );
|
||||
|
||||
weakFloorCreated = false;
|
||||
|
||||
adjustMapSize();
|
||||
|
||||
//for pre-0.3.0c saves
|
||||
if (version < 44){
|
||||
@@ -327,9 +328,6 @@ public abstract class Level implements Bundlable {
|
||||
Collection<Bundlable> collection = bundle.getCollection( HEAPS );
|
||||
for (Bundlable h : collection) {
|
||||
Heap heap = (Heap)h;
|
||||
if (resizingNeeded) {
|
||||
heap.pos = adjustPos( heap.pos );
|
||||
}
|
||||
if (!heap.isEmpty())
|
||||
heaps.put( heap.pos, heap );
|
||||
}
|
||||
@@ -337,27 +335,18 @@ public abstract class Level implements Bundlable {
|
||||
collection = bundle.getCollection( PLANTS );
|
||||
for (Bundlable p : collection) {
|
||||
Plant plant = (Plant)p;
|
||||
if (resizingNeeded) {
|
||||
plant.pos = adjustPos( plant.pos );
|
||||
}
|
||||
plants.put( plant.pos, plant );
|
||||
}
|
||||
|
||||
collection = bundle.getCollection( TRAPS );
|
||||
for (Bundlable p : collection) {
|
||||
Trap trap = (Trap)p;
|
||||
if (resizingNeeded) {
|
||||
trap.pos = adjustPos( trap.pos );
|
||||
}
|
||||
traps.put( trap.pos, trap );
|
||||
}
|
||||
|
||||
collection = bundle.getCollection( CUSTOM_TILES );
|
||||
for (Bundlable p : collection) {
|
||||
CustomTileVisual vis = (CustomTileVisual)p;
|
||||
if (resizingNeeded) {
|
||||
//TODO: add proper resizing logic here
|
||||
}
|
||||
customTiles.add( vis );
|
||||
}
|
||||
|
||||
@@ -365,9 +354,6 @@ public abstract class Level implements Bundlable {
|
||||
for (Bundlable m : collection) {
|
||||
Mob mob = (Mob)m;
|
||||
if (mob != null) {
|
||||
if (resizingNeeded) {
|
||||
mob.pos = adjustPos( mob.pos );
|
||||
}
|
||||
mobs.add( mob );
|
||||
}
|
||||
}
|
||||
@@ -389,6 +375,8 @@ public abstract class Level implements Bundlable {
|
||||
@Override
|
||||
public void storeInBundle( Bundle bundle ) {
|
||||
bundle.put( VERSION, Game.versionCode );
|
||||
bundle.put( "width", width );
|
||||
bundle.put( "height", height );
|
||||
bundle.put( MAP, map );
|
||||
bundle.put( VISITED, visited );
|
||||
bundle.put( MAPPED, mapped );
|
||||
@@ -407,43 +395,21 @@ public abstract class Level implements Bundlable {
|
||||
public int tunnelTile() {
|
||||
return feeling == Feeling.CHASM ? Terrain.EMPTY_SP : Terrain.EMPTY;
|
||||
}
|
||||
|
||||
private void adjustMapSize() {
|
||||
// For levels saved before 1.6.3
|
||||
// Seeing as shattered started on 1.7.1 this is never used, but the code may be resused in future.
|
||||
if (map.length < LENGTH) {
|
||||
|
||||
resizingNeeded = true;
|
||||
loadedMapSize = (int)Math.sqrt( map.length );
|
||||
|
||||
int[] map = new int[LENGTH];
|
||||
Arrays.fill( map, Terrain.WALL );
|
||||
|
||||
boolean[] visited = new boolean[LENGTH];
|
||||
Arrays.fill( visited, false );
|
||||
|
||||
boolean[] mapped = new boolean[LENGTH];
|
||||
Arrays.fill( mapped, false );
|
||||
|
||||
for (int i=0; i < loadedMapSize; i++) {
|
||||
System.arraycopy( this.map, i * loadedMapSize, map, i * WIDTH, loadedMapSize );
|
||||
System.arraycopy( this.visited, i * loadedMapSize, visited, i * WIDTH, loadedMapSize );
|
||||
System.arraycopy( this.mapped, i * loadedMapSize, mapped, i * WIDTH, loadedMapSize );
|
||||
}
|
||||
|
||||
this.map = map;
|
||||
this.visited = visited;
|
||||
this.mapped = mapped;
|
||||
|
||||
entrance = adjustPos( entrance );
|
||||
exit = adjustPos( exit );
|
||||
} else {
|
||||
resizingNeeded = false;
|
||||
}
|
||||
|
||||
public int width() {
|
||||
if (width == 0)
|
||||
setupSize();
|
||||
return width;
|
||||
}
|
||||
|
||||
public int adjustPos( int pos ) {
|
||||
return (pos / loadedMapSize) * WIDTH + (pos % loadedMapSize);
|
||||
|
||||
public int height() {
|
||||
if (height == 0)
|
||||
setupSize();
|
||||
return height;
|
||||
}
|
||||
|
||||
public int length() {
|
||||
return width() * height();
|
||||
}
|
||||
|
||||
public String tilesTex() {
|
||||
@@ -481,11 +447,11 @@ public abstract class Level implements Bundlable {
|
||||
} else {
|
||||
visuals.clear();
|
||||
}
|
||||
for (int i=0; i < LENGTH; i++) {
|
||||
for (int i=0; i < length(); i++) {
|
||||
if (pit[i]) {
|
||||
visuals.add( new WindParticle.Wind( i ) );
|
||||
if (i >= WIDTH && water[i-WIDTH]) {
|
||||
visuals.add( new FlowParticle.Flow( i - WIDTH ) );
|
||||
if (i >= width() && water[i-width()]) {
|
||||
visuals.add( new FlowParticle.Flow( i - width() ) );
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -535,7 +501,7 @@ public abstract class Level implements Bundlable {
|
||||
public int randomRespawnCell() {
|
||||
int cell;
|
||||
do {
|
||||
cell = Random.Int( LENGTH );
|
||||
cell = Random.Int( length() );
|
||||
} while (!passable[cell] || Dungeon.visible[cell] || Actor.findChar( cell ) != null);
|
||||
return cell;
|
||||
}
|
||||
@@ -543,7 +509,7 @@ public abstract class Level implements Bundlable {
|
||||
public int randomDestination() {
|
||||
int cell;
|
||||
do {
|
||||
cell = Random.Int( LENGTH );
|
||||
cell = Random.Int( length() );
|
||||
} while (!passable[cell]);
|
||||
return cell;
|
||||
}
|
||||
@@ -577,8 +543,17 @@ public abstract class Level implements Bundlable {
|
||||
}
|
||||
|
||||
protected void buildFlagMaps() {
|
||||
|
||||
passable = new boolean[length()];
|
||||
losBlocking = new boolean[length()];
|
||||
flamable = new boolean[length()];
|
||||
secret = new boolean[length()];
|
||||
solid = new boolean[length()];
|
||||
avoid = new boolean[length()];
|
||||
water = new boolean[length()];
|
||||
pit = new boolean[length()];
|
||||
|
||||
for (int i=0; i < LENGTH; i++) {
|
||||
for (int i=0; i < length(); i++) {
|
||||
int flags = Terrain.flags[map[i]];
|
||||
passable[i] = (flags & Terrain.PASSABLE) != 0;
|
||||
losBlocking[i] = (flags & Terrain.LOS_BLOCKING) != 0;
|
||||
@@ -590,28 +565,28 @@ public abstract class Level implements Bundlable {
|
||||
pit[i] = (flags & Terrain.PIT) != 0;
|
||||
}
|
||||
|
||||
int lastRow = LENGTH - WIDTH;
|
||||
for (int i=0; i < WIDTH; i++) {
|
||||
int lastRow = length() - width();
|
||||
for (int i=0; i < width(); i++) {
|
||||
passable[i] = avoid[i] = false;
|
||||
passable[lastRow + i] = avoid[lastRow + i] = false;
|
||||
}
|
||||
for (int i=WIDTH; i < lastRow; i += WIDTH) {
|
||||
for (int i=width(); i < lastRow; i += width()) {
|
||||
passable[i] = avoid[i] = false;
|
||||
passable[i + WIDTH-1] = avoid[i + WIDTH-1] = false;
|
||||
passable[i + width()-1] = avoid[i + width()-1] = false;
|
||||
}
|
||||
|
||||
for (int i=WIDTH; i < LENGTH - WIDTH; i++) {
|
||||
for (int i=width(); i < length() - width(); i++) {
|
||||
|
||||
if (water[i]) {
|
||||
map[i] = getWaterTile( i );
|
||||
}
|
||||
|
||||
if (pit[i]) {
|
||||
if (!pit[i - WIDTH]) {
|
||||
int c = map[i - WIDTH];
|
||||
if (!pit[i - width()]) {
|
||||
int c = map[i - width()];
|
||||
if (c == Terrain.EMPTY_SP || c == Terrain.STATUE_SP) {
|
||||
map[i] = Terrain.CHASM_FLOOR_SP;
|
||||
} else if (water[i - WIDTH]) {
|
||||
} else if (water[i - width()]) {
|
||||
map[i] = Terrain.CHASM_WATER;
|
||||
} else if ((Terrain.flags[c] & Terrain.UNSTITCHABLE) != 0) {
|
||||
map[i] = Terrain.CHASM_WALL;
|
||||
@@ -625,8 +600,8 @@ public abstract class Level implements Bundlable {
|
||||
|
||||
private int getWaterTile( int pos ) {
|
||||
int t = Terrain.WATER_TILES;
|
||||
for (int j=0; j < NEIGHBOURS4.length; j++) {
|
||||
if ((Terrain.flags[map[pos + NEIGHBOURS4[j]]] & Terrain.UNSTITCHABLE) != 0) {
|
||||
for (int j=0; j < PathFinder.NEIGHBOURS4.length; j++) {
|
||||
if ((Terrain.flags[map[pos + PathFinder.NEIGHBOURS4[j]]] & Terrain.UNSTITCHABLE) != 0) {
|
||||
t += 1 << j;
|
||||
}
|
||||
}
|
||||
@@ -640,8 +615,8 @@ public abstract class Level implements Bundlable {
|
||||
|
||||
} else {
|
||||
boolean flood = false;
|
||||
for (int j=0; j < NEIGHBOURS4.length; j++) {
|
||||
if (water[pos + NEIGHBOURS4[j]]) {
|
||||
for (int j = 0; j < PathFinder.NEIGHBOURS4.length; j++) {
|
||||
if (water[pos + PathFinder.NEIGHBOURS4[j]]) {
|
||||
flood = true;
|
||||
break;
|
||||
}
|
||||
@@ -655,13 +630,15 @@ public abstract class Level implements Bundlable {
|
||||
}
|
||||
|
||||
protected void cleanWalls() {
|
||||
for (int i=0; i < LENGTH; i++) {
|
||||
discoverable = new boolean[length()];
|
||||
|
||||
for (int i=0; i < length(); i++) {
|
||||
|
||||
boolean d = false;
|
||||
|
||||
for (int j=0; j < NEIGHBOURS9.length; j++) {
|
||||
int n = i + NEIGHBOURS9[j];
|
||||
if (n >= 0 && n < LENGTH && map[n] != Terrain.WALL && map[n] != Terrain.WALL_DECO) {
|
||||
for (int j=0; j < PathFinder.NEIGHBOURS9.length; j++) {
|
||||
int n = i + PathFinder.NEIGHBOURS9[j];
|
||||
if (n >= 0 && n < length() && map[n] != Terrain.WALL && map[n] != Terrain.WALL_DECO) {
|
||||
d = true;
|
||||
break;
|
||||
}
|
||||
@@ -670,9 +647,9 @@ public abstract class Level implements Bundlable {
|
||||
if (d) {
|
||||
d = false;
|
||||
|
||||
for (int j=0; j < NEIGHBOURS9.length; j++) {
|
||||
int n = i + NEIGHBOURS9[j];
|
||||
if (n >= 0 && n < LENGTH && !pit[n]) {
|
||||
for (int j=0; j < PathFinder.NEIGHBOURS9.length; j++) {
|
||||
int n = i + PathFinder.NEIGHBOURS9[j];
|
||||
if (n >= 0 && n < length() && !pit[n]) {
|
||||
d = true;
|
||||
break;
|
||||
}
|
||||
@@ -727,7 +704,7 @@ public abstract class Level implements Bundlable {
|
||||
Dungeon.hero.buff(AlchemistsToolkit.alchemy.class) != null && Dungeon.hero.buff(AlchemistsToolkit.alchemy.class).isCursed())) {
|
||||
int n;
|
||||
do {
|
||||
n = cell + NEIGHBOURS8[Random.Int( 8 )];
|
||||
n = cell + PathFinder.NEIGHBOURS8[Random.Int( 8 )];
|
||||
} while (map[n] != Terrain.EMPTY_SP);
|
||||
cell = n;
|
||||
}
|
||||
@@ -750,7 +727,7 @@ public abstract class Level implements Bundlable {
|
||||
|
||||
int n;
|
||||
do {
|
||||
n = cell + Level.NEIGHBOURS8[Random.Int( 8 )];
|
||||
n = cell + PathFinder.NEIGHBOURS8[Random.Int( 8 )];
|
||||
} while (!Level.passable[n] && !Level.avoid[n]);
|
||||
return drop( item, n );
|
||||
|
||||
@@ -920,16 +897,16 @@ public abstract class Level implements Bundlable {
|
||||
}
|
||||
|
||||
public boolean[] updateFieldOfView( Char c ) {
|
||||
|
||||
fieldOfView = new boolean[length()];
|
||||
|
||||
int cx = c.pos % WIDTH;
|
||||
int cy = c.pos / WIDTH;
|
||||
int cx = c.pos % width();
|
||||
int cy = c.pos / width();
|
||||
|
||||
boolean sighted = c.buff( Blindness.class ) == null && c.buff( Shadows.class ) == null
|
||||
&& c.buff( TimekeepersHourglass.timeStasis.class ) == null && c.isAlive();
|
||||
if (sighted) {
|
||||
ShadowCaster.castShadow( cx, cy, fieldOfView, c.viewDistance );
|
||||
} else {
|
||||
Arrays.fill( fieldOfView, false );
|
||||
}
|
||||
|
||||
int sense = 1;
|
||||
@@ -942,17 +919,17 @@ public abstract class Level implements Bundlable {
|
||||
if ((sighted && sense > 1) || !sighted) {
|
||||
|
||||
int ax = Math.max( 0, cx - sense );
|
||||
int bx = Math.min( cx + sense, WIDTH - 1 );
|
||||
int bx = Math.min( cx + sense, width() - 1 );
|
||||
int ay = Math.max( 0, cy - sense );
|
||||
int by = Math.min( cy + sense, HEIGHT - 1 );
|
||||
int by = Math.min( cy + sense, height() - 1 );
|
||||
|
||||
int len = bx - ax + 1;
|
||||
int pos = ax + ay * WIDTH;
|
||||
for (int y = ay; y <= by; y++, pos+=WIDTH) {
|
||||
int pos = ax + ay * width();
|
||||
for (int y = ay; y <= by; y++, pos+=width()) {
|
||||
Arrays.fill( fieldOfView, pos, pos + len, true );
|
||||
}
|
||||
|
||||
for (int i=0; i < LENGTH; i++) {
|
||||
for (int i=0; i < length(); i++) {
|
||||
fieldOfView[i] &= discoverable[i];
|
||||
}
|
||||
}
|
||||
@@ -964,12 +941,12 @@ public abstract class Level implements Bundlable {
|
||||
fieldOfView[p] = true;
|
||||
fieldOfView[p + 1] = true;
|
||||
fieldOfView[p - 1] = true;
|
||||
fieldOfView[p + WIDTH + 1] = true;
|
||||
fieldOfView[p + WIDTH - 1] = true;
|
||||
fieldOfView[p - WIDTH + 1] = true;
|
||||
fieldOfView[p - WIDTH - 1] = true;
|
||||
fieldOfView[p + WIDTH] = true;
|
||||
fieldOfView[p - WIDTH] = true;
|
||||
fieldOfView[p + width() + 1] = true;
|
||||
fieldOfView[p + width() - 1] = true;
|
||||
fieldOfView[p - width() + 1] = true;
|
||||
fieldOfView[p - width() - 1] = true;
|
||||
fieldOfView[p + width()] = true;
|
||||
fieldOfView[p - width()] = true;
|
||||
}
|
||||
} else if (c == Dungeon.hero && ((Hero)c).heroClass == HeroClass.HUNTRESS) {
|
||||
for (Mob mob : mobs) {
|
||||
@@ -978,12 +955,12 @@ public abstract class Level implements Bundlable {
|
||||
fieldOfView[p] = true;
|
||||
fieldOfView[p + 1] = true;
|
||||
fieldOfView[p - 1] = true;
|
||||
fieldOfView[p + WIDTH + 1] = true;
|
||||
fieldOfView[p + WIDTH - 1] = true;
|
||||
fieldOfView[p - WIDTH + 1] = true;
|
||||
fieldOfView[p - WIDTH - 1] = true;
|
||||
fieldOfView[p + WIDTH] = true;
|
||||
fieldOfView[p - WIDTH] = true;
|
||||
fieldOfView[p + width() + 1] = true;
|
||||
fieldOfView[p + width() - 1] = true;
|
||||
fieldOfView[p - width() + 1] = true;
|
||||
fieldOfView[p - width() - 1] = true;
|
||||
fieldOfView[p + width()] = true;
|
||||
fieldOfView[p - width()] = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -993,12 +970,12 @@ public abstract class Level implements Bundlable {
|
||||
fieldOfView[p] = true;
|
||||
fieldOfView[p + 1] = true;
|
||||
fieldOfView[p - 1] = true;
|
||||
fieldOfView[p + WIDTH + 1] = true;
|
||||
fieldOfView[p + WIDTH - 1] = true;
|
||||
fieldOfView[p - WIDTH + 1] = true;
|
||||
fieldOfView[p - WIDTH - 1] = true;
|
||||
fieldOfView[p + WIDTH] = true;
|
||||
fieldOfView[p - WIDTH] = true;
|
||||
fieldOfView[p + width() + 1] = true;
|
||||
fieldOfView[p + width() - 1] = true;
|
||||
fieldOfView[p - width() + 1] = true;
|
||||
fieldOfView[p - width() - 1] = true;
|
||||
fieldOfView[p + width()] = true;
|
||||
fieldOfView[p - width()] = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1010,27 +987,34 @@ public abstract class Level implements Bundlable {
|
||||
return fieldOfView;
|
||||
}
|
||||
|
||||
public static int distance( int a, int b ) {
|
||||
int ax = a % WIDTH;
|
||||
int ay = a / WIDTH;
|
||||
int bx = b % WIDTH;
|
||||
int by = b / WIDTH;
|
||||
public int distance( int a, int b ) {
|
||||
int ax = a % width();
|
||||
int ay = a / width();
|
||||
int bx = b % width();
|
||||
int by = b / width();
|
||||
return Math.max( Math.abs( ax - bx ), Math.abs( ay - by ) );
|
||||
}
|
||||
|
||||
public static boolean adjacent( int a, int b ) {
|
||||
int diff = Math.abs( a - b );
|
||||
return diff == 1 || diff == WIDTH || diff == WIDTH + 1 || diff == WIDTH - 1;
|
||||
public boolean adjacent( int a, int b ) {
|
||||
return distance( a, b ) == 1;
|
||||
}
|
||||
|
||||
//returns true if the input is a valid tile within the level
|
||||
public static boolean insideMap( int tile ){
|
||||
public boolean insideMap( int tile ){
|
||||
//outside map array
|
||||
return !((tile <= -1 || tile >= LENGTH) ||
|
||||
return !((tile < 0 || tile >= length()) ||
|
||||
//top and bottom row
|
||||
(tile <= 31 || tile >= LENGTH - WIDTH) ||
|
||||
(tile < width() || tile >= length() - width()) ||
|
||||
//left and right column
|
||||
(tile % WIDTH == 0 || tile % WIDTH == 31));
|
||||
(tile % width() == 0 || tile % width() == width()-1));
|
||||
}
|
||||
|
||||
public Point cellToPoint( int cell ){
|
||||
return new Point(cell % width(), cell / width());
|
||||
}
|
||||
|
||||
public int pointToCell( Point p ){
|
||||
return p.x + p.y*width();
|
||||
}
|
||||
|
||||
public String tileName( int tile ) {
|
||||
|
||||
@@ -20,19 +20,20 @@
|
||||
*/
|
||||
package com.shatteredpixel.shatteredpixeldungeon.levels;
|
||||
|
||||
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
|
||||
import com.watabou.utils.Random;
|
||||
|
||||
public class Patch {
|
||||
|
||||
private static boolean[] cur = new boolean[Level.LENGTH];
|
||||
private static boolean[] off = new boolean[Level.LENGTH];
|
||||
|
||||
public static boolean[] generate( float seed, int nGen ) {
|
||||
public static boolean[] generate( Level level, float seed, int nGen ) {
|
||||
|
||||
int w = Level.WIDTH;
|
||||
int h = Level.HEIGHT;
|
||||
int w = level.width();
|
||||
int h = level.width();
|
||||
|
||||
boolean[] cur = new boolean[level.length()];
|
||||
boolean[] off = new boolean[level.length()];
|
||||
|
||||
for (int i=0; i < Level.LENGTH; i++) {
|
||||
for (int i=0; i < level.length(); i++) {
|
||||
off[i] = Random.Float() < seed;
|
||||
}
|
||||
|
||||
|
||||
+11
-10
@@ -44,6 +44,7 @@ import com.watabou.noosa.Group;
|
||||
import com.watabou.noosa.audio.Sample;
|
||||
import com.watabou.utils.Bundlable;
|
||||
import com.watabou.utils.Bundle;
|
||||
import com.watabou.utils.PathFinder;
|
||||
import com.watabou.utils.Random;
|
||||
|
||||
import java.util.ArrayList;
|
||||
@@ -175,13 +176,13 @@ public class PrisonBossLevel extends Level {
|
||||
if (ch == Dungeon.hero){
|
||||
//hero enters tengu's chamber
|
||||
if (state == State.START
|
||||
&& ((Room)new Room().set(2, 25, 8, 32)).inside(cell)){
|
||||
&& ((Room)new Room().set(2, 25, 8, 32)).inside(cellToPoint(cell))){
|
||||
progress();
|
||||
}
|
||||
|
||||
//hero finishes the maze
|
||||
else if (state == State.MAZE
|
||||
&& ((Room)new Room().set(4, 0, 7, 4)).inside(cell)){
|
||||
&& ((Room)new Room().set(4, 0, 7, 4)).inside(cellToPoint(cell))){
|
||||
progress();
|
||||
}
|
||||
}
|
||||
@@ -189,7 +190,7 @@ public class PrisonBossLevel extends Level {
|
||||
|
||||
@Override
|
||||
public int randomRespawnCell() {
|
||||
return 5+2*32 + NEIGHBOURS8[Random.Int(8)]; //random cell adjacent to the entrance.
|
||||
return 5+2*32 + PathFinder.NEIGHBOURS8[Random.Int(8)]; //random cell adjacent to the entrance.
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -220,7 +221,7 @@ public class PrisonBossLevel extends Level {
|
||||
}
|
||||
traps.clear();
|
||||
|
||||
for (int i = 0; i < Level.LENGTH; i++){
|
||||
for (int i = 0; i < Dungeon.level.length(); i++){
|
||||
if (map[i] == Terrain.INACTIVE_TRAP) {
|
||||
Trap t = new SpearTrap().reveal();
|
||||
t.active = false;
|
||||
@@ -237,13 +238,13 @@ public class PrisonBossLevel extends Level {
|
||||
cleanWalls();
|
||||
|
||||
exit = entrance = 0;
|
||||
for (int i = 0; i < LENGTH; i ++)
|
||||
for (int i = 0; i < length(); i ++)
|
||||
if (map[i] == Terrain.ENTRANCE)
|
||||
entrance = i;
|
||||
else if (map[i] == Terrain.EXIT)
|
||||
exit = i;
|
||||
|
||||
visited = mapped = new boolean[LENGTH];
|
||||
visited = mapped = new boolean[length()];
|
||||
for (Blob blob: blobs.values()){
|
||||
blob.fullyClear();
|
||||
}
|
||||
@@ -255,19 +256,19 @@ public class PrisonBossLevel extends Level {
|
||||
|
||||
private void clearEntities(Room safeArea){
|
||||
for (Heap heap : heaps.values()){
|
||||
if (safeArea == null || !safeArea.inside(heap.pos)){
|
||||
if (safeArea == null || !safeArea.inside(cellToPoint(heap.pos))){
|
||||
for (Item item : heap.items)
|
||||
storedItems.add(item);
|
||||
heap.destroy();
|
||||
}
|
||||
}
|
||||
for (Mob mob : Dungeon.level.mobs.toArray(new Mob[Dungeon.level.mobs.size()])){
|
||||
if (mob != tengu && (safeArea == null || !safeArea.inside(mob.pos))){
|
||||
if (mob != tengu && (safeArea == null || !safeArea.inside(cellToPoint(mob.pos)))){
|
||||
mob.destroy();
|
||||
}
|
||||
}
|
||||
for (Plant plant : plants.values()){
|
||||
if (safeArea == null || !safeArea.inside(plant.pos)){
|
||||
if (safeArea == null || !safeArea.inside(cellToPoint(plant.pos))){
|
||||
plants.remove(plant.pos);
|
||||
plant.sprite.kill();
|
||||
}
|
||||
@@ -328,7 +329,7 @@ public class PrisonBossLevel extends Level {
|
||||
|
||||
tengu.state = tengu.HUNTING;
|
||||
do {
|
||||
tengu.pos = Random.Int(LENGTH);
|
||||
tengu.pos = Random.Int(length());
|
||||
} while (solid[tengu.pos] || distance(tengu.pos, Dungeon.hero.pos) < 8);
|
||||
GameScene.add(tengu);
|
||||
tengu.notice();
|
||||
|
||||
+13
-13
@@ -66,11 +66,11 @@ public class PrisonLevel extends RegularLevel {
|
||||
}
|
||||
|
||||
protected boolean[] water() {
|
||||
return Patch.generate( feeling == Feeling.WATER ? 0.65f : 0.45f, 4 );
|
||||
return Patch.generate( this, feeling == Feeling.WATER ? 0.65f : 0.45f, 4 );
|
||||
}
|
||||
|
||||
protected boolean[] grass() {
|
||||
return Patch.generate( feeling == Feeling.GRASS ? 0.60f : 0.40f, 3 );
|
||||
return Patch.generate( this, feeling == Feeling.GRASS ? 0.60f : 0.40f, 3 );
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -103,20 +103,20 @@ public class PrisonLevel extends RegularLevel {
|
||||
@Override
|
||||
protected void decorate() {
|
||||
|
||||
for (int i=WIDTH + 1; i < LENGTH - WIDTH - 1; i++) {
|
||||
for (int i=width() + 1; i < length() - width() - 1; i++) {
|
||||
if (map[i] == Terrain.EMPTY) {
|
||||
|
||||
float c = 0.05f;
|
||||
if (map[i + 1] == Terrain.WALL && map[i + WIDTH] == Terrain.WALL) {
|
||||
if (map[i + 1] == Terrain.WALL && map[i + width()] == Terrain.WALL) {
|
||||
c += 0.2f;
|
||||
}
|
||||
if (map[i - 1] == Terrain.WALL && map[i + WIDTH] == Terrain.WALL) {
|
||||
if (map[i - 1] == Terrain.WALL && map[i + width()] == Terrain.WALL) {
|
||||
c += 0.2f;
|
||||
}
|
||||
if (map[i + 1] == Terrain.WALL && map[i - WIDTH] == Terrain.WALL) {
|
||||
if (map[i + 1] == Terrain.WALL && map[i - width()] == Terrain.WALL) {
|
||||
c += 0.2f;
|
||||
}
|
||||
if (map[i - 1] == Terrain.WALL && map[i - WIDTH] == Terrain.WALL) {
|
||||
if (map[i - 1] == Terrain.WALL && map[i - width()] == Terrain.WALL) {
|
||||
c += 0.2f;
|
||||
}
|
||||
|
||||
@@ -126,19 +126,19 @@ public class PrisonLevel extends RegularLevel {
|
||||
}
|
||||
}
|
||||
|
||||
for (int i=0; i < WIDTH; i++) {
|
||||
for (int i=0; i < width(); i++) {
|
||||
if (map[i] == Terrain.WALL &&
|
||||
(map[i + WIDTH] == Terrain.EMPTY || map[i + WIDTH] == Terrain.EMPTY_SP) &&
|
||||
(map[i + width()] == Terrain.EMPTY || map[i + width()] == Terrain.EMPTY_SP) &&
|
||||
Random.Int( 6 ) == 0) {
|
||||
|
||||
map[i] = Terrain.WALL_DECO;
|
||||
}
|
||||
}
|
||||
|
||||
for (int i=WIDTH; i < LENGTH - WIDTH; i++) {
|
||||
for (int i=width(); i < length() - width(); i++) {
|
||||
if (map[i] == Terrain.WALL &&
|
||||
map[i - WIDTH] == Terrain.WALL &&
|
||||
(map[i + WIDTH] == Terrain.EMPTY || map[i + WIDTH] == Terrain.EMPTY_SP) &&
|
||||
map[i - width()] == Terrain.WALL &&
|
||||
(map[i + width()] == Terrain.EMPTY || map[i + width()] == Terrain.EMPTY_SP) &&
|
||||
Random.Int( 3 ) == 0) {
|
||||
|
||||
map[i] = Terrain.WALL_DECO;
|
||||
@@ -178,7 +178,7 @@ public class PrisonLevel extends RegularLevel {
|
||||
}
|
||||
|
||||
public static void addPrisonVisuals(Level level, Group group){
|
||||
for (int i=0; i < LENGTH; i++) {
|
||||
for (int i=0; i < level.length(); i++) {
|
||||
if (level.map[i] == Terrain.WALL_DECO) {
|
||||
group.add( new Torch( i ) );
|
||||
}
|
||||
|
||||
+20
-19
@@ -40,6 +40,7 @@ import com.shatteredpixel.shatteredpixeldungeon.levels.traps.Trap;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.levels.traps.WornTrap;
|
||||
import com.watabou.utils.Bundle;
|
||||
import com.watabou.utils.Graph;
|
||||
import com.watabou.utils.PathFinder;
|
||||
import com.watabou.utils.Random;
|
||||
import com.watabou.utils.Rect;
|
||||
|
||||
@@ -172,7 +173,7 @@ public abstract class RegularLevel extends Level {
|
||||
|
||||
protected void placeSign(){
|
||||
while (true) {
|
||||
int pos = roomEntrance.random();
|
||||
int pos = pointToCell(roomEntrance.random());
|
||||
if (pos != entrance && traps.get(pos) == null && findMob(pos) == null) {
|
||||
map[pos] = Terrain.SIGN;
|
||||
break;
|
||||
@@ -182,8 +183,8 @@ public abstract class RegularLevel extends Level {
|
||||
|
||||
protected boolean initRooms() {
|
||||
|
||||
rooms = new HashSet<Room>();
|
||||
split( new Rect( 0, 0, WIDTH - 1, HEIGHT - 1 ) );
|
||||
rooms = new HashSet<>();
|
||||
split( new Rect( 0, 0, width() - 1, height() - 1 ) );
|
||||
|
||||
if (rooms.size() < 8) {
|
||||
return false;
|
||||
@@ -296,7 +297,7 @@ public abstract class RegularLevel extends Level {
|
||||
|
||||
protected void paintWater() {
|
||||
boolean[] lake = water();
|
||||
for (int i=0; i < LENGTH; i++) {
|
||||
for (int i=0; i < length(); i++) {
|
||||
if (map[i] == Terrain.EMPTY && lake[i]) {
|
||||
map[i] = Terrain.WATER;
|
||||
}
|
||||
@@ -310,18 +311,18 @@ public abstract class RegularLevel extends Level {
|
||||
|
||||
for (Room room : rooms) {
|
||||
if (room.type != Type.NULL && room.type != Type.PASSAGE && room.type != Type.TUNNEL) {
|
||||
grass[(room.left + 1) + (room.top + 1) * WIDTH] = true;
|
||||
grass[(room.right - 1) + (room.top + 1) * WIDTH] = true;
|
||||
grass[(room.left + 1) + (room.bottom - 1) * WIDTH] = true;
|
||||
grass[(room.right - 1) + (room.bottom - 1) * WIDTH] = true;
|
||||
grass[(room.left + 1) + (room.top + 1) * width()] = true;
|
||||
grass[(room.right - 1) + (room.top + 1) * width()] = true;
|
||||
grass[(room.left + 1) + (room.bottom - 1) * width()] = true;
|
||||
grass[(room.right - 1) + (room.bottom - 1) * width()] = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (int i=WIDTH+1; i < LENGTH-WIDTH-1; i++) {
|
||||
for (int i=width()+1; i < length()-width()-1; i++) {
|
||||
if (map[i] == Terrain.EMPTY && grass[i]) {
|
||||
int count = 1;
|
||||
for (int n : NEIGHBOURS8) {
|
||||
for (int n : PathFinder.NEIGHBOURS8) {
|
||||
if (grass[i + n]) {
|
||||
count++;
|
||||
}
|
||||
@@ -342,7 +343,7 @@ public abstract class RegularLevel extends Level {
|
||||
|
||||
LinkedList<Integer> validCells = new LinkedList<Integer>();
|
||||
|
||||
for (int i = 0; i < LENGTH; i ++) {
|
||||
for (int i = 0; i < length(); i ++) {
|
||||
if (map[i] == Terrain.EMPTY){
|
||||
|
||||
if(Dungeon.depth == 1){
|
||||
@@ -477,7 +478,7 @@ public abstract class RegularLevel extends Level {
|
||||
}
|
||||
|
||||
Room.Door d = r.connected.get( n );
|
||||
int door = d.x + d.y * WIDTH;
|
||||
int door = d.x + d.y * width();
|
||||
|
||||
switch (d.type) {
|
||||
case EMPTY:
|
||||
@@ -595,7 +596,7 @@ public abstract class RegularLevel extends Level {
|
||||
Room roomToSpawn = stdRoomIter.next();
|
||||
|
||||
Mob mob = Bestiary.mob( Dungeon.depth );
|
||||
mob.pos = roomToSpawn.random();
|
||||
mob.pos = pointToCell(roomToSpawn.random());
|
||||
|
||||
if (findMob(mob.pos) == null && Level.passable[mob.pos]) {
|
||||
mobsToSpawn--;
|
||||
@@ -604,7 +605,7 @@ public abstract class RegularLevel extends Level {
|
||||
//TODO: perhaps externalize this logic into a method. Do I want to make mobs more likely to clump deeper down?
|
||||
if (mobsToSpawn > 0 && Random.Int(4) == 0){
|
||||
mob = Bestiary.mob( Dungeon.depth );
|
||||
mob.pos = roomToSpawn.random();
|
||||
mob.pos = pointToCell(roomToSpawn.random());
|
||||
|
||||
if (findMob(mob.pos) == null && Level.passable[mob.pos]) {
|
||||
mobsToSpawn--;
|
||||
@@ -631,7 +632,7 @@ public abstract class RegularLevel extends Level {
|
||||
continue;
|
||||
}
|
||||
|
||||
cell = room.random();
|
||||
cell = pointToCell(room.random());
|
||||
if (!Dungeon.visible[cell] && Actor.findChar( cell ) == null && Level.passable[cell]) {
|
||||
return cell;
|
||||
}
|
||||
@@ -651,7 +652,7 @@ public abstract class RegularLevel extends Level {
|
||||
continue;
|
||||
}
|
||||
|
||||
cell = room.random();
|
||||
cell = pointToCell(room.random());
|
||||
if (Level.passable[cell]) {
|
||||
return cell;
|
||||
}
|
||||
@@ -721,7 +722,7 @@ public abstract class RegularLevel extends Level {
|
||||
|
||||
public Room room( int pos ) {
|
||||
for (Room room : rooms) {
|
||||
if (room.type != Type.NULL && room.inside( pos )) {
|
||||
if (room.type != Type.NULL && room.inside( cellToPoint(pos) )) {
|
||||
return room;
|
||||
}
|
||||
}
|
||||
@@ -733,7 +734,7 @@ public abstract class RegularLevel extends Level {
|
||||
while (true) {
|
||||
Room room = randomRoom( Room.Type.STANDARD, 1 );
|
||||
if (room != null) {
|
||||
int pos = room.random();
|
||||
int pos = pointToCell(room.random());
|
||||
if (passable[pos]) {
|
||||
return pos;
|
||||
}
|
||||
@@ -745,7 +746,7 @@ public abstract class RegularLevel extends Level {
|
||||
public int pitCell() {
|
||||
for (Room room : rooms) {
|
||||
if (room.type == Type.PIT) {
|
||||
return room.random();
|
||||
return pointToCell(room.random());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -20,6 +20,7 @@
|
||||
*/
|
||||
package com.shatteredpixel.shatteredpixeldungeon.levels;
|
||||
|
||||
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.ShatteredPixelDungeon;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.levels.painters.AltarPainter;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.levels.painters.ArmoryPainter;
|
||||
@@ -133,14 +134,13 @@ public class Room extends Rect implements Graph.Node, Bundlable {
|
||||
|
||||
public Type type = Type.NULL;
|
||||
|
||||
public int random() {
|
||||
public Point random() {
|
||||
return random( 0 );
|
||||
}
|
||||
|
||||
public int random( int m ) {
|
||||
int x = Random.Int( left + 1 + m, right - m );
|
||||
int y = Random.Int( top + 1 + m, bottom - m );
|
||||
return x + y * Level.WIDTH;
|
||||
public Point random( int m ) {
|
||||
return new Point( Random.Int( left + 1 + m, right - m ),
|
||||
Random.Int( top + 1 + m, bottom - m ));
|
||||
}
|
||||
|
||||
public void addNeigbour( Room other ) {
|
||||
@@ -165,10 +165,8 @@ public class Room extends Rect implements Graph.Node, Bundlable {
|
||||
return connected.values().iterator().next();
|
||||
}
|
||||
|
||||
public boolean inside( int p ) {
|
||||
int x = p % Level.WIDTH;
|
||||
int y = p / Level.WIDTH;
|
||||
return x > left && y > top && x < right && y < bottom;
|
||||
public boolean inside( Point p ) {
|
||||
return p.x > left && p.y > top && p.x < right && p.y < bottom;
|
||||
}
|
||||
|
||||
public Point center() {
|
||||
@@ -176,14 +174,6 @@ public class Room extends Rect implements Graph.Node, Bundlable {
|
||||
(left + right) / 2 + (((right - left) & 1) == 1 ? Random.Int( 2 ) : 0),
|
||||
(top + bottom) / 2 + (((bottom - top) & 1) == 1 ? Random.Int( 2 ) : 0) );
|
||||
}
|
||||
|
||||
public HashSet<Integer> getCells(){
|
||||
HashSet<Point> points = getPoints();
|
||||
HashSet<Integer> cells = new HashSet<>();
|
||||
for( Point point : points)
|
||||
cells.add(point.x + point.y*Level.WIDTH);
|
||||
return cells;
|
||||
}
|
||||
|
||||
// **** Graph.Node interface ****
|
||||
|
||||
|
||||
+11
-10
@@ -34,6 +34,7 @@ import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene;
|
||||
import com.watabou.noosa.Group;
|
||||
import com.watabou.utils.Bundle;
|
||||
import com.watabou.utils.Graph;
|
||||
import com.watabou.utils.PathFinder;
|
||||
import com.watabou.utils.Random;
|
||||
|
||||
import java.util.ArrayList;
|
||||
@@ -159,12 +160,12 @@ public class SewerBossLevel extends RegularLevel {
|
||||
paint();
|
||||
|
||||
//sticks the exit in the room entrance.
|
||||
exit = roomEntrance.top * Level.WIDTH + (roomEntrance.left + roomEntrance.right) / 2;
|
||||
exit = roomEntrance.top * width() + (roomEntrance.left + roomEntrance.right) / 2;
|
||||
map[exit] = Terrain.LOCKED_EXIT;
|
||||
|
||||
//make sure the exit is only visible in the entrance room.
|
||||
int count = 0;
|
||||
for (int i : NEIGHBOURS8){
|
||||
for (int i : PathFinder.NEIGHBOURS8){
|
||||
//exit must have exactly 3 non-wall tiles around it.
|
||||
if (map[exit+i] != Terrain.WALL)
|
||||
count++;
|
||||
@@ -180,23 +181,23 @@ public class SewerBossLevel extends RegularLevel {
|
||||
}
|
||||
|
||||
protected boolean[] water() {
|
||||
return Patch.generate( 0.5f, 5 );
|
||||
return Patch.generate( this, 0.5f, 5 );
|
||||
}
|
||||
|
||||
protected boolean[] grass() {
|
||||
return Patch.generate( 0.40f, 4 );
|
||||
return Patch.generate( this, 0.40f, 4 );
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void decorate() {
|
||||
int start = roomExit.top * WIDTH + roomExit.left + 1;
|
||||
int start = roomExit.top * width() + roomExit.left + 1;
|
||||
int end = start + roomExit.width() - 1;
|
||||
for (int i=start; i < end; i++) {
|
||||
if (i != exit && map[i] == Terrain.WALL) {
|
||||
map[i] = Terrain.WALL_DECO;
|
||||
map[i + WIDTH] = Terrain.WATER;
|
||||
map[i + width()] = Terrain.WATER;
|
||||
} else {
|
||||
map[i + WIDTH] = Terrain.EMPTY;
|
||||
map[i + width()] = Terrain.EMPTY;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -217,7 +218,7 @@ public class SewerBossLevel extends RegularLevel {
|
||||
do {
|
||||
room = Random.element(rooms);
|
||||
} while (room.type != Type.STANDARD);
|
||||
mob.pos = room.random();
|
||||
mob.pos = pointToCell(room.random());
|
||||
mobs.add( mob );
|
||||
}
|
||||
|
||||
@@ -231,7 +232,7 @@ public class SewerBossLevel extends RegularLevel {
|
||||
if (item != null) {
|
||||
int pos;
|
||||
do {
|
||||
pos = roomEntrance.random();
|
||||
pos = pointToCell(roomEntrance.random());
|
||||
} while (pos == entrance || map[pos] == Terrain.SIGN);
|
||||
drop( item, pos ).type = Heap.Type.REMAINS;
|
||||
}
|
||||
@@ -239,7 +240,7 @@ public class SewerBossLevel extends RegularLevel {
|
||||
|
||||
@Override
|
||||
public int randomRespawnCell() {
|
||||
return roomEntrance.random();
|
||||
return pointToCell(roomEntrance.random());
|
||||
}
|
||||
|
||||
|
||||
|
||||
+13
-13
@@ -62,11 +62,11 @@ public class SewerLevel extends RegularLevel {
|
||||
}
|
||||
|
||||
protected boolean[] water() {
|
||||
return Patch.generate( feeling == Feeling.WATER ? 0.60f : 0.45f, 5 );
|
||||
return Patch.generate( this, feeling == Feeling.WATER ? 0.60f : 0.45f, 5 );
|
||||
}
|
||||
|
||||
protected boolean[] grass() {
|
||||
return Patch.generate( feeling == Feeling.GRASS ? 0.60f : 0.40f, 4 );
|
||||
return Patch.generate( this, feeling == Feeling.GRASS ? 0.60f : 0.40f, 4 );
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -90,33 +90,33 @@ public class SewerLevel extends RegularLevel {
|
||||
@Override
|
||||
protected void decorate() {
|
||||
|
||||
for (int i=0; i < WIDTH; i++) {
|
||||
for (int i=0; i < width(); i++) {
|
||||
if (map[i] == Terrain.WALL &&
|
||||
map[i + WIDTH] == Terrain.WATER &&
|
||||
map[i + width()] == Terrain.WATER &&
|
||||
Random.Int( 4 ) == 0) {
|
||||
|
||||
map[i] = Terrain.WALL_DECO;
|
||||
}
|
||||
}
|
||||
|
||||
for (int i=WIDTH; i < LENGTH - WIDTH; i++) {
|
||||
for (int i=width(); i < length() - width(); i++) {
|
||||
if (map[i] == Terrain.WALL &&
|
||||
map[i - WIDTH] == Terrain.WALL &&
|
||||
map[i + WIDTH] == Terrain.WATER &&
|
||||
map[i - width()] == Terrain.WALL &&
|
||||
map[i + width()] == Terrain.WATER &&
|
||||
Random.Int( 2 ) == 0) {
|
||||
|
||||
map[i] = Terrain.WALL_DECO;
|
||||
}
|
||||
}
|
||||
|
||||
for (int i=WIDTH + 1; i < LENGTH - WIDTH - 1; i++) {
|
||||
for (int i=width() + 1; i < length() - width() - 1; i++) {
|
||||
if (map[i] == Terrain.EMPTY) {
|
||||
|
||||
int count =
|
||||
(map[i + 1] == Terrain.WALL ? 1 : 0) +
|
||||
(map[i - 1] == Terrain.WALL ? 1 : 0) +
|
||||
(map[i + WIDTH] == Terrain.WALL ? 1 : 0) +
|
||||
(map[i - WIDTH] == Terrain.WALL ? 1 : 0);
|
||||
(map[i + width()] == Terrain.WALL ? 1 : 0) +
|
||||
(map[i - width()] == Terrain.WALL ? 1 : 0);
|
||||
|
||||
if (Random.Int( 16 ) < count * count) {
|
||||
map[i] = Terrain.EMPTY_DECO;
|
||||
@@ -129,7 +129,7 @@ public class SewerLevel extends RegularLevel {
|
||||
for (Room r : roomEntrance.connected.keySet()){
|
||||
Room.Door d = roomEntrance.connected.get(r);
|
||||
if (d.type == Room.Door.Type.REGULAR)
|
||||
map[d.x + d.y * WIDTH] = Terrain.SECRET_DOOR;
|
||||
map[d.x + d.y * width()] = Terrain.SECRET_DOOR;
|
||||
}
|
||||
|
||||
placeSign();
|
||||
@@ -155,7 +155,7 @@ public class SewerLevel extends RegularLevel {
|
||||
}
|
||||
|
||||
public static void addSewerVisuals( Level level, Group group ) {
|
||||
for (int i=0; i < LENGTH; i++) {
|
||||
for (int i=0; i < level.length(); i++) {
|
||||
if (level.map[i] == Terrain.WALL_DECO) {
|
||||
group.add( new Sink( i ) );
|
||||
}
|
||||
@@ -216,7 +216,7 @@ public class SewerLevel extends RegularLevel {
|
||||
super.update();
|
||||
|
||||
if ((rippleDelay -= Game.elapsed) <= 0) {
|
||||
Ripple ripple = GameScene.ripple( pos + WIDTH );
|
||||
Ripple ripple = GameScene.ripple( pos + Dungeon.level.width() );
|
||||
if (ripple != null) {
|
||||
ripple.y -= DungeonTilemap.SIZE / 2;
|
||||
rippleDelay = Random.Float(0.2f, 0.3f);
|
||||
|
||||
+1
-1
@@ -57,7 +57,7 @@ public class ArmoryPainter extends Painter {
|
||||
for (int i=0; i < n; i++) {
|
||||
int pos;
|
||||
do {
|
||||
pos = room.random();
|
||||
pos = level.pointToCell(room.random());
|
||||
} while (level.map[pos] != Terrain.EMPTY || level.heaps.get( pos ) != null);
|
||||
level.drop( prize( level ), pos );
|
||||
}
|
||||
|
||||
+5
-3
@@ -26,6 +26,7 @@ import com.shatteredpixel.shatteredpixeldungeon.levels.Level;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.levels.Room;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.levels.Terrain;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.levels.traps.FireTrap;
|
||||
import com.watabou.utils.Point;
|
||||
import com.watabou.utils.Random;
|
||||
|
||||
public class BlacksmithPainter extends Painter {
|
||||
@@ -39,7 +40,7 @@ public class BlacksmithPainter extends Painter {
|
||||
for (int i=0; i < 2; i++) {
|
||||
int pos;
|
||||
do {
|
||||
pos = room.random();
|
||||
pos = level.pointToCell(room.random());
|
||||
} while (level.map[pos] != Terrain.EMPTY_SP);
|
||||
level.drop(
|
||||
Generator.random( Random.oneOf(
|
||||
@@ -55,11 +56,12 @@ public class BlacksmithPainter extends Painter {
|
||||
|
||||
Blacksmith npc = new Blacksmith();
|
||||
do {
|
||||
npc.pos = room.random( 1 );
|
||||
npc.pos = level.pointToCell(room.random( 1 ));
|
||||
} while (level.heaps.get( npc.pos ) != null);
|
||||
level.mobs.add( npc );
|
||||
|
||||
for(int cell : room.getCells()) {
|
||||
for(Point p : room.getPoints()) {
|
||||
int cell = level.pointToCell(p);
|
||||
if (level.map[cell] == Terrain.TRAP){
|
||||
level.setTrap(new FireTrap().reveal(), cell);
|
||||
}
|
||||
|
||||
+1
-1
@@ -35,7 +35,7 @@ public class BossExitPainter extends Painter {
|
||||
door.set( Room.Door.Type.REGULAR );
|
||||
}
|
||||
|
||||
level.exit = room.top * Level.WIDTH + (room.left + room.right) / 2;
|
||||
level.exit = room.top * level.width() + (room.left + room.right) / 2;
|
||||
set( level, level.exit, Terrain.LOCKED_EXIT );
|
||||
}
|
||||
|
||||
|
||||
+1
-1
@@ -65,7 +65,7 @@ public class CryptPainter extends Painter {
|
||||
cy = room.top + 2;
|
||||
}
|
||||
|
||||
level.drop( prize( level ), cx + cy * Level.WIDTH ).type = Type.TOMB;
|
||||
level.drop( prize( level ), cx + cy * level.width() ).type = Type.TOMB;
|
||||
}
|
||||
|
||||
private static Item prize( Level level ) {
|
||||
|
||||
+1
-1
@@ -36,7 +36,7 @@ public class EntrancePainter extends Painter {
|
||||
}
|
||||
|
||||
do {
|
||||
level.entrance = room.random(1);
|
||||
level.entrance = level.pointToCell(room.random(1));
|
||||
} while (level.findMob(level.entrance) != null);
|
||||
set( level, level.entrance, Terrain.ENTRANCE );
|
||||
}
|
||||
|
||||
+1
-1
@@ -35,7 +35,7 @@ public class ExitPainter extends Painter {
|
||||
door.set( Room.Door.Type.REGULAR );
|
||||
}
|
||||
|
||||
level.exit = room.random( 1 );
|
||||
level.exit = level.pointToCell(room.random( 1 ));
|
||||
set( level, level.exit, Terrain.EXIT );
|
||||
}
|
||||
|
||||
|
||||
+6
-6
@@ -42,17 +42,17 @@ public class GardenPainter extends Painter {
|
||||
|
||||
if (Dungeon.isChallenged(Challenges.NO_FOOD)) {
|
||||
if (Random.Int(2) == 0){
|
||||
level.plant(new Sungrass.Seed(), room.random());
|
||||
level.plant(new Sungrass.Seed(), level.pointToCell(room.random()));
|
||||
}
|
||||
} else {
|
||||
int bushes = Random.Int(3);
|
||||
if (bushes == 0) {
|
||||
level.plant(new Sungrass.Seed(), room.random());
|
||||
level.plant(new Sungrass.Seed(), level.pointToCell(room.random()));
|
||||
} else if (bushes == 1) {
|
||||
level.plant(new BlandfruitBush.Seed(), room.random());
|
||||
level.plant(new BlandfruitBush.Seed(), level.pointToCell(room.random()));
|
||||
} else if (Random.Int(5) == 0) {
|
||||
level.plant(new Sungrass.Seed(), room.random());
|
||||
level.plant(new BlandfruitBush.Seed(), room.random());
|
||||
level.plant(new Sungrass.Seed(), level.pointToCell(room.random()));
|
||||
level.plant(new BlandfruitBush.Seed(), level.pointToCell(room.random()));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -62,7 +62,7 @@ public class GardenPainter extends Painter {
|
||||
}
|
||||
for (int i=room.top + 1; i < room.bottom; i++) {
|
||||
for (int j=room.left + 1; j < room.right; j++) {
|
||||
light.seed( j + Level.WIDTH * i, 1 );
|
||||
light.seed( level, j + level.width() * i, 1 );
|
||||
}
|
||||
}
|
||||
level.blobs.put( Foliage.class, light );
|
||||
|
||||
+2
-2
@@ -54,14 +54,14 @@ public class LaboratoryPainter extends Painter {
|
||||
set( level, pot, Terrain.ALCHEMY );
|
||||
|
||||
Alchemy alchemy = new Alchemy();
|
||||
alchemy.seed( pot.x + Level.WIDTH * pot.y, 1 );
|
||||
alchemy.seed( level, pot.x + level.width() * pot.y, 1 );
|
||||
level.blobs.put( Alchemy.class, alchemy );
|
||||
|
||||
int n = Random.IntRange( 2, 3 );
|
||||
for (int i=0; i < n; i++) {
|
||||
int pos;
|
||||
do {
|
||||
pos = room.random();
|
||||
pos = level.pointToCell(room.random());
|
||||
} while (
|
||||
level.map[pos] != Terrain.EMPTY_SP ||
|
||||
level.heaps.get( pos ) != null);
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user