/* * Pixel Dungeon * Copyright (C) 2012-2014 Oleg Dolya * * 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 */ package com.shatteredpixel.shatteredpixeldungeon.levels; import com.shatteredpixel.shatteredpixeldungeon.Assets; import com.shatteredpixel.shatteredpixeldungeon.Bones; 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.Item; import com.shatteredpixel.shatteredpixeldungeon.levels.Room.Type; import com.watabou.noosa.Scene; import com.watabou.utils.Graph; import com.watabou.utils.Random; import java.util.List; public class LastShopLevel extends RegularLevel { { color1 = 0x4b6636; color2 = 0xf2f2f2; } @Override public String tilesTex() { return Assets.TILES_CITY; } @Override public String waterTex() { return Assets.WATER_CITY; } @Override protected boolean build() { initRooms(); int distance; int retry = 0; int minDistance = (int)Math.sqrt( rooms.size() ); do { int innerRetry = 0; do { if (innerRetry++ > 10) { return false; } roomEntrance = Random.element( rooms ); } while (roomEntrance.width() < 4 || roomEntrance.height() < 4); innerRetry = 0; do { if (innerRetry++ > 10) { return false; } roomExit = Random.element( rooms ); } while (roomExit == roomEntrance || roomExit.width() < 6 || roomExit.height() < 6 || roomExit.top == 0); Graph.buildDistanceMap( rooms, roomExit ); distance = Graph.buildPath( rooms, roomEntrance, roomExit ).size(); if (retry++ > 10) { return false; } } while (distance < minDistance); roomEntrance.type = Type.ENTRANCE; roomExit.type = Type.EXIT; Graph.buildDistanceMap( rooms, roomExit ); List path = Graph.buildPath( rooms, roomEntrance, roomExit ); Graph.setPrice( path, roomEntrance.distance ); Graph.buildDistanceMap( rooms, roomExit ); path = Graph.buildPath( rooms, roomEntrance, roomExit ); Room room = roomEntrance; for (Room next : path) { room.connect( next ); room = next; } Room roomShop = null; int shopSquare = 0; for (Room r : rooms) { if (r.type == Type.NULL && r.connected.size() > 0) { r.type = Type.PASSAGE; if (r.square() > shopSquare) { roomShop = r; shopSquare = r.square(); } } } if (roomShop == null || shopSquare < 30) { return false; } else { roomShop.type = Imp.Quest.isCompleted() ? Room.Type.SHOP : Room.Type.STANDARD; } paint(); paintWater(); paintGrass(); 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; } else if (map[i] == Terrain.SECRET_DOOR) { map[i] = Terrain.DOOR; } } if (Imp.Quest.isCompleted()) { while (true) { int pos = roomEntrance.random(); if (pos != entrance) { map[pos] = Terrain.SIGN; break; } } } } @Override protected void createMobs() { } public Actor respawner() { return null; } @Override protected void createItems() { Item item = Bones.get(); if (item != null) { int pos; do { pos = roomEntrance.random(); } while (pos == entrance || map[pos] == Terrain.SIGN); drop( item, pos ).type = Heap.Type.REMAINS; } } @Override public int randomRespawnCell() { return -1; } @Override public String tileName( int tile ) { switch (tile) { case Terrain.WATER: return "Suspiciously colored water"; case Terrain.HIGH_GRASS: return "High blooming flowers"; default: return super.tileName( tile ); } } @Override public String tileDesc(int tile) { switch (tile) { case Terrain.ENTRANCE: return "A ramp leads up to the upper depth."; case Terrain.EXIT: return "A ramp leads down to the Inferno."; case Terrain.WALL_DECO: case Terrain.EMPTY_DECO: return "Several tiles are missing here."; case Terrain.EMPTY_SP: return "Thick carpet covers the floor."; default: return super.tileDesc( tile ); } } @Override protected boolean[] water() { return Patch.generate( 0.35f, 4 ); } @Override protected boolean[] grass() { return Patch.generate( 0.30f, 3 ); } @Override public void addVisuals( Scene scene ) { CityLevel.addVisuals( this, scene ); } }