/* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */ package dungeon; import java.util.ArrayList; import java.util.LinkedList; import java.util.List; import main.Counter; import main.Dice; import org.jgraph.graph.DefaultEdge; import org.jgrapht.UndirectedGraph; import org.jgrapht.graph.SimpleGraph; /** * * @author MrMcX */ public class Dungeon { private final List rooms; private final LinkedList toGenerate; private final Counter counter; public Dungeon(int size, Type isNatural, Mode mode){ rooms = new ArrayList<>(); toGenerate = new LinkedList<>(); counter = new Counter(); generate(size, isNatural, mode); } private void generate(int size, Type isNatural, Mode mode){ toGenerate.add(Room.RandomRoom(true, Exit.Start(), counter, isNatural)); while(!toGenerate.isEmpty() && rooms.size() < size){ Room next; switch(mode){ case STRAIGHT: next = toGenerate.getLast(); break; case BRANCHED: next = toGenerate.getFirst(); break; case RANDOM: next = toGenerate.get(Dice.Roll(toGenerate.size(), 1)-1); break; default: next = toGenerate.getFirst(); break; } next.generate(counter, isNatural).stream().forEach((r) -> { toGenerate.add(r); }); toGenerate.remove(next); rooms.add(next); } } @Override public String toString(){ return rooms.stream().map((r) -> r.toLongString() + "\n").reduce("", String::concat); } public UndirectedGraph toGraph(){ UndirectedGraph g = new SimpleGraph(DefaultEdge.class); rooms.stream().forEach((r) -> { g.addVertex(r); }); rooms.stream().forEach((r) -> { for(Exit e : r.exits){ if(e.isStart || e.room.number == 0 || g.containsEdge(r, e.room)){ continue; } g.addEdge(r, e.room, e); } }); return g; } public static enum Mode{ STRAIGHT, BRANCHED, RANDOM } public static enum Type{ NATURAL, ARTIFICIAL } }