v0.6.1: Added 5 new regional rooms, and adjusted room spawn rates
This commit is contained in:
parent
886b597eea
commit
193633b602
|
@ -0,0 +1,41 @@
|
|||
package com.shatteredpixel.shatteredpixeldungeon.levels.rooms.standard;
|
||||
|
||||
import com.shatteredpixel.shatteredpixeldungeon.levels.Level;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.levels.Terrain;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.levels.painters.Painter;
|
||||
|
||||
public class CirclePitRoom extends StandardRoom {
|
||||
|
||||
@Override
|
||||
public int minWidth() {
|
||||
return Math.max(8, super.minWidth());
|
||||
}
|
||||
|
||||
@Override
|
||||
public int minHeight() {
|
||||
return Math.max(8, super.minHeight());
|
||||
}
|
||||
|
||||
@Override
|
||||
public float[] sizeCatProbs() {
|
||||
return new float[]{4, 2, 1};
|
||||
}
|
||||
|
||||
@Override
|
||||
public void paint(Level level) {
|
||||
Painter.fill( level, this, Terrain.WALL );
|
||||
|
||||
Painter.fillEllipse( level, this, 1 , Terrain.EMPTY );
|
||||
|
||||
for (Door door : connected.values()) {
|
||||
door.set( Door.Type.REGULAR );
|
||||
if (door.x == left || door.x == right){
|
||||
Painter.drawInside(level, this, door, width()/2, Terrain.EMPTY);
|
||||
} else {
|
||||
Painter.drawInside(level, this, door, height()/2, Terrain.EMPTY);
|
||||
}
|
||||
}
|
||||
|
||||
Painter.fillEllipse( level, this, 3 , Terrain.CHASM );
|
||||
}
|
||||
}
|
|
@ -0,0 +1,120 @@
|
|||
/*
|
||||
* 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.rooms.standard;
|
||||
|
||||
import com.shatteredpixel.shatteredpixeldungeon.levels.Level;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.levels.Terrain;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.levels.painters.Painter;
|
||||
import com.watabou.utils.GameMath;
|
||||
import com.watabou.utils.Point;
|
||||
import com.watabou.utils.PointF;
|
||||
import com.watabou.utils.Random;
|
||||
import com.watabou.utils.Rect;
|
||||
|
||||
public class HallwayRoom extends EmptyRoom {
|
||||
|
||||
//FIXME lots of copy-pasta from tunnel rooms here
|
||||
@Override
|
||||
public void paint(Level level) {
|
||||
|
||||
Painter.fill( level, this, Terrain.WALL );
|
||||
Painter.fill( level, this, 1 , Terrain.EMPTY );
|
||||
|
||||
if (connected.size() < 2){
|
||||
//don't want to make a hallway between doors that don't exist
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
Rect c = getConnectionSpace();
|
||||
|
||||
for (Door door : connected.values()) {
|
||||
|
||||
Point start;
|
||||
Point mid;
|
||||
Point end;
|
||||
|
||||
start = new Point(door);
|
||||
if (start.x == left) start.x++;
|
||||
else if (start.y == top) start.y++;
|
||||
else if (start.x == right) start.x--;
|
||||
else if (start.y == bottom) start.y--;
|
||||
|
||||
int rightShift;
|
||||
int downShift;
|
||||
|
||||
if (start.x < c.left) rightShift = c.left - start.x;
|
||||
else if (start.x > c.right) rightShift = c.right - start.x;
|
||||
else rightShift = 0;
|
||||
|
||||
if (start.y < c.top) downShift = c.top - start.y;
|
||||
else if (start.y > c.bottom) downShift = c.bottom - start.y;
|
||||
else downShift = 0;
|
||||
|
||||
//always goes inward first
|
||||
if (door.x == left || door.x == right){
|
||||
mid = new Point(start.x + rightShift, start.y);
|
||||
end = new Point(mid.x, mid.y + downShift);
|
||||
|
||||
} else {
|
||||
mid = new Point(start.x, start.y + downShift);
|
||||
end = new Point(mid.x + rightShift, mid.y);
|
||||
|
||||
}
|
||||
|
||||
Painter.drawLine( level, start, mid, Terrain.EMPTY_SP );
|
||||
Painter.drawLine( level, mid, end, Terrain.EMPTY_SP );
|
||||
|
||||
}
|
||||
|
||||
for (Door door : connected.values()) {
|
||||
door.set( Door.Type.UNLOCKED );
|
||||
}
|
||||
}
|
||||
|
||||
//returns the space which all doors must connect to (usually 1 cell, but can be more)
|
||||
//Note that, like rooms, this space is inclusive to its right and bottom sides
|
||||
protected Rect getConnectionSpace(){
|
||||
Point c = connected.size() <= 1 ? center() : getDoorCenter();
|
||||
|
||||
return new Rect(c.x, c.y, c.x, c.y);
|
||||
}
|
||||
|
||||
//returns a point equidistant from all doors this room has
|
||||
protected final Point getDoorCenter(){
|
||||
PointF doorCenter = new PointF(0, 0);
|
||||
|
||||
for (Door door : connected.values()) {
|
||||
doorCenter.x += door.x;
|
||||
doorCenter.y += door.y;
|
||||
}
|
||||
|
||||
Point c = new Point((int)doorCenter.x / connected.size(), (int)doorCenter.y / connected.size());
|
||||
if (Random.Float() < doorCenter.x % 1) c.x++;
|
||||
if (Random.Float() < doorCenter.y % 1) c.y++;
|
||||
c.x = (int) GameMath.gate(left+2, c.x, right-2);
|
||||
c.y = (int)GameMath.gate(top+2, c.y, bottom-2);
|
||||
|
||||
return c;
|
||||
}
|
||||
|
||||
}
|
|
@ -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.rooms.standard;
|
||||
|
||||
import com.shatteredpixel.shatteredpixeldungeon.levels.Level;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.levels.Terrain;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.levels.painters.Painter;
|
||||
import com.watabou.utils.GameMath;
|
||||
import com.watabou.utils.PathFinder;
|
||||
import com.watabou.utils.Point;
|
||||
import com.watabou.utils.PointF;
|
||||
import com.watabou.utils.Random;
|
||||
import com.watabou.utils.Rect;
|
||||
|
||||
public class SewerPipeRoom extends StandardRoom {
|
||||
|
||||
@Override
|
||||
public int minWidth() {
|
||||
return Math.max(7, super.minWidth());
|
||||
}
|
||||
|
||||
@Override
|
||||
public int minHeight() {
|
||||
return Math.max(7, super.minHeight());
|
||||
}
|
||||
|
||||
@Override
|
||||
public float[] sizeCatProbs() {
|
||||
return new float[]{4, 2, 1};
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean canConnect(Point p) {
|
||||
//refuses connections next to corners
|
||||
return super.canConnect(p) && ((p.x > left+1 && p.x < right-1) || (p.y > top+1 && p.y < bottom-1));
|
||||
}
|
||||
|
||||
//FIXME lots of copy-pasta from tunnel rooms here
|
||||
@Override
|
||||
public void paint(Level level) {
|
||||
|
||||
Painter.fill( level, this, Terrain.WALL );
|
||||
|
||||
Rect c = getConnectionSpace();
|
||||
|
||||
for (Door door : connected.values()) {
|
||||
|
||||
Point start;
|
||||
Point mid;
|
||||
Point end;
|
||||
|
||||
start = new Point(door);
|
||||
if (start.x == left) start.x+=2;
|
||||
else if (start.y == top) start.y+=2;
|
||||
else if (start.x == right) start.x-=2;
|
||||
else if (start.y == bottom) start.y-=2;
|
||||
|
||||
int rightShift;
|
||||
int downShift;
|
||||
|
||||
if (start.x < c.left) rightShift = c.left - start.x;
|
||||
else if (start.x > c.right) rightShift = c.right - start.x;
|
||||
else rightShift = 0;
|
||||
|
||||
if (start.y < c.top) downShift = c.top - start.y;
|
||||
else if (start.y > c.bottom) downShift = c.bottom - start.y;
|
||||
else downShift = 0;
|
||||
|
||||
//always goes inward first
|
||||
if (door.x == left || door.x == right){
|
||||
mid = new Point(start.x + rightShift, start.y);
|
||||
end = new Point(mid.x, mid.y + downShift);
|
||||
|
||||
} else {
|
||||
mid = new Point(start.x, start.y + downShift);
|
||||
end = new Point(mid.x + rightShift, mid.y);
|
||||
|
||||
}
|
||||
|
||||
Painter.drawLine( level, start, mid, Terrain.WATER);
|
||||
Painter.drawLine( level, mid, end, Terrain.WATER );
|
||||
|
||||
}
|
||||
|
||||
for(Point p : getPoints()){
|
||||
int cell = level.pointToCell(p);
|
||||
if (level.map[cell] == Terrain.WATER){
|
||||
for (int i : PathFinder.NEIGHBOURS8){
|
||||
if (level.map[cell + i] == Terrain.WALL){
|
||||
Painter.set(level, cell + i, Terrain.EMPTY);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (Door door : connected.values()) {
|
||||
door.set( Door.Type.UNLOCKED );
|
||||
}
|
||||
}
|
||||
|
||||
//returns the space which all doors must connect to (usually 1 cell, but can be more)
|
||||
//Note that, like rooms, this space is inclusive to its right and bottom sides
|
||||
protected Rect getConnectionSpace(){
|
||||
Point c = connected.size() <= 1 ? center() : getDoorCenter();
|
||||
|
||||
return new Rect(c.x, c.y, c.x, c.y);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean canPlaceWater(Point p) {
|
||||
return false;
|
||||
}
|
||||
|
||||
//returns a point equidistant from all doors this room has
|
||||
protected final Point getDoorCenter(){
|
||||
PointF doorCenter = new PointF(0, 0);
|
||||
|
||||
for (Door door : connected.values()) {
|
||||
doorCenter.x += door.x;
|
||||
doorCenter.y += door.y;
|
||||
}
|
||||
|
||||
Point c = new Point((int)doorCenter.x / connected.size(), (int)doorCenter.y / connected.size());
|
||||
if (Random.Float() < doorCenter.x % 1) c.x++;
|
||||
if (Random.Float() < doorCenter.y % 1) c.y++;
|
||||
c.x = (int) GameMath.gate(left+2, c.x, right-2);
|
||||
c.y = (int)GameMath.gate(top+2, c.y, bottom-2);
|
||||
|
||||
return c;
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,87 @@
|
|||
/*
|
||||
* 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.rooms.standard;
|
||||
|
||||
import com.shatteredpixel.shatteredpixeldungeon.levels.Level;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.levels.Terrain;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.levels.painters.Painter;
|
||||
|
||||
public class SkullsRoom extends StandardRoom {
|
||||
|
||||
@Override
|
||||
public int minWidth() {
|
||||
return Math.max(7, super.minWidth());
|
||||
}
|
||||
|
||||
@Override
|
||||
public int minHeight() {
|
||||
return Math.max(7, super.minHeight());
|
||||
}
|
||||
|
||||
@Override
|
||||
public float[] sizeCatProbs() {
|
||||
return new float[]{9, 3, 1};
|
||||
}
|
||||
|
||||
@Override
|
||||
public void paint(Level level) {
|
||||
|
||||
int minDim = Math.min(width(), height());
|
||||
|
||||
Painter.fill( level, this, Terrain.WALL );
|
||||
|
||||
if (minDim >= 9) {
|
||||
Painter.fillEllipse(level, this, 2, Terrain.EMPTY);
|
||||
} else {
|
||||
Painter.fill(level, this, 2, Terrain.EMPTY);
|
||||
}
|
||||
|
||||
for (Door door : connected.values()) {
|
||||
door.set( Door.Type.REGULAR );
|
||||
if (door.x == left || door.x == right){
|
||||
Painter.drawInside(level, this, door, (width() - 3) / 2, Terrain.EMPTY);
|
||||
} else {
|
||||
Painter.drawInside(level, this, door, (height() - 3) / 2, Terrain.EMPTY);
|
||||
}
|
||||
}
|
||||
|
||||
boolean oddWidth = width() % 2 == 1;
|
||||
boolean oddHeight = height() % 2 == 1;
|
||||
|
||||
if (minDim >= 12){
|
||||
|
||||
Painter.fillEllipse(level, this, 5, Terrain.STATUE);
|
||||
Painter.fillEllipse(level, this, 6, Terrain.WALL);
|
||||
|
||||
} else {
|
||||
|
||||
Painter.fill(level,
|
||||
left + width()/2 + (oddWidth ? 0 : -1),
|
||||
top + height()/2 + (oddHeight ? 0 : -1),
|
||||
oddWidth ? 1 : 2,
|
||||
oddHeight ? 1 : 2,
|
||||
Terrain.STATUE);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
}
|
|
@ -114,13 +114,24 @@ public abstract class StandardRoom extends Room {
|
|||
private static ArrayList<Class<?extends StandardRoom>> rooms = new ArrayList<>();
|
||||
static {
|
||||
rooms.add(EmptyRoom.class);
|
||||
|
||||
|
||||
|
||||
rooms.add(SewerPipeRoom.class);
|
||||
rooms.add(RingRoom.class);
|
||||
|
||||
rooms.add(SegmentedRoom.class);
|
||||
rooms.add(StatuesRoom.class);
|
||||
|
||||
rooms.add(CaveRoom.class);
|
||||
rooms.add(CirclePitRoom.class);
|
||||
|
||||
rooms.add(HallwayRoom.class);
|
||||
rooms.add(PillarsRoom.class);
|
||||
|
||||
rooms.add(RuinsRoom.class);
|
||||
|
||||
rooms.add(SkullsRoom.class);
|
||||
|
||||
|
||||
rooms.add(GardenRoom.class);
|
||||
rooms.add(AquariumRoom.class);
|
||||
rooms.add(PlatformRoom.class);
|
||||
|
@ -135,23 +146,23 @@ public abstract class StandardRoom extends Room {
|
|||
|
||||
private static float[][] chances = new float[27][];
|
||||
static {
|
||||
chances[1] = new float[]{25, 15, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 0};
|
||||
chances[2] = new float[]{25, 15, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};
|
||||
chances[1] = new float[]{20, 15,5, 0,0, 0,0, 0,0, 0,0, 1,0,1,0,1,0,1,1,0,0};
|
||||
chances[2] = new float[]{20, 15,5, 0,0, 0,0, 0,0, 0,0, 1,1,1,1,1,1,1,1,1,1};
|
||||
chances[4] = chances[3] = chances[2];
|
||||
chances[5] = new float[]{1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
|
||||
chances[5] = new float[]{50, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0,0,0,0,0,0,0,0,0};
|
||||
|
||||
chances[6] = new float[]{25, 0, 15, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};
|
||||
chances[6] = new float[]{20, 0,0, 15,5, 0,0, 0,0, 0,0, 1,1,1,1,1,1,1,1,1,1};
|
||||
chances[10] = chances[9] = chances[8] = chances[7] = chances[6];
|
||||
|
||||
chances[11] = new float[]{25, 0, 0, 15, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};
|
||||
chances[11] = new float[]{20, 0,0, 0,0, 15,5, 0,0, 0,0, 1,1,1,1,1,1,1,1,1,1};
|
||||
chances[15] = chances[14] = chances[13] = chances[12] = chances[11];
|
||||
|
||||
chances[16] = new float[]{25, 0, 0, 0, 15, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};
|
||||
|
||||
chances[16] = new float[]{20, 0,0, 0,0, 0,0, 15,5, 0,0, 1,1,1,1,1,1,1,1,1,1};
|
||||
chances[20] = chances[19] = chances[18] = chances[17] = chances[16];
|
||||
|
||||
chances[21] = chances[5];
|
||||
|
||||
chances[22] = new float[]{25, 0, 0, 0, 0, 15, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};
|
||||
chances[22] = new float[]{20, 0,0, 0,0, 0,0, 0,0, 15,5, 1,1,1,1,1,1,1,1,1,1};
|
||||
chances[26] = chances[25] = chances[24] = chances[23] = chances[22];
|
||||
}
|
||||
|
||||
|
|
|
@ -0,0 +1,79 @@
|
|||
/*
|
||||
* 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.rooms.standard;
|
||||
|
||||
import com.shatteredpixel.shatteredpixeldungeon.levels.Level;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.levels.Terrain;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.levels.painters.Painter;
|
||||
|
||||
public class StatuesRoom extends StandardRoom {
|
||||
|
||||
@Override
|
||||
public int minWidth() {
|
||||
return Math.max(7, super.minWidth());
|
||||
}
|
||||
|
||||
@Override
|
||||
public int minHeight() {
|
||||
return Math.max(7, super.minHeight());
|
||||
}
|
||||
|
||||
@Override
|
||||
public float[] sizeCatProbs() {
|
||||
return new float[]{9, 3, 1};
|
||||
}
|
||||
|
||||
@Override
|
||||
public void paint(Level level) {
|
||||
Painter.fill( level, this, Terrain.WALL );
|
||||
Painter.fill( level, this, 1 , Terrain.EMPTY );
|
||||
|
||||
for (Door door : connected.values()) {
|
||||
door.set( Door.Type.REGULAR );
|
||||
}
|
||||
|
||||
|
||||
int rows = (width() + 1)/6;
|
||||
int cols = (height() + 1)/6;
|
||||
|
||||
int w = (width() - 4 - (rows-1))/rows;
|
||||
int h = (height() - 4 - (cols-1))/cols;
|
||||
|
||||
int Wspacing = rows % 2 == width() % 2 ? 2 : 1;
|
||||
int Hspacing = cols % 2 == height() % 2 ? 2 : 1;
|
||||
|
||||
for (int x = 0; x < rows; x++){
|
||||
for (int y = 0; y < cols; y++){
|
||||
int left = this.left + 2 + (x * (w + Wspacing));
|
||||
int top = this.top + 2 + (y * (h + Hspacing));
|
||||
|
||||
Painter.fill(level, left, top, w, h, Terrain.EMPTY_SP);
|
||||
|
||||
Painter.set(level, left, top, Terrain.STATUE_SP);
|
||||
Painter.set(level, left + w-1, top, Terrain.STATUE_SP);
|
||||
Painter.set(level, left, top + h-1, Terrain.STATUE_SP);
|
||||
Painter.set(level, left + w-1, top + h-1, Terrain.STATUE_SP);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user