V0.1.0 Partial Commit
changed package and application names to differentiate from main PD release
This commit is contained in:
@@ -0,0 +1,345 @@
|
||||
/*
|
||||
* 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 <http://www.gnu.org/licenses/>
|
||||
*/
|
||||
package com.shatteredpixel.shatteredpixeldungeon.windows;
|
||||
|
||||
import java.util.Locale;
|
||||
|
||||
import com.watabou.noosa.BitmapText;
|
||||
import com.watabou.noosa.ColorBlock;
|
||||
import com.watabou.noosa.Game;
|
||||
import com.watabou.noosa.Group;
|
||||
import com.watabou.noosa.Image;
|
||||
import com.watabou.noosa.audio.Sample;
|
||||
import com.watabou.noosa.ui.Button;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.Assets;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.Badges;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.Statistics;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Belongings;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.items.Item;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.scenes.PixelScene;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.sprites.HeroSprite;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.ui.BadgesList;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.ui.Icons;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.ui.ItemSlot;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.ui.ScrollPane;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.utils.Utils;
|
||||
|
||||
public class WndRanking extends WndTabbed {
|
||||
|
||||
private static final String TXT_ERROR = "Unable to load additional information";
|
||||
|
||||
private static final String TXT_STATS = "Stats";
|
||||
private static final String TXT_ITEMS = "Items";
|
||||
private static final String TXT_BADGES = "Badges";
|
||||
|
||||
private static final int WIDTH = 112;
|
||||
private static final int HEIGHT = 144;
|
||||
|
||||
private static final int TAB_WIDTH = 40;
|
||||
|
||||
private Thread thread;
|
||||
private String error = null;
|
||||
|
||||
private Image busy;
|
||||
|
||||
public WndRanking( final String gameFile ) {
|
||||
|
||||
super();
|
||||
resize( WIDTH, HEIGHT );
|
||||
|
||||
thread = new Thread() {
|
||||
@Override
|
||||
public void run() {
|
||||
try {
|
||||
Badges.loadGlobal();
|
||||
Dungeon.loadGame( gameFile );
|
||||
} catch (Exception e ) {
|
||||
error = TXT_ERROR;
|
||||
}
|
||||
}
|
||||
};
|
||||
thread.start();
|
||||
|
||||
busy = Icons.BUSY.get();
|
||||
busy.origin.set( busy.width / 2, busy.height / 2 );
|
||||
busy.angularSpeed = 720;
|
||||
busy.x = (WIDTH - busy.width) / 2;
|
||||
busy.y = (HEIGHT - busy.height) / 2;
|
||||
add( busy );
|
||||
}
|
||||
|
||||
@Override
|
||||
public void update() {
|
||||
super.update();
|
||||
|
||||
if (thread != null && !thread.isAlive()) {
|
||||
thread = null;
|
||||
if (error == null) {
|
||||
remove( busy );
|
||||
createControls();
|
||||
} else {
|
||||
hide();
|
||||
Game.scene().add( new WndError( TXT_ERROR ) );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void createControls() {
|
||||
|
||||
String[] labels =
|
||||
{TXT_STATS, TXT_ITEMS, TXT_BADGES};
|
||||
Group[] pages =
|
||||
{new StatsTab(), new ItemsTab(), new BadgesTab()};
|
||||
|
||||
for (int i=0; i < pages.length; i++) {
|
||||
|
||||
add( pages[i] );
|
||||
|
||||
Tab tab = new RankingTab( labels[i], pages[i] );
|
||||
tab.setSize( TAB_WIDTH, tabHeight() );
|
||||
add( tab );
|
||||
}
|
||||
|
||||
select( 0 );
|
||||
}
|
||||
|
||||
private class RankingTab extends LabeledTab {
|
||||
|
||||
private Group page;
|
||||
|
||||
public RankingTab( String label, Group page ) {
|
||||
super( label );
|
||||
this.page = page;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void select( boolean value ) {
|
||||
super.select( value );
|
||||
if (page != null) {
|
||||
page.visible = page.active = selected;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private class StatsTab extends Group {
|
||||
|
||||
private static final int GAP = 4;
|
||||
|
||||
private static final String TXT_TITLE = "Level %d %s";
|
||||
|
||||
private static final String TXT_HEALTH = "Health";
|
||||
private static final String TXT_STR = "Strength";
|
||||
|
||||
private static final String TXT_DURATION = "Game Duration";
|
||||
|
||||
private static final String TXT_DEPTH = "Maximum Depth";
|
||||
private static final String TXT_ENEMIES = "Mobs Killed";
|
||||
private static final String TXT_GOLD = "Gold Collected";
|
||||
|
||||
private static final String TXT_FOOD = "Food Eaten";
|
||||
private static final String TXT_ALCHEMY = "Potions Cooked";
|
||||
private static final String TXT_ANKHS = "Ankhs Used";
|
||||
|
||||
public StatsTab() {
|
||||
super();
|
||||
|
||||
String heroClass = Dungeon.hero.className();
|
||||
|
||||
IconTitle title = new IconTitle();
|
||||
title.icon( HeroSprite.avatar( Dungeon.hero.heroClass, Dungeon.hero.tier() ) );
|
||||
title.label( Utils.format( TXT_TITLE, Dungeon.hero.lvl, heroClass ).toUpperCase( Locale.ENGLISH ) );
|
||||
title.setRect( 0, 0, WIDTH, 0 );
|
||||
add( title );
|
||||
|
||||
float pos = title.bottom() + GAP + GAP;
|
||||
|
||||
pos = statSlot( this, TXT_STR, Integer.toString( Dungeon.hero.STR ), pos );
|
||||
pos = statSlot( this, TXT_HEALTH, Integer.toString( Dungeon.hero.HT ), pos );
|
||||
|
||||
pos += GAP;
|
||||
|
||||
pos = statSlot( this, TXT_DURATION, Integer.toString( (int)Statistics.duration ), pos );
|
||||
|
||||
pos += GAP;
|
||||
|
||||
pos = statSlot( this, TXT_DEPTH, Integer.toString( Statistics.deepestFloor ), pos );
|
||||
pos = statSlot( this, TXT_ENEMIES, Integer.toString( Statistics.enemiesSlain ), pos );
|
||||
pos = statSlot( this, TXT_GOLD, Integer.toString( Statistics.goldCollected ), pos );
|
||||
|
||||
pos += GAP;
|
||||
|
||||
pos = statSlot( this, TXT_FOOD, Integer.toString( Statistics.foodEaten ), pos );
|
||||
pos = statSlot( this, TXT_ALCHEMY, Integer.toString( Statistics.potionsCooked ), pos );
|
||||
pos = statSlot( this, TXT_ANKHS, Integer.toString( Statistics.ankhsUsed ), pos );
|
||||
}
|
||||
|
||||
private float statSlot( Group parent, String label, String value, float pos ) {
|
||||
|
||||
BitmapText txt = PixelScene.createText( label, 7 );
|
||||
txt.y = pos;
|
||||
parent.add( txt );
|
||||
|
||||
txt = PixelScene.createText( value, 7 );
|
||||
txt.measure();
|
||||
txt.x = PixelScene.align( WIDTH * 0.65f );
|
||||
txt.y = pos;
|
||||
parent.add( txt );
|
||||
|
||||
return pos + GAP + txt.baseLine();
|
||||
}
|
||||
}
|
||||
|
||||
private class ItemsTab extends Group {
|
||||
|
||||
private float pos;
|
||||
|
||||
public ItemsTab() {
|
||||
super();
|
||||
|
||||
Belongings stuff = Dungeon.hero.belongings;
|
||||
if (stuff.weapon != null) {
|
||||
addItem( stuff.weapon );
|
||||
}
|
||||
if (stuff.armor != null) {
|
||||
addItem( stuff.armor );
|
||||
}
|
||||
if (stuff.ring1 != null) {
|
||||
addItem( stuff.ring1 );
|
||||
}
|
||||
if (stuff.ring2 != null) {
|
||||
addItem( stuff.ring2 );
|
||||
}
|
||||
|
||||
if (Dungeon.quickslot instanceof Item &&
|
||||
Dungeon.hero.belongings.backpack.contains( (Item)Dungeon.quickslot )) {
|
||||
|
||||
addItem( (Item)Dungeon.quickslot );
|
||||
} else if (Dungeon.quickslot instanceof Class){
|
||||
@SuppressWarnings("unchecked")
|
||||
Item item = Dungeon.hero.belongings.getItem( (Class<? extends Item>)Dungeon.quickslot );
|
||||
if (item != null) {
|
||||
addItem( item );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void addItem( Item item ) {
|
||||
ItemButton slot = new ItemButton( item );
|
||||
slot.setRect( 0, pos, width, ItemButton.HEIGHT );
|
||||
add( slot );
|
||||
|
||||
pos += slot.height() + 1;
|
||||
}
|
||||
}
|
||||
|
||||
private class BadgesTab extends Group {
|
||||
|
||||
public BadgesTab() {
|
||||
super();
|
||||
|
||||
camera = WndRanking.this.camera;
|
||||
|
||||
ScrollPane list = new BadgesList( false );
|
||||
add( list );
|
||||
|
||||
list.setSize( WIDTH, HEIGHT );
|
||||
}
|
||||
}
|
||||
|
||||
private class ItemButton extends Button {
|
||||
|
||||
public static final int HEIGHT = 28;
|
||||
|
||||
private Item item;
|
||||
|
||||
private ItemSlot slot;
|
||||
private ColorBlock bg;
|
||||
private BitmapText name;
|
||||
|
||||
public ItemButton( Item item ) {
|
||||
|
||||
super();
|
||||
|
||||
this.item = item;
|
||||
|
||||
slot.item( item );
|
||||
if (item.cursed && item.cursedKnown) {
|
||||
bg.ra = +0.2f;
|
||||
bg.ga = -0.1f;
|
||||
} else if (!item.isIdentified()) {
|
||||
bg.ra = 0.1f;
|
||||
bg.ba = 0.1f;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void createChildren() {
|
||||
|
||||
bg = new ColorBlock( HEIGHT, HEIGHT, 0xFF4A4D44 );
|
||||
add( bg );
|
||||
|
||||
slot = new ItemSlot();
|
||||
add( slot );
|
||||
|
||||
name = PixelScene.createText( "?", 7 );
|
||||
add( name );
|
||||
|
||||
super.createChildren();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void layout() {
|
||||
bg.x = x;
|
||||
bg.y = y;
|
||||
|
||||
slot.setRect( x, y, HEIGHT, HEIGHT );
|
||||
|
||||
name.x = slot.right() + 2;
|
||||
name.y = y + (height - name.baseLine()) / 2;
|
||||
|
||||
String str = Utils.capitalize( item.name() );
|
||||
name.text( str );
|
||||
name.measure();
|
||||
if (name.width() > width - name.x) {
|
||||
do {
|
||||
str = str.substring( 0, str.length() - 1 );
|
||||
name.text( str + "..." );
|
||||
name.measure();
|
||||
} while (name.width() > width - name.x);
|
||||
}
|
||||
|
||||
super.layout();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onTouchDown() {
|
||||
bg.brightness( 1.5f );
|
||||
Sample.INSTANCE.play( Assets.SND_CLICK, 0.7f, 0.7f, 1.2f );
|
||||
};
|
||||
|
||||
protected void onTouchUp() {
|
||||
bg.brightness( 1.0f );
|
||||
};
|
||||
|
||||
@Override
|
||||
protected void onClick() {
|
||||
Game.scene().add( new WndItem( null, item ) );
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user