2014-07-27 13:39:07 +00:00
|
|
|
/*
|
|
|
|
* 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/>
|
|
|
|
*/
|
2014-08-03 18:46:22 +00:00
|
|
|
package com.shatteredpixel.shatteredpixeldungeon.windows;
|
2014-07-27 13:39:07 +00:00
|
|
|
|
|
|
|
import java.util.Locale;
|
|
|
|
|
2014-10-20 07:24:59 +00:00
|
|
|
|
2014-07-27 13:39:07 +00:00
|
|
|
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;
|
2014-08-03 18:46:22 +00:00
|
|
|
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;
|
2014-10-20 07:24:59 +00:00
|
|
|
import com.shatteredpixel.shatteredpixeldungeon.ui.BadgesList;
|
|
|
|
import com.shatteredpixel.shatteredpixeldungeon.ui.Icons;
|
|
|
|
import com.shatteredpixel.shatteredpixeldungeon.ui.ItemSlot;
|
|
|
|
import com.shatteredpixel.shatteredpixeldungeon.ui.RedButton;
|
|
|
|
import com.shatteredpixel.shatteredpixeldungeon.ui.ScrollPane;
|
|
|
|
import com.shatteredpixel.shatteredpixeldungeon.ui.Window;
|
2014-08-03 18:46:22 +00:00
|
|
|
import com.shatteredpixel.shatteredpixeldungeon.utils.Utils;
|
2014-07-27 13:39:07 +00:00
|
|
|
|
|
|
|
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";
|
|
|
|
|
2015-01-21 13:59:39 +00:00
|
|
|
private static final int WIDTH = 115;
|
2014-07-27 13:39:07 +00:00
|
|
|
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;
|
|
|
|
|
2014-10-12 04:03:23 +00:00
|
|
|
private static final String TXT_TITLE = "Level %d %s";
|
2014-10-20 07:24:59 +00:00
|
|
|
|
|
|
|
private static final String TXT_CHALLENGES = "Challenges";
|
|
|
|
|
2014-07-27 13:39:07 +00:00
|
|
|
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 ) );
|
2014-10-12 04:03:23 +00:00
|
|
|
title.color(Window.SHPX_COLOR);
|
2014-07-27 13:39:07 +00:00
|
|
|
title.setRect( 0, 0, WIDTH, 0 );
|
|
|
|
add( title );
|
|
|
|
|
2014-10-20 07:24:59 +00:00
|
|
|
float pos = title.bottom();
|
|
|
|
|
|
|
|
if (Dungeon.challenges > 0) {
|
|
|
|
RedButton btnCatalogus = new RedButton( TXT_CHALLENGES ) {
|
|
|
|
@Override
|
|
|
|
protected void onClick() {
|
|
|
|
Game.scene().add( new WndChallenges( Dungeon.challenges, false ) );
|
|
|
|
}
|
|
|
|
};
|
|
|
|
btnCatalogus.setRect( 0, pos + GAP, btnCatalogus.reqWidth() + 2, btnCatalogus.reqHeight() + 2 );
|
|
|
|
add( btnCatalogus );
|
|
|
|
|
|
|
|
pos = btnCatalogus.bottom();
|
|
|
|
}
|
|
|
|
|
|
|
|
pos += GAP + GAP;
|
2014-07-27 13:39:07 +00:00
|
|
|
|
|
|
|
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 );
|
|
|
|
}
|
2014-08-25 03:55:10 +00:00
|
|
|
if (stuff.misc1 != null) {
|
|
|
|
addItem( stuff.misc1);
|
2014-07-27 13:39:07 +00:00
|
|
|
}
|
2014-08-25 03:55:10 +00:00
|
|
|
if (stuff.misc2 != null) {
|
|
|
|
addItem( stuff.misc2);
|
2014-07-27 13:39:07 +00:00
|
|
|
}
|
2015-01-19 17:01:04 +00:00
|
|
|
|
2015-01-21 13:59:39 +00:00
|
|
|
pos = 29;
|
2015-01-20 14:40:01 +00:00
|
|
|
for (int i = 0; i < 2; i++){
|
|
|
|
if (Dungeon.quickslot.getItem(i) != null){
|
|
|
|
QuickSlotButton slot = new QuickSlotButton(Dungeon.quickslot.getItem(i));
|
|
|
|
|
2015-01-22 01:22:36 +00:00
|
|
|
slot.setRect( pos, 116, 28, 28 );
|
2015-01-20 14:40:01 +00:00
|
|
|
|
2015-01-21 13:59:39 +00:00
|
|
|
add(slot);
|
|
|
|
|
2015-01-20 14:40:01 +00:00
|
|
|
} else {
|
|
|
|
ColorBlock bg = new ColorBlock( 28, 28, 0xFF4A4D44);
|
|
|
|
bg.x = pos;
|
|
|
|
bg.y = 116;
|
|
|
|
add(bg);
|
|
|
|
}
|
|
|
|
pos += 29;
|
|
|
|
}
|
2014-07-27 13:39:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
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 ) );
|
|
|
|
}
|
|
|
|
}
|
2015-01-20 14:40:01 +00:00
|
|
|
|
|
|
|
private class QuickSlotButton extends ItemSlot{
|
|
|
|
|
|
|
|
public static final int HEIGHT = 28;
|
|
|
|
|
|
|
|
private Item item;
|
|
|
|
private ColorBlock bg;
|
|
|
|
|
|
|
|
QuickSlotButton(Item item){
|
|
|
|
super(item);
|
|
|
|
this.item = item;
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
protected void createChildren() {
|
|
|
|
bg = new ColorBlock( HEIGHT, HEIGHT, 0xFF4A4D44 );
|
|
|
|
add( bg );
|
|
|
|
|
|
|
|
super.createChildren();
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
protected void layout() {
|
|
|
|
bg.x = x;
|
|
|
|
bg.y = y;
|
|
|
|
|
|
|
|
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));
|
|
|
|
}
|
|
|
|
}
|
2014-07-27 13:39:07 +00:00
|
|
|
}
|