v0.6.0: moved decorate functionality in painters

This commit is contained in:
Evan Debenham 2017-05-03 18:05:06 -04:00
parent 21251c66c1
commit 01ed933be2
21 changed files with 611 additions and 533 deletions

View File

@ -32,7 +32,7 @@ import com.shatteredpixel.shatteredpixeldungeon.items.quest.CeremonialCandle;
import com.shatteredpixel.shatteredpixeldungeon.items.quest.CorpseDust; import com.shatteredpixel.shatteredpixeldungeon.items.quest.CorpseDust;
import com.shatteredpixel.shatteredpixeldungeon.items.quest.Embers; import com.shatteredpixel.shatteredpixeldungeon.items.quest.Embers;
import com.shatteredpixel.shatteredpixeldungeon.items.wands.Wand; import com.shatteredpixel.shatteredpixeldungeon.items.wands.Wand;
import com.shatteredpixel.shatteredpixeldungeon.levels.PrisonLevel; import com.shatteredpixel.shatteredpixeldungeon.levels.Level;
import com.shatteredpixel.shatteredpixeldungeon.levels.rooms.Room; import com.shatteredpixel.shatteredpixeldungeon.levels.rooms.Room;
import com.shatteredpixel.shatteredpixeldungeon.levels.rooms.special.MassGraveRoom; import com.shatteredpixel.shatteredpixeldungeon.levels.rooms.special.MassGraveRoom;
import com.shatteredpixel.shatteredpixeldungeon.levels.rooms.special.RotGardenRoom; import com.shatteredpixel.shatteredpixeldungeon.levels.rooms.special.RotGardenRoom;
@ -47,7 +47,6 @@ import com.watabou.utils.Bundle;
import com.watabou.utils.Random; import com.watabou.utils.Random;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection;
public class Wandmaker extends NPC { public class Wandmaker extends NPC {
@ -251,7 +250,7 @@ public class Wandmaker extends NPC {
private static boolean questRoomSpawned; private static boolean questRoomSpawned;
public static void spawnWandmaker( PrisonLevel level, Room room, Collection<Room> rooms ) { public static void spawnWandmaker( Level level, Room room ) {
if (questRoomSpawned) { if (questRoomSpawned) {
questRoomSpawned = false; questRoomSpawned = false;

View File

@ -162,12 +162,6 @@ public class CavesBossLevel extends Level {
} }
} }
return true;
}
@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) { if (map[i] == Terrain.EMPTY) {
int n = 0; int n = 0;
@ -188,7 +182,7 @@ public class CavesBossLevel extends Level {
} }
} }
} }
for (int i=0; i < length() - width(); i++) { for (int i=0; i < length() - width(); i++) {
if (map[i] == Terrain.WALL if (map[i] == Terrain.WALL
&& DungeonTileSheet.floorTile(map[i + width()]) && DungeonTileSheet.floorTile(map[i + width()])
@ -202,6 +196,9 @@ public class CavesBossLevel extends Level {
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); } while (sign == entrance || map[sign] == Terrain.INACTIVE_TRAP);
map[sign] = Terrain.SIGN; map[sign] = Terrain.SIGN;
return true;
} }
@Override @Override

View File

@ -24,10 +24,9 @@ package com.shatteredpixel.shatteredpixeldungeon.levels;
import com.shatteredpixel.shatteredpixeldungeon.Assets; import com.shatteredpixel.shatteredpixeldungeon.Assets;
import com.shatteredpixel.shatteredpixeldungeon.Dungeon; import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.npcs.Blacksmith; import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.npcs.Blacksmith;
import com.shatteredpixel.shatteredpixeldungeon.levels.painters.CavesPainter;
import com.shatteredpixel.shatteredpixeldungeon.levels.painters.Painter; import com.shatteredpixel.shatteredpixeldungeon.levels.painters.Painter;
import com.shatteredpixel.shatteredpixeldungeon.levels.rooms.Room; import com.shatteredpixel.shatteredpixeldungeon.levels.rooms.Room;
import com.shatteredpixel.shatteredpixeldungeon.levels.rooms.connection.TunnelRoom;
import com.shatteredpixel.shatteredpixeldungeon.levels.rooms.standard.StandardRoom;
import com.shatteredpixel.shatteredpixeldungeon.levels.traps.ConfusionTrap; import com.shatteredpixel.shatteredpixeldungeon.levels.traps.ConfusionTrap;
import com.shatteredpixel.shatteredpixeldungeon.levels.traps.ExplosiveTrap; import com.shatteredpixel.shatteredpixeldungeon.levels.traps.ExplosiveTrap;
import com.shatteredpixel.shatteredpixeldungeon.levels.traps.FireTrap; import com.shatteredpixel.shatteredpixeldungeon.levels.traps.FireTrap;
@ -48,14 +47,12 @@ import com.shatteredpixel.shatteredpixeldungeon.levels.traps.TeleportationTrap;
import com.shatteredpixel.shatteredpixeldungeon.levels.traps.VenomTrap; import com.shatteredpixel.shatteredpixeldungeon.levels.traps.VenomTrap;
import com.shatteredpixel.shatteredpixeldungeon.levels.traps.WarpingTrap; import com.shatteredpixel.shatteredpixeldungeon.levels.traps.WarpingTrap;
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages; import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
import com.shatteredpixel.shatteredpixeldungeon.tiles.DungeonTileSheet;
import com.shatteredpixel.shatteredpixeldungeon.tiles.DungeonTilemap; import com.shatteredpixel.shatteredpixeldungeon.tiles.DungeonTilemap;
import com.watabou.noosa.Game; import com.watabou.noosa.Game;
import com.watabou.noosa.Group; import com.watabou.noosa.Group;
import com.watabou.noosa.particles.PixelParticle; import com.watabou.noosa.particles.PixelParticle;
import com.watabou.utils.PointF; import com.watabou.utils.PointF;
import com.watabou.utils.Random; import com.watabou.utils.Random;
import com.watabou.utils.Rect;
import java.util.ArrayList; import java.util.ArrayList;
@ -83,6 +80,14 @@ public class CavesLevel extends RegularLevel {
return 1+Random.chances(new float[]{3, 3, 2, 1}); return 1+Random.chances(new float[]{3, 3, 2, 1});
} }
@Override
protected Painter painter() {
return new CavesPainter()
.setWater(feeling == Feeling.WATER ? 0.85f : 0.30f, 6)
.setGrass(feeling == Feeling.GRASS ? 0.65f : 0.15f, 3)
.setTraps(nTraps(), trapClasses(), trapChances());
}
@Override @Override
public String tilesTex() { public String tilesTex() {
return Assets.TILES_CAVES; return Assets.TILES_CAVES;
@ -93,26 +98,6 @@ public class CavesLevel extends RegularLevel {
return Assets.WATER_CAVES; return Assets.WATER_CAVES;
} }
@Override
protected float waterFill() {
return feeling == Feeling.WATER ? 0.85f : 0.30f;
}
@Override
protected int waterSmoothing() {
return 6;
}
@Override
protected float grassFill() {
return feeling == Feeling.GRASS ? 0.65f : 0.15f;
}
@Override
protected int grassSmoothing() {
return 3;
}
@Override @Override
protected Class<?>[] trapClasses() { protected Class<?>[] trapClasses() {
return new Class[]{ FireTrap.class, FrostTrap.class, PoisonTrap.class, SpearTrap.class, VenomTrap.class, return new Class[]{ FireTrap.class, FrostTrap.class, PoisonTrap.class, SpearTrap.class, VenomTrap.class,
@ -129,123 +114,6 @@ public class CavesLevel extends RegularLevel {
1 }; 1 };
} }
@Override
protected void decorate() {
for (Room room : rooms) {
if (!(room instanceof StandardRoom)) {
continue;
}
if (room.width() <= 4 || room.height() <= 4) {
continue;
}
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) {
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) {
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) {
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) {
map[corner] = Terrain.WALL;
traps.remove(corner);
}
}
for (Room n : room.connected.keySet()) {
if ((n instanceof StandardRoom || n instanceof TunnelRoom) && Random.Int( 3 ) == 0) {
Painter.set( this, room.connected.get( n ), Terrain.EMPTY_DECO );
}
}
}
for (int i=width() + 1; i < length() - width(); i++) {
if (map[i] == Terrain.EMPTY) {
int n = 0;
if (map[i+1] == Terrain.WALL) {
n++;
}
if (map[i-1] == Terrain.WALL) {
n++;
}
if (map[i+width()] == Terrain.WALL) {
n++;
}
if (map[i-width()] == Terrain.WALL) {
n++;
}
if (Random.Int( 6 ) <= n) {
map[i] = Terrain.EMPTY_DECO;
}
}
}
for (int i=0; i < length() - width(); i++) {
if (map[i] == Terrain.WALL &&
DungeonTileSheet.floorTile(map[i + width()])
&& Random.Int( 4 ) == 0) {
map[i] = Terrain.WALL_DECO;
}
}
placeSign();
if (Dungeon.bossLevel( Dungeon.depth + 1 )) {
return;
}
for (Room r : rooms) {
if (r instanceof StandardRoom) {
for (Room n : r.neigbours) {
if (n instanceof StandardRoom && !r.connected.containsKey( n )) {
Rect w = r.intersect( n );
if (w.left == w.right && w.bottom - w.top >= 5) {
w.top += 2;
w.bottom -= 1;
w.right++;
Painter.fill( this, w.left, w.top, 1, w.height(), Terrain.CHASM );
} else if (w.top == w.bottom && w.right - w.left >= 5) {
w.left += 2;
w.right -= 1;
w.bottom++;
Painter.fill( this, w.left, w.top, w.width(), 1, Terrain.CHASM );
}
}
}
}
}
}
@Override @Override
public String tileName( int tile ) { public String tileName( int tile ) {
switch (tile) { switch (tile) {

View File

@ -129,12 +129,6 @@ public class CityBossLevel extends Level {
entrance = (TOP + HALL_HEIGHT + 3 + Random.Int( CHAMBER_HEIGHT - 2 )) * width() + LEFT + (/*1 +*/ Random.Int( HALL_WIDTH-2 )); entrance = (TOP + HALL_HEIGHT + 3 + Random.Int( CHAMBER_HEIGHT - 2 )) * width() + LEFT + (/*1 +*/ Random.Int( HALL_WIDTH-2 ));
map[entrance] = Terrain.ENTRANCE; map[entrance] = Terrain.ENTRANCE;
return true;
}
@Override
protected void decorate() {
for (int i=0; i < length() - width(); i++) { for (int i=0; i < length() - width(); i++) {
if (map[i] == Terrain.EMPTY && Random.Int( 10 ) == 0) { if (map[i] == Terrain.EMPTY && Random.Int( 10 ) == 0) {
map[i] = Terrain.EMPTY_DECO; map[i] = Terrain.EMPTY_DECO;
@ -147,6 +141,8 @@ public class CityBossLevel extends Level {
int sign = arenaDoor + 2*width() + 1; int sign = arenaDoor + 2*width() + 1;
map[sign] = Terrain.SIGN; map[sign] = Terrain.SIGN;
return true;
} }
public int pedestal( boolean left ) { public int pedestal( boolean left ) {

View File

@ -24,6 +24,8 @@ package com.shatteredpixel.shatteredpixeldungeon.levels;
import com.shatteredpixel.shatteredpixeldungeon.Assets; import com.shatteredpixel.shatteredpixeldungeon.Assets;
import com.shatteredpixel.shatteredpixeldungeon.Dungeon; import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.npcs.Imp; import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.npcs.Imp;
import com.shatteredpixel.shatteredpixeldungeon.levels.painters.CityPainter;
import com.shatteredpixel.shatteredpixeldungeon.levels.painters.Painter;
import com.shatteredpixel.shatteredpixeldungeon.levels.traps.BlazingTrap; import com.shatteredpixel.shatteredpixeldungeon.levels.traps.BlazingTrap;
import com.shatteredpixel.shatteredpixeldungeon.levels.traps.CursingTrap; import com.shatteredpixel.shatteredpixeldungeon.levels.traps.CursingTrap;
import com.shatteredpixel.shatteredpixeldungeon.levels.traps.DisarmingTrap; import com.shatteredpixel.shatteredpixeldungeon.levels.traps.DisarmingTrap;
@ -43,7 +45,6 @@ import com.shatteredpixel.shatteredpixeldungeon.levels.traps.VenomTrap;
import com.shatteredpixel.shatteredpixeldungeon.levels.traps.WarpingTrap; import com.shatteredpixel.shatteredpixeldungeon.levels.traps.WarpingTrap;
import com.shatteredpixel.shatteredpixeldungeon.levels.traps.WeakeningTrap; import com.shatteredpixel.shatteredpixeldungeon.levels.traps.WeakeningTrap;
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages; import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
import com.shatteredpixel.shatteredpixeldungeon.tiles.DungeonTileSheet;
import com.shatteredpixel.shatteredpixeldungeon.tiles.DungeonTilemap; import com.shatteredpixel.shatteredpixeldungeon.tiles.DungeonTilemap;
import com.watabou.noosa.Group; import com.watabou.noosa.Group;
import com.watabou.noosa.particles.Emitter; import com.watabou.noosa.particles.Emitter;
@ -79,25 +80,13 @@ public class CityLevel extends RegularLevel {
} }
@Override @Override
protected float waterFill() { protected Painter painter() {
return feeling == Feeling.WATER ? 0.90f : 0.30f; return new CityPainter()
.setWater(feeling == Feeling.WATER ? 0.90f : 0.30f, 4)
.setGrass(feeling == Feeling.GRASS ? 0.80f : 0.20f, 3)
.setTraps(nTraps(), trapClasses(), trapChances());
} }
@Override
protected int waterSmoothing() {
return 4;
}
@Override
protected float grassFill() {
return feeling == Feeling.GRASS ? 0.80f : 0.20f;
}
@Override
protected int grassSmoothing() {
return 3;
}
@Override @Override
protected Class<?>[] trapClasses() { protected Class<?>[] trapClasses() {
return new Class[]{ BlazingTrap.class, FrostTrap.class, SpearTrap.class, VenomTrap.class, return new Class[]{ BlazingTrap.class, FrostTrap.class, SpearTrap.class, VenomTrap.class,
@ -114,22 +103,6 @@ public class CityLevel extends RegularLevel {
1, 1 }; 1, 1 };
} }
@Override
protected void decorate() {
for (int i=0; i < length() - width(); i++) {
if (map[i] == Terrain.EMPTY && Random.Int( 10 ) == 0) {
map[i] = Terrain.EMPTY_DECO;
} else if (map[i] == Terrain.WALL
&& DungeonTileSheet.floorTile(map[i + width()])
&& Random.Int( 21 - Dungeon.depth ) == 0) {
map[i] = Terrain.WALL_DECO;
}
}
placeSign();
}
@Override @Override
protected void createItems() { protected void createItems() {
super.createItems(); super.createItems();

View File

@ -23,7 +23,6 @@ package com.shatteredpixel.shatteredpixeldungeon.levels;
import com.shatteredpixel.shatteredpixeldungeon.Assets; import com.shatteredpixel.shatteredpixeldungeon.Assets;
import com.shatteredpixel.shatteredpixeldungeon.actors.Actor; import com.shatteredpixel.shatteredpixeldungeon.actors.Actor;
import com.watabou.utils.Random;
public class DeadEndLevel extends Level { public class DeadEndLevel extends Level {
@ -73,17 +72,6 @@ public class DeadEndLevel extends Level {
return true; return true;
} }
@Override
protected void decorate() {
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) {
map[i] = Terrain.WALL_DECO;
}
}
}
@Override @Override
protected void createMobs() { protected void createMobs() {
} }

View File

@ -96,53 +96,49 @@ public class HallsBossLevel extends Level {
setSize(32, 32); setSize(32, 32);
for (int i=0; i < 5; i++) { for (int i = 0; i < 5; i++) {
int top = Random.IntRange( 2, ROOM_TOP - 1 ); int top = Random.IntRange(2, ROOM_TOP - 1);
int bottom = Random.IntRange( ROOM_BOTTOM + 1, 22 ); int bottom = Random.IntRange(ROOM_BOTTOM + 1, 22);
Painter.fill( this, 2 + i * 4, top, 4, bottom - top + 1, Terrain.EMPTY ); Painter.fill(this, 2 + i * 4, top, 4, bottom - top + 1, Terrain.EMPTY);
if (i == 2) { if (i == 2) {
exit = (i * 4 + 3) + (top - 1) * width() ; exit = (i * 4 + 3) + (top - 1) * width();
} }
for (int j=0; j < 4; j++) { for (int j = 0; j < 4; j++) {
if (Random.Int( 2 ) == 0) { if (Random.Int(2) == 0) {
int y = Random.IntRange( top + 1, bottom - 1 ); 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;
} }
} }
} }
map[exit] = Terrain.LOCKED_EXIT; map[exit] = Terrain.LOCKED_EXIT;
Painter.fill( this, ROOM_LEFT - 1, ROOM_TOP - 1, Painter.fill(this, ROOM_LEFT - 1, ROOM_TOP - 1,
ROOM_RIGHT - ROOM_LEFT + 3, ROOM_BOTTOM - ROOM_TOP + 3, Terrain.WALL ); ROOM_RIGHT - ROOM_LEFT + 3, ROOM_BOTTOM - ROOM_TOP + 3, Terrain.WALL);
Painter.fill( this, ROOM_LEFT, ROOM_TOP, Painter.fill(this, ROOM_LEFT, ROOM_TOP,
ROOM_RIGHT - ROOM_LEFT + 1, ROOM_BOTTOM - ROOM_TOP + 1, Terrain.EMPTY ); ROOM_RIGHT - ROOM_LEFT + 1, ROOM_BOTTOM - ROOM_TOP + 1, Terrain.EMPTY);
entrance = Random.Int( ROOM_LEFT + 1, ROOM_RIGHT - 1 ) + 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; map[entrance] = Terrain.ENTRANCE;
boolean[] patch = Patch.generate( width, height, 0.30f, 6, true ); boolean[] patch = Patch.generate(width, height, 0.30f, 6, true);
for (int i=0; i < length(); i++) { for (int i = 0; i < length(); i++) {
if (map[i] == Terrain.EMPTY && patch[i]) { if (map[i] == Terrain.EMPTY && patch[i]) {
map[i] = Terrain.WATER; map[i] = Terrain.WATER;
} }
} }
return true; for (int i = 0; i < length(); i++) {
} if (map[i] == Terrain.EMPTY && Random.Int(10) == 0) {
@Override
protected void decorate() {
for (int i=0; i < length(); i++) {
if (map[i] == Terrain.EMPTY && Random.Int( 10 ) == 0) {
map[i] = Terrain.EMPTY_DECO; map[i] = Terrain.EMPTY_DECO;
} }
} }
return true;
} }
@Override @Override

View File

@ -26,6 +26,8 @@ import android.opengl.GLES20;
import com.shatteredpixel.shatteredpixeldungeon.Assets; import com.shatteredpixel.shatteredpixeldungeon.Assets;
import com.shatteredpixel.shatteredpixeldungeon.Dungeon; import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
import com.shatteredpixel.shatteredpixeldungeon.items.Torch; import com.shatteredpixel.shatteredpixeldungeon.items.Torch;
import com.shatteredpixel.shatteredpixeldungeon.levels.painters.HallsPainter;
import com.shatteredpixel.shatteredpixeldungeon.levels.painters.Painter;
import com.shatteredpixel.shatteredpixeldungeon.levels.traps.BlazingTrap; import com.shatteredpixel.shatteredpixeldungeon.levels.traps.BlazingTrap;
import com.shatteredpixel.shatteredpixeldungeon.levels.traps.CursingTrap; import com.shatteredpixel.shatteredpixeldungeon.levels.traps.CursingTrap;
import com.shatteredpixel.shatteredpixeldungeon.levels.traps.DisarmingTrap; import com.shatteredpixel.shatteredpixeldungeon.levels.traps.DisarmingTrap;
@ -50,7 +52,6 @@ import com.shatteredpixel.shatteredpixeldungeon.tiles.DungeonTilemap;
import com.watabou.noosa.Game; import com.watabou.noosa.Game;
import com.watabou.noosa.Group; import com.watabou.noosa.Group;
import com.watabou.noosa.particles.PixelParticle; import com.watabou.noosa.particles.PixelParticle;
import com.watabou.utils.PathFinder;
import com.watabou.utils.PointF; import com.watabou.utils.PointF;
import com.watabou.utils.Random; import com.watabou.utils.Random;
@ -76,6 +77,14 @@ public class HallsLevel extends RegularLevel {
return 1 + Random.chances(new float[]{1, 3, 3, 2}); return 1 + Random.chances(new float[]{1, 3, 3, 2});
} }
@Override
protected Painter painter() {
return new HallsPainter()
.setWater(feeling == Feeling.WATER ? 0.70f : 0.15f, 6)
.setGrass(feeling == Feeling.GRASS ? 0.65f : 0.10f, 3)
.setTraps(nTraps(), trapClasses(), trapChances());
}
@Override @Override
public void create() { public void create() {
addItemToSpawn( new Torch() ); addItemToSpawn( new Torch() );
@ -92,26 +101,6 @@ public class HallsLevel extends RegularLevel {
return Assets.WATER_HALLS; return Assets.WATER_HALLS;
} }
@Override
protected float waterFill() {
return feeling == Feeling.WATER ? 0.70f : 0.15f;
}
@Override
protected int waterSmoothing() {
return 6;
}
@Override
protected float grassFill() {
return feeling == Feeling.GRASS ? 0.65f : 0.10f;
}
@Override
protected int grassSmoothing() {
return 3;
}
@Override @Override
protected Class<?>[] trapClasses() { protected Class<?>[] trapClasses() {
return new Class[]{ BlazingTrap.class, DisintegrationTrap.class, FrostTrap.class, SpearTrap.class, VenomTrap.class, return new Class[]{ BlazingTrap.class, DisintegrationTrap.class, FrostTrap.class, SpearTrap.class, VenomTrap.class,
@ -128,36 +117,6 @@ public class HallsLevel extends RegularLevel {
1, 1, 1 }; 1, 1, 1 };
} }
@Override
protected void decorate() {
for (int i=width() + 1; i < length() - width() - 1; i++) {
if (map[i] == Terrain.EMPTY) {
int count = 0;
for (int j=0; j < PathFinder.NEIGHBOURS8.length; j++) {
if ((Terrain.flags[map[i + PathFinder.NEIGHBOURS8[j]]] & Terrain.PASSABLE) > 0) {
count++;
}
}
if (Random.Int( 80 ) < count) {
map[i] = Terrain.EMPTY_DECO;
}
} else
if (map[i] == Terrain.WALL &&
map[i-1] != Terrain.WALL_DECO && map[i-width()] != Terrain.WALL_DECO &&
Random.Int( 20 ) == 0) {
map[i] = Terrain.WALL_DECO;
}
}
placeSign();
}
@Override @Override
public String tileName( int tile ) { public String tileName( int tile ) {
switch (tile) { switch (tile) {

View File

@ -100,21 +100,17 @@ public class LastLevel extends Level {
map[pos-3] = map[pos-2] = map[pos-1] = map[pos] = map[pos+1] = map[pos+2] = map[pos+3] = Terrain.WATER; 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; map[pos-2] = map[pos+2] = Terrain.WATER;
feeling = Feeling.NONE;
viewDistance = 8;
return true;
}
@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) { if (map[i] == Terrain.EMPTY && Random.Int( 10 ) == 0) {
map[i] = Terrain.EMPTY_DECO; map[i] = Terrain.EMPTY_DECO;
} }
} }
feeling = Feeling.NONE;
viewDistance = 8;
return true;
} }
@Override @Override

View File

@ -24,18 +24,18 @@ package com.shatteredpixel.shatteredpixeldungeon.levels;
import com.shatteredpixel.shatteredpixeldungeon.Assets; import com.shatteredpixel.shatteredpixeldungeon.Assets;
import com.shatteredpixel.shatteredpixeldungeon.Bones; import com.shatteredpixel.shatteredpixeldungeon.Bones;
import com.shatteredpixel.shatteredpixeldungeon.actors.Actor; import com.shatteredpixel.shatteredpixeldungeon.actors.Actor;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.npcs.Imp;
import com.shatteredpixel.shatteredpixeldungeon.items.Heap; import com.shatteredpixel.shatteredpixeldungeon.items.Heap;
import com.shatteredpixel.shatteredpixeldungeon.items.Item; import com.shatteredpixel.shatteredpixeldungeon.items.Item;
import com.shatteredpixel.shatteredpixeldungeon.levels.builders.Builder; import com.shatteredpixel.shatteredpixeldungeon.levels.builders.Builder;
import com.shatteredpixel.shatteredpixeldungeon.levels.builders.LineBuilder; import com.shatteredpixel.shatteredpixeldungeon.levels.builders.LineBuilder;
import com.shatteredpixel.shatteredpixeldungeon.levels.painters.CityPainter;
import com.shatteredpixel.shatteredpixeldungeon.levels.painters.Painter;
import com.shatteredpixel.shatteredpixeldungeon.levels.rooms.Room; import com.shatteredpixel.shatteredpixeldungeon.levels.rooms.Room;
import com.shatteredpixel.shatteredpixeldungeon.levels.rooms.standard.EntranceRoom; import com.shatteredpixel.shatteredpixeldungeon.levels.rooms.standard.EntranceRoom;
import com.shatteredpixel.shatteredpixeldungeon.levels.rooms.standard.ExitRoom; import com.shatteredpixel.shatteredpixeldungeon.levels.rooms.standard.ExitRoom;
import com.shatteredpixel.shatteredpixeldungeon.levels.rooms.standard.ImpShopRoom; import com.shatteredpixel.shatteredpixeldungeon.levels.rooms.standard.ImpShopRoom;
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages; import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
import com.watabou.noosa.Group; import com.watabou.noosa.Group;
import com.watabou.utils.Random;
import java.util.ArrayList; import java.util.ArrayList;
@ -59,7 +59,18 @@ public class LastShopLevel extends RegularLevel {
@Override @Override
protected boolean build() { protected boolean build() {
feeling = Feeling.CHASM; feeling = Feeling.CHASM;
return super.build(); if (super.build()){
for (int i=0; i < length(); i++) {
if (map[i] == Terrain.SECRET_DOOR) {
map[i] = Terrain.DOOR;
}
}
return true;
} else {
return false;
}
} }
@Override @Override
@ -82,27 +93,10 @@ public class LastShopLevel extends RegularLevel {
} }
@Override @Override
protected void decorate() { protected Painter painter() {
return new CityPainter()
for (int i=0; i < length(); i++) { .setWater( 0.10f, 4 )
if (map[i] == Terrain.EMPTY && Random.Int( 10 ) == 0) { .setGrass( 0.10f, 3 );
map[i] = Terrain.EMPTY_DECO;
} else if (map[i] == Terrain.WALL && Random.Int( 8 ) == 0) {
map[i] = Terrain.WALL_DECO;
} else if (map[i] == Terrain.SECRET_DOOR) {
map[i] = Terrain.DOOR;
}
}
if (Imp.Quest.isCompleted()) {
placeSign();
}
} }
@Override @Override
@ -163,30 +157,6 @@ public class LastShopLevel extends RegularLevel {
return super.tileDesc( tile ); return super.tileDesc( tile );
} }
} }
@Override
protected float waterFill() {
return 0.10f;
}
@Override
protected int waterSmoothing() {
return 4;
}
@Override
protected float grassFill() {
return 0.10f;
}
@Override
protected int grassSmoothing() {
return 3;
}
protected int nTraps() {
return 0;
}
@Override @Override
public Group addVisuals( ) { public Group addVisuals( ) {

View File

@ -250,7 +250,6 @@ public abstract class Level implements Bundlable {
customWalls = new HashSet<>(); customWalls = new HashSet<>();
} while (!build()); } while (!build());
decorate();
buildFlagMaps(); buildFlagMaps();
cleanWalls(); cleanWalls();
@ -462,8 +461,6 @@ public abstract class Level implements Bundlable {
abstract protected boolean build(); abstract protected boolean build();
abstract protected void decorate();
abstract protected void createMobs(); abstract protected void createMobs();
abstract protected void createItems(); abstract protected void createItems();

View File

@ -122,7 +122,6 @@ public class PrisonBossLevel extends Level {
setSize(32, 32); setSize(32, 32);
map = MAP_START.clone(); map = MAP_START.clone();
decorate();
buildFlagMaps(); buildFlagMaps();
cleanWalls(); cleanWalls();
@ -136,11 +135,6 @@ public class PrisonBossLevel extends Level {
return true; return true;
} }
@Override
protected void decorate() {
//do nothing, all decorations are hard-coded.
}
@Override @Override
protected void createMobs() { protected void createMobs() {
tengu = new Tengu(); //We want to keep track of tengu independently of other mobs, he's not always in the level. tengu = new Tengu(); //We want to keep track of tengu independently of other mobs, he's not always in the level.

View File

@ -26,6 +26,8 @@ import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.npcs.Wandmaker; import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.npcs.Wandmaker;
import com.shatteredpixel.shatteredpixeldungeon.effects.Halo; import com.shatteredpixel.shatteredpixeldungeon.effects.Halo;
import com.shatteredpixel.shatteredpixeldungeon.effects.particles.FlameParticle; import com.shatteredpixel.shatteredpixeldungeon.effects.particles.FlameParticle;
import com.shatteredpixel.shatteredpixeldungeon.levels.painters.Painter;
import com.shatteredpixel.shatteredpixeldungeon.levels.painters.PrisonPainter;
import com.shatteredpixel.shatteredpixeldungeon.levels.rooms.Room; import com.shatteredpixel.shatteredpixeldungeon.levels.rooms.Room;
import com.shatteredpixel.shatteredpixeldungeon.levels.traps.AlarmTrap; import com.shatteredpixel.shatteredpixeldungeon.levels.traps.AlarmTrap;
import com.shatteredpixel.shatteredpixeldungeon.levels.traps.ChillingTrap; import com.shatteredpixel.shatteredpixeldungeon.levels.traps.ChillingTrap;
@ -73,6 +75,14 @@ public class PrisonLevel extends RegularLevel {
return 1+Random.chances(new float[]{4, 3, 3}); return 1+Random.chances(new float[]{4, 3, 3});
} }
@Override
protected Painter painter() {
return new PrisonPainter()
.setWater(feeling == Feeling.WATER ? 0.90f : 0.30f, 4)
.setGrass(feeling == Feeling.GRASS ? 0.80f : 0.20f, 3)
.setTraps(nTraps(), trapClasses(), trapChances());
}
@Override @Override
public String tilesTex() { public String tilesTex() {
return Assets.TILES_PRISON; return Assets.TILES_PRISON;
@ -83,26 +93,6 @@ public class PrisonLevel extends RegularLevel {
return Assets.WATER_PRISON; return Assets.WATER_PRISON;
} }
@Override
protected float waterFill() {
return feeling == Feeling.WATER ? 0.90f : 0.30f;
}
@Override
protected int waterSmoothing() {
return 4;
}
@Override
protected float grassFill() {
return feeling == Feeling.GRASS ? 0.80f : 0.20f;
}
@Override
protected int grassSmoothing() {
return 3;
}
@Override @Override
protected Class<?>[] trapClasses() { protected Class<?>[] trapClasses() {
return new Class[]{ ChillingTrap.class, FireTrap.class, PoisonTrap.class, SpearTrap.class, ToxicTrap.class, return new Class[]{ ChillingTrap.class, FireTrap.class, PoisonTrap.class, SpearTrap.class, ToxicTrap.class,
@ -116,56 +106,6 @@ public class PrisonLevel extends RegularLevel {
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
1, 1, 1, 1 }; 1, 1, 1, 1 };
} }
@Override
protected void decorate() {
Wandmaker.Quest.spawnWandmaker( this, roomEntrance, rooms );
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) {
c += 0.2f;
}
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) {
c += 0.2f;
}
if (map[i - 1] == Terrain.WALL && map[i - width()] == Terrain.WALL) {
c += 0.2f;
}
if (Random.Float() < c) {
map[i] = Terrain.EMPTY_DECO;
}
}
}
for (int i=0; i < width(); i++) {
if (map[i] == Terrain.WALL &&
(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++) {
if (map[i] == Terrain.WALL &&
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;
}
}
placeSign();
}
@Override @Override
public String tileName( int tile ) { public String tileName( int tile ) {

View File

@ -32,10 +32,9 @@ import com.shatteredpixel.shatteredpixeldungeon.items.Item;
import com.shatteredpixel.shatteredpixeldungeon.items.potions.Potion; import com.shatteredpixel.shatteredpixeldungeon.items.potions.Potion;
import com.shatteredpixel.shatteredpixeldungeon.items.rings.RingOfWealth; import com.shatteredpixel.shatteredpixeldungeon.items.rings.RingOfWealth;
import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.Scroll; import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.Scroll;
import com.shatteredpixel.shatteredpixeldungeon.levels.builders.BranchesBuilder;
import com.shatteredpixel.shatteredpixeldungeon.levels.builders.Builder; import com.shatteredpixel.shatteredpixeldungeon.levels.builders.Builder;
import com.shatteredpixel.shatteredpixeldungeon.levels.builders.LineBuilder;
import com.shatteredpixel.shatteredpixeldungeon.levels.painters.Painter; import com.shatteredpixel.shatteredpixeldungeon.levels.painters.Painter;
import com.shatteredpixel.shatteredpixeldungeon.levels.painters.RegularPainter;
import com.shatteredpixel.shatteredpixeldungeon.levels.rooms.Room; import com.shatteredpixel.shatteredpixeldungeon.levels.rooms.Room;
import com.shatteredpixel.shatteredpixeldungeon.levels.rooms.special.PitRoom; import com.shatteredpixel.shatteredpixeldungeon.levels.rooms.special.PitRoom;
import com.shatteredpixel.shatteredpixeldungeon.levels.rooms.special.ShopRoom; import com.shatteredpixel.shatteredpixeldungeon.levels.rooms.special.ShopRoom;
@ -70,7 +69,6 @@ public abstract class RegularLevel extends Level {
builder = builder(); builder = builder();
ArrayList<Room> initRooms = initRooms(); ArrayList<Room> initRooms = initRooms();
Random.shuffle(initRooms); Random.shuffle(initRooms);
@ -82,7 +80,12 @@ public abstract class RegularLevel extends Level {
rooms = builder.build((ArrayList<Room>)initRooms.clone()); rooms = builder.build((ArrayList<Room>)initRooms.clone());
} while (rooms == null); } while (rooms == null);
return painter().paint(this, rooms); if (painter().paint(this, rooms)){
placeSign();
return true;
} else {
return false;
}
} }
@ -101,8 +104,8 @@ public abstract class RegularLevel extends Level {
int specials = specialRooms(); int specials = specialRooms();
SpecialRoom.initForFloor(); SpecialRoom.initForFloor();
for (int i = 0; i < specials; i++) for (int i = 0; i < specials; i++)
initRooms.add(SpecialRoom.createRoom()); initRooms.add(SpecialRoom.createRoom());
return initRooms; return initRooms;
} }
@ -116,16 +119,10 @@ public abstract class RegularLevel extends Level {
protected Builder builder(){ protected Builder builder(){
//TODO need a much better builder here //TODO need a much better builder here
return new LineBuilder(); return new BranchesBuilder();
} }
protected Painter painter(){ protected abstract Painter painter();
RegularPainter p = new RegularPainter();
p.setGrass(grassFill(), grassSmoothing());
p.setWater(waterFill(), waterSmoothing());
p.setTraps(nTraps(), trapClasses(), trapChances());
return p;
}
protected void placeSign(){ protected void placeSign(){
while (true) { while (true) {
@ -135,6 +132,15 @@ public abstract class RegularLevel extends Level {
break; break;
} }
} }
//teaches players about secret doors
if (Dungeon.depth == 2) {
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;
}
}
} }
protected float waterFill(){ protected float waterFill(){

View File

@ -26,7 +26,8 @@ import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.npcs.Ghost; import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.npcs.Ghost;
import com.shatteredpixel.shatteredpixeldungeon.effects.Ripple; import com.shatteredpixel.shatteredpixeldungeon.effects.Ripple;
import com.shatteredpixel.shatteredpixeldungeon.items.DewVial; import com.shatteredpixel.shatteredpixeldungeon.items.DewVial;
import com.shatteredpixel.shatteredpixeldungeon.levels.rooms.Room; import com.shatteredpixel.shatteredpixeldungeon.levels.painters.Painter;
import com.shatteredpixel.shatteredpixeldungeon.levels.painters.SewerPainter;
import com.shatteredpixel.shatteredpixeldungeon.levels.traps.AlarmTrap; import com.shatteredpixel.shatteredpixeldungeon.levels.traps.AlarmTrap;
import com.shatteredpixel.shatteredpixeldungeon.levels.traps.ChillingTrap; import com.shatteredpixel.shatteredpixeldungeon.levels.traps.ChillingTrap;
import com.shatteredpixel.shatteredpixeldungeon.levels.traps.FlockTrap; import com.shatteredpixel.shatteredpixeldungeon.levels.traps.FlockTrap;
@ -71,6 +72,14 @@ public class SewerLevel extends RegularLevel {
} }
} }
@Override
protected Painter painter() {
return new SewerPainter()
.setWater(feeling == Feeling.WATER ? 0.85f : 0.30f, 5)
.setGrass(feeling == Feeling.GRASS ? 0.80f : 0.20f, 4)
.setTraps(nTraps(), trapClasses(), trapChances());
}
@Override @Override
public String tilesTex() { public String tilesTex() {
return Assets.TILES_SEWERS; return Assets.TILES_SEWERS;
@ -81,26 +90,6 @@ public class SewerLevel extends RegularLevel {
return Assets.WATER_SEWERS; return Assets.WATER_SEWERS;
} }
@Override
protected float waterFill() {
return feeling == Feeling.WATER ? 0.85f : 0.30f;
}
@Override
protected int waterSmoothing() {
return 5;
}
@Override
protected float grassFill() {
return feeling == Feeling.GRASS ? 0.80f : 0.20f;
}
@Override
protected int grassSmoothing() {
return 4;
}
@Override @Override
protected Class<?>[] trapClasses() { protected Class<?>[] trapClasses() {
return Dungeon.depth == 1 ? return Dungeon.depth == 1 ?
@ -118,54 +107,6 @@ public class SewerLevel extends RegularLevel {
2, 2, 2, 2,
1, 1, 1}; 1, 1, 1};
} }
@Override
protected void decorate() {
for (int i=0; i < width(); i++) {
if (map[i] == Terrain.WALL &&
map[i + width()] == Terrain.WATER &&
Random.Int( 4 ) == 0) {
map[i] = Terrain.WALL_DECO;
}
}
for (int i=width(); i < length() - width(); i++) {
if (map[i] == Terrain.WALL &&
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++) {
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);
if (Random.Int( 16 ) < count * count) {
map[i] = Terrain.EMPTY_DECO;
}
}
}
//hides all doors in the entrance room on floor 2, teaches the player to search.
if (Dungeon.depth == 2)
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;
}
placeSign();
}
@Override @Override
protected void createItems() { protected void createItems() {

View File

@ -0,0 +1,151 @@
/*
* Pixel Dungeon
* Copyright (C) 2012-2015 Oleg Dolya
*
* Shattered Pixel Dungeon
* Copyright (C) 2014-2017 Evan Debenham
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>
*/
package com.shatteredpixel.shatteredpixeldungeon.levels.painters;
import com.shatteredpixel.shatteredpixeldungeon.levels.Level;
import com.shatteredpixel.shatteredpixeldungeon.levels.Terrain;
import com.shatteredpixel.shatteredpixeldungeon.levels.rooms.Room;
import com.shatteredpixel.shatteredpixeldungeon.levels.rooms.connection.ConnectionRoom;
import com.shatteredpixel.shatteredpixeldungeon.levels.rooms.standard.StandardRoom;
import com.shatteredpixel.shatteredpixeldungeon.tiles.DungeonTileSheet;
import com.watabou.utils.Random;
import com.watabou.utils.Rect;
import java.util.ArrayList;
public class CavesPainter extends RegularPainter {
@Override
protected void decorate(Level level, ArrayList<Room> rooms) {
int w = level.width();
int l = level.length();
int[] map = level.map;
for (Room room : rooms) {
if (!(room instanceof StandardRoom)) {
continue;
}
if (room.width() <= 4 || room.height() <= 4) {
continue;
}
int s = room.square();
if (Random.Int( s ) > 8) {
int corner = (room.left + 1) + (room.top + 1) * w;
if (map[corner - 1] == Terrain.WALL && map[corner - w] == Terrain.WALL) {
map[corner] = Terrain.WALL;
level.traps.remove(corner);
}
}
if (Random.Int( s ) > 8) {
int corner = (room.right - 1) + (room.top + 1) * w;
if (map[corner + 1] == Terrain.WALL && map[corner - w] == Terrain.WALL) {
map[corner] = Terrain.WALL;
level.traps.remove(corner);
}
}
if (Random.Int( s ) > 8) {
int corner = (room.left + 1) + (room.bottom - 1) * w;
if (map[corner - 1] == Terrain.WALL && map[corner + w] == Terrain.WALL) {
map[corner] = Terrain.WALL;
level.traps.remove(corner);
}
}
if (Random.Int( s ) > 8) {
int corner = (room.right - 1) + (room.bottom - 1) * w;
if (map[corner + 1] == Terrain.WALL && map[corner + w] == Terrain.WALL) {
map[corner] = Terrain.WALL;
level.traps.remove(corner);
}
}
for (Room n : room.connected.keySet()) {
if ((n instanceof StandardRoom || n instanceof ConnectionRoom) && Random.Int( 3 ) == 0) {
Painter.set( level, room.connected.get( n ), Terrain.EMPTY_DECO );
}
}
}
for (int i=w + 1; i < l - w; i++) {
if (map[i] == Terrain.EMPTY) {
int n = 0;
if (map[i+1] == Terrain.WALL) {
n++;
}
if (map[i-1] == Terrain.WALL) {
n++;
}
if (map[i+w] == Terrain.WALL) {
n++;
}
if (map[i-w] == Terrain.WALL) {
n++;
}
if (Random.Int( 6 ) <= n) {
map[i] = Terrain.EMPTY_DECO;
}
}
}
for (int i=0; i < l - w; i++) {
if (map[i] == Terrain.WALL &&
DungeonTileSheet.floorTile(map[i + w])
&& Random.Int( 4 ) == 0) {
map[i] = Terrain.WALL_DECO;
}
}
for (Room r : rooms) {
if (r instanceof StandardRoom) {
for (Room n : r.neigbours) {
if (n instanceof StandardRoom && !r.connected.containsKey( n )) {
Rect i = r.intersect( n );
if (i.left == i.right && i.bottom - i.top >= 5) {
i.top += 2;
i.bottom -= 1;
i.right++;
Painter.fill( level, i.left, i.top, 1, i.height(), Terrain.CHASM );
} else if (i.top == i.bottom && i.right - i.left >= 5) {
i.left += 2;
i.right -= 1;
i.bottom++;
Painter.fill( level, i.left, i.top, i.width(), 1, Terrain.CHASM );
}
}
}
}
}
}
}

View File

@ -0,0 +1,55 @@
/*
* Pixel Dungeon
* Copyright (C) 2012-2015 Oleg Dolya
*
* Shattered Pixel Dungeon
* Copyright (C) 2014-2017 Evan Debenham
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>
*/
package com.shatteredpixel.shatteredpixeldungeon.levels.painters;
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
import com.shatteredpixel.shatteredpixeldungeon.levels.Level;
import com.shatteredpixel.shatteredpixeldungeon.levels.Terrain;
import com.shatteredpixel.shatteredpixeldungeon.levels.rooms.Room;
import com.shatteredpixel.shatteredpixeldungeon.tiles.DungeonTileSheet;
import com.watabou.utils.Random;
import java.util.ArrayList;
public class CityPainter extends RegularPainter {
@Override
protected void decorate(Level level, ArrayList<Room> rooms) {
int[] map = level.map;
int w = level.width();
int l = level.length();
for (int i=0; i < l - w; i++) {
if (map[i] == Terrain.EMPTY && Random.Int( 10 ) == 0) {
map[i] = Terrain.EMPTY_DECO;
} else if (map[i] == Terrain.WALL
&& !DungeonTileSheet.wallStitcheable(map[i + w])
&& Random.Int( 22 - Dungeon.depth ) == 0) {
map[i] = Terrain.WALL_DECO;
}
}
}
}

View File

@ -0,0 +1,65 @@
/*
* Pixel Dungeon
* Copyright (C) 2012-2015 Oleg Dolya
*
* Shattered Pixel Dungeon
* Copyright (C) 2014-2017 Evan Debenham
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>
*/
package com.shatteredpixel.shatteredpixeldungeon.levels.painters;
import com.shatteredpixel.shatteredpixeldungeon.levels.Level;
import com.shatteredpixel.shatteredpixeldungeon.levels.Terrain;
import com.shatteredpixel.shatteredpixeldungeon.levels.rooms.Room;
import com.watabou.utils.PathFinder;
import com.watabou.utils.Random;
import java.util.ArrayList;
public class HallsPainter extends RegularPainter {
@Override
protected void decorate(Level level, ArrayList<Room> rooms) {
int[] map = level.map;
int w = level.width();
int l = level.length();
for (int i=w + 1; i < l - w - 1; i++) {
if (map[i] == Terrain.EMPTY) {
int count = 0;
for (int j = 0; j < PathFinder.NEIGHBOURS8.length; j++) {
if ((Terrain.flags[map[i + PathFinder.NEIGHBOURS8[j]]] & Terrain.PASSABLE) > 0) {
count++;
}
}
if (Random.Int( 80 ) < count) {
map[i] = Terrain.EMPTY_DECO;
}
} else
if (map[i] == Terrain.WALL &&
map[i-1] != Terrain.WALL_DECO && map[i-w] != Terrain.WALL_DECO &&
Random.Int( 20 ) == 0) {
map[i] = Terrain.WALL_DECO;
}
}
}
}

View File

@ -0,0 +1,91 @@
/*
* Pixel Dungeon
* Copyright (C) 2012-2015 Oleg Dolya
*
* Shattered Pixel Dungeon
* Copyright (C) 2014-2017 Evan Debenham
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>
*/
package com.shatteredpixel.shatteredpixeldungeon.levels.painters;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.npcs.Wandmaker;
import com.shatteredpixel.shatteredpixeldungeon.levels.Level;
import com.shatteredpixel.shatteredpixeldungeon.levels.Terrain;
import com.shatteredpixel.shatteredpixeldungeon.levels.rooms.Room;
import com.shatteredpixel.shatteredpixeldungeon.levels.rooms.standard.EntranceRoom;
import com.watabou.utils.Random;
import java.util.ArrayList;
public class PrisonPainter extends RegularPainter {
@Override
protected void decorate(Level level, ArrayList<Room> rooms) {
for (Room r : rooms) {
if (r instanceof EntranceRoom) {
Wandmaker.Quest.spawnWandmaker(level, r);
break;
}
}
int w = level.width();
int l = level.length();
int[] map = level.map;
for (int i=w + 1; i < l - w - 1; i++) {
if (map[i] == Terrain.EMPTY) {
float c = 0.05f;
if (map[i + 1] == Terrain.WALL && map[i + w] == Terrain.WALL) {
c += 0.2f;
}
if (map[i - 1] == Terrain.WALL && map[i + w] == Terrain.WALL) {
c += 0.2f;
}
if (map[i + 1] == Terrain.WALL && map[i - w] == Terrain.WALL) {
c += 0.2f;
}
if (map[i - 1] == Terrain.WALL && map[i - w] == Terrain.WALL) {
c += 0.2f;
}
if (Random.Float() < c) {
map[i] = Terrain.EMPTY_DECO;
}
}
}
for (int i=0; i < w; i++) {
if (map[i] == Terrain.WALL &&
(map[i + w] == Terrain.EMPTY || map[i + w] == Terrain.EMPTY_SP) &&
Random.Int( 6 ) == 0) {
map[i] = Terrain.WALL_DECO;
}
}
for (int i=w; i < l - w; i++) {
if (map[i] == Terrain.WALL &&
map[i - w] == Terrain.WALL &&
(map[i + w] == Terrain.EMPTY || map[i + w] == Terrain.EMPTY_SP) &&
Random.Int( 3 ) == 0) {
map[i] = Terrain.WALL_DECO;
}
}
}
}

View File

@ -28,7 +28,7 @@ import com.shatteredpixel.shatteredpixeldungeon.levels.RegularLevel;
import com.shatteredpixel.shatteredpixeldungeon.levels.Terrain; import com.shatteredpixel.shatteredpixeldungeon.levels.Terrain;
import com.shatteredpixel.shatteredpixeldungeon.levels.rooms.Room; import com.shatteredpixel.shatteredpixeldungeon.levels.rooms.Room;
import com.shatteredpixel.shatteredpixeldungeon.levels.rooms.connection.ConnectionRoom; import com.shatteredpixel.shatteredpixeldungeon.levels.rooms.connection.ConnectionRoom;
import com.shatteredpixel.shatteredpixeldungeon.levels.rooms.standard.StandardRoom; import com.shatteredpixel.shatteredpixeldungeon.levels.rooms.standard.EmptyRoom;
import com.shatteredpixel.shatteredpixeldungeon.levels.traps.Trap; import com.shatteredpixel.shatteredpixeldungeon.levels.traps.Trap;
import com.watabou.utils.PathFinder; import com.watabou.utils.PathFinder;
import com.watabou.utils.Point; import com.watabou.utils.Point;
@ -37,59 +37,75 @@ import com.watabou.utils.Rect;
import java.util.ArrayList; import java.util.ArrayList;
public class RegularPainter extends Painter { public abstract class RegularPainter extends Painter {
private float waterFill = 0f; private float waterFill = 0f;
private int waterSmoothness; private int waterSmoothness;
public RegularPainter setWater(float fill, int smoothness){
waterFill = fill;
waterSmoothness = smoothness;
return this;
}
private float grassFill = 0f; private float grassFill = 0f;
private int grassSmoothness; private int grassSmoothness;
public RegularPainter setGrass(float fill, int smoothness){
grassFill = fill;
grassSmoothness = smoothness;
return this;
}
private int nTraps = 0; private int nTraps = 0;
private Class<? extends Trap>[] trapClasses; private Class<? extends Trap>[] trapClasses;
private float[] trapChances; private float[] trapChances;
public void setWater(float fill, int smoothness){ public RegularPainter setTraps(int num, Class<?>[] classes, float[] chances){
waterFill = fill;
waterSmoothness = smoothness;
}
public void setGrass(float fill, int smoothness){
grassFill = fill;
grassSmoothness = smoothness;
}
public void setTraps(int num, Class<?>[] classes, float[] chances){
nTraps = num; nTraps = num;
trapClasses = (Class<? extends Trap>[]) classes; trapClasses = (Class<? extends Trap>[]) classes;
trapChances = chances; trapChances = chances;
return this;
} }
@Override @Override
public boolean paint(Level level, ArrayList<Room> rooms) { public boolean paint(Level level, ArrayList<Room> rooms) {
int leftMost = Integer.MAX_VALUE, topMost = Integer.MAX_VALUE;
for (Room r : rooms){ //painter can be used without rooms
if (r.left < leftMost) leftMost = r.left; if (rooms != null) {
if (r.top < topMost) topMost = r.top; int leftMost = Integer.MAX_VALUE, topMost = Integer.MAX_VALUE;
for (Room r : rooms) {
if (r.left < leftMost) leftMost = r.left;
if (r.top < topMost) topMost = r.top;
}
//subtract 1 for padding
leftMost--;
topMost--;
int rightMost = 0, bottomMost = 0;
for (Room r : rooms) {
r.shift(-leftMost, -topMost);
if (r.right > rightMost) rightMost = r.right;
if (r.bottom > bottomMost) bottomMost = r.bottom;
}
//add 1 for padding
rightMost++;
bottomMost++;
//add 1 to account for 0 values
level.setSize(rightMost + 1, bottomMost + 1);
} else {
//check if the level's size was already initialized by something else
if (level.length() == 0) return false;
//easier than checking for null everywhere
rooms = new ArrayList<>();
} }
leftMost--;
topMost--;
int width = 0, height = 0;
for (Room r : rooms){
r.shift( -leftMost, -topMost);
if (r.right > width) width = r.right;
if (r.bottom > height) height = r.bottom;
}
width++;
height++;
level.setSize(width+1, height+1);
for (Room r : rooms) { for (Room r : rooms) {
placeDoors( r ); placeDoors( r );
r.paint( level ); r.paint( level );
@ -111,9 +127,13 @@ public class RegularPainter extends Painter {
paintTraps( level ); paintTraps( level );
} }
decorate( level, rooms );
return true; return true;
} }
protected abstract void decorate(Level level, ArrayList<Room> rooms);
private void placeDoors( Room r ) { private void placeDoors( Room r ) {
for (Room n : r.connected.keySet()) { for (Room n : r.connected.keySet()) {
Room.Door door = r.connected.get( n ); Room.Door door = r.connected.get( n );
@ -137,6 +157,7 @@ public class RegularPainter extends Painter {
for (Room n : r.connected.keySet()) { for (Room n : r.connected.keySet()) {
if (joinRooms( l, r, n )) { if (joinRooms( l, r, n )) {
continue; continue;
} }
@ -176,10 +197,11 @@ public class RegularPainter extends Painter {
protected boolean joinRooms( Level l, Room r, Room n ) { protected boolean joinRooms( Level l, Room r, Room n ) {
if (!(r instanceof StandardRoom && n instanceof StandardRoom)) { if (!(r instanceof EmptyRoom && n instanceof EmptyRoom)) {
return false; return false;
} }
//TODO decide on good probabilities and dimension restrictions
Rect w = r.intersect( n ); Rect w = r.intersect( n );
if (w.left == w.right) { if (w.left == w.right) {

View File

@ -0,0 +1,74 @@
/*
* Pixel Dungeon
* Copyright (C) 2012-2015 Oleg Dolya
*
* Shattered Pixel Dungeon
* Copyright (C) 2014-2017 Evan Debenham
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>
*/
package com.shatteredpixel.shatteredpixeldungeon.levels.painters;
import com.shatteredpixel.shatteredpixeldungeon.levels.Level;
import com.shatteredpixel.shatteredpixeldungeon.levels.Terrain;
import com.shatteredpixel.shatteredpixeldungeon.levels.rooms.Room;
import com.watabou.utils.Random;
import java.util.ArrayList;
public class SewerPainter extends RegularPainter {
@Override
protected void decorate(Level level, ArrayList<Room> rooms) {
int[] map = level.map;
int w = level.width();
int l = level.length();
for (int i=0; i < w; i++) {
if (map[i] == Terrain.WALL &&
map[i + w] == Terrain.WATER &&
Random.Int( 4 ) == 0) {
map[i] = Terrain.WALL_DECO;
}
}
for (int i=w; i < l - w; i++) {
if (map[i] == Terrain.WALL &&
map[i - w] == Terrain.WALL &&
map[i + w] == Terrain.WATER &&
Random.Int( 2 ) == 0) {
map[i] = Terrain.WALL_DECO;
}
}
for (int i=w + 1; i < l - w - 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 + w] == Terrain.WALL ? 1 : 0) +
(map[i - w] == Terrain.WALL ? 1 : 0);
if (Random.Int( 16 ) < count * count) {
map[i] = Terrain.EMPTY_DECO;
}
}
}
}
}