From 0e033720c729e84eb12ac4d51c4cee7222992689 Mon Sep 17 00:00:00 2001 From: Evan Debenham Date: Fri, 11 Aug 2017 21:46:32 -0400 Subject: [PATCH] v0.6.1: levels are now more densely packed on average --- .../levels/RegularLevel.java | 5 +-- .../levels/builders/Builder.java | 8 +++-- .../levels/builders/LoopBuilder.java | 31 +++++++++++++++++++ .../levels/builders/RegularBuilder.java | 22 +++++++------ 4 files changed, 51 insertions(+), 15 deletions(-) diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/RegularLevel.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/RegularLevel.java index a7be6e3f7..c86ecea23 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/RegularLevel.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/RegularLevel.java @@ -21,7 +21,6 @@ package com.shatteredpixel.shatteredpixeldungeon.levels; -import com.shatteredpixel.shatteredpixeldungeon.Badges; import com.shatteredpixel.shatteredpixeldungeon.Bones; import com.shatteredpixel.shatteredpixeldungeon.Dungeon; import com.shatteredpixel.shatteredpixeldungeon.ShatteredPixelDungeon; @@ -53,10 +52,8 @@ import com.watabou.utils.Bundle; import com.watabou.utils.Random; import java.util.ArrayList; -import java.util.Arrays; import java.util.Collection; import java.util.Iterator; -import java.util.List; public abstract class RegularLevel extends Level { @@ -126,7 +123,7 @@ public abstract class RegularLevel extends Level { protected Builder builder(){ return new LoopBuilder() .setLoopShape( 2 , - Random.Float(0.55f, 0.85f), + Random.Float(0.4f, 0.7f), Random.Float(0f, 0.5f)); } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/builders/Builder.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/builders/Builder.java index fb4facb47..2c5c6956a 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/builders/Builder.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/builders/Builder.java @@ -146,10 +146,14 @@ public abstract class Builder { protected static float angleBetweenRooms( Room from, Room to){ PointF fromCenter = new PointF((from.left + from.right)/2f, (from.top + from.bottom)/2f); PointF toCenter = new PointF((to.left + to.right)/2f, (to.top + to.bottom)/2f); - double m = (toCenter.y - fromCenter.y)/(toCenter.x - fromCenter.x); + return angleBetweenPoints(fromCenter, toCenter); + } + + protected static float angleBetweenPoints( PointF from, PointF to ){ + double m = (to.y - from.y)/(to.x - from.x); float angle = (float)(A*(Math.atan(m) + Math.PI/2.0)); - if (fromCenter.x > toCenter.x) angle -= 180f; + if (from.x > to.x) angle -= 180f; return angle; } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/builders/LoopBuilder.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/builders/LoopBuilder.java index 86a71a1eb..fecaaf27d 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/builders/LoopBuilder.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/builders/LoopBuilder.java @@ -23,6 +23,7 @@ package com.shatteredpixel.shatteredpixeldungeon.levels.builders; import com.shatteredpixel.shatteredpixeldungeon.levels.rooms.Room; import com.shatteredpixel.shatteredpixeldungeon.levels.rooms.connection.ConnectionRoom; +import com.watabou.utils.PointF; import com.watabou.utils.Random; import java.util.ArrayList; @@ -66,6 +67,8 @@ public class LoopBuilder extends RegularBuilder { + 0.25 + 0.5*Math.floor(2*x); } + private PointF loopCenter; + @Override public ArrayList build(ArrayList rooms) { @@ -127,6 +130,14 @@ public class LoopBuilder extends RegularBuilder { prev = c; } + loopCenter = new PointF(); + for (Room r : loop){ + loopCenter.x += (r.left + r.right)/2f; + loopCenter.y += (r.top + r.bottom)/2f; + } + loopCenter.x /= loop.size(); + loopCenter.y /= loop.size(); + if (shop != null) { float angle; int tries = 10; @@ -158,4 +169,24 @@ public class LoopBuilder extends RegularBuilder { return rooms; } + + @Override + protected float randomBranchAngle( Room r ) { + if (loopCenter == null) + return super.randomBranchAngle( r ); + else { + //generate four angles randomly and return the one which points closer to the center + float toCenter = angleBetweenPoints( new PointF((r.left + r.right)/2f, (r.top + r.bottom)/2f), loopCenter); + if (toCenter < 0) toCenter += 360f; + + float currAngle = Random.Float(360f); + for( int i = 0; i < 4; i ++){ + float newAngle = Random.Float(360f); + if (Math.abs(toCenter - newAngle) < Math.abs(toCenter - currAngle)){ + currAngle = newAngle; + } + } + return currAngle; + } + } } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/builders/RegularBuilder.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/builders/RegularBuilder.java index f0494268f..1604ca85f 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/builders/RegularBuilder.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/builders/RegularBuilder.java @@ -47,7 +47,7 @@ public abstract class RegularBuilder extends Builder { } //path length is the percentage of pathable rooms that are on - protected float pathLength = 0.67f; + protected float pathLength = 0.6f; //The chance weights for extra rooms to be added to the path protected float[] pathLenJitterChances = new float[]{1, 0, 0}; @@ -66,7 +66,7 @@ public abstract class RegularBuilder extends Builder { return this; } - protected float extraConnectionChance = 0.1f; + protected float extraConnectionChance = 0.2f; public RegularBuilder setExtraConnectionChance( float chance ){ extraConnectionChance = chance; @@ -112,7 +112,7 @@ public abstract class RegularBuilder extends Builder { // *** Branch Placement *** - protected static void weightRooms(ArrayList rooms){ + protected void weightRooms(ArrayList rooms){ for (Room r : rooms.toArray(new Room[0])){ if (r instanceof StandardRoom){ for (int i = 1; i < ((StandardRoom) r).sizeCat.connectionWeight(); i++) @@ -123,7 +123,7 @@ public abstract class RegularBuilder extends Builder { //places the rooms in roomsToBranch into branches from rooms in branchable. //note that the three arrays should be separate, they may contain the same rooms however - protected static void createBranches(ArrayList rooms, ArrayList branchable, + protected void createBranches(ArrayList rooms, ArrayList branchable, ArrayList roomsToBranch, float[] connChances){ int i = 0; @@ -139,12 +139,12 @@ public abstract class RegularBuilder extends Builder { int connectingRooms = Random.chances(connChances); for (int j = 0; j < connectingRooms; j++){ ConnectionRoom t = ConnectionRoom.createRoom(); - tries = 10; + tries = 3; do { - angle = placeRoom(rooms, curr, t, Random.Float(360f)); + angle = placeRoom(rooms, curr, t, randomBranchAngle(curr)); tries--; - } while (angle == -1 && tries >= 0); + } while (angle == -1 && tries > 0); if (angle == -1) { for (Room r : connectingRoomsThisBranch){ @@ -170,9 +170,9 @@ public abstract class RegularBuilder extends Builder { tries = 10; do { - angle = placeRoom(rooms, curr, r, Random.Float(360f)); + angle = placeRoom(rooms, curr, r, randomBranchAngle(curr)); tries--; - } while (angle == -1 && tries >= 0); + } while (angle == -1 && tries > 0); if (angle == -1){ for (Room t : connectingRoomsThisBranch){ @@ -200,4 +200,8 @@ public abstract class RegularBuilder extends Builder { } } + protected float randomBranchAngle( Room r ){ + return Random.Float(360f); + } + }