v0.6.1: improved journal window code and items tab

This commit is contained in:
Evan Debenham 2017-07-06 05:25:39 -04:00
parent 3fccd85589
commit 41da332ef9
4 changed files with 151 additions and 370 deletions

View File

@ -38,6 +38,7 @@ import com.watabou.utils.Random;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.HashSet;
public class Ring extends KindofMisc { public class Ring extends KindofMisc {
@ -207,6 +208,14 @@ public class Ring extends KindofMisc {
return this; return this;
} }
public static HashSet<Class<? extends Ring>> getKnown() {
return handler.known();
}
public static HashSet<Class<? extends Ring>> getUnknown() {
return handler.unknown();
}
public static boolean allKnown() { public static boolean allKnown() {
return handler.known().size() == rings.length - 2; return handler.known().size() == rings.length - 2;
} }

View File

@ -31,7 +31,6 @@ import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene;
import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSprite; import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSprite;
import com.shatteredpixel.shatteredpixeldungeon.tiles.DungeonTilemap; import com.shatteredpixel.shatteredpixeldungeon.tiles.DungeonTilemap;
import com.shatteredpixel.shatteredpixeldungeon.windows.WndBag; import com.shatteredpixel.shatteredpixeldungeon.windows.WndBag;
import com.shatteredpixel.shatteredpixeldungeon.windows.WndCatalogs;
import com.watabou.noosa.Game; import com.watabou.noosa.Game;
import com.watabou.noosa.Gizmo; import com.watabou.noosa.Gizmo;
import com.watabou.noosa.Image; import com.watabou.noosa.Image;
@ -122,13 +121,6 @@ public class Toolbar extends Component {
GameScene.show(new WndBag(Dungeon.hero.belongings.backpack, null, WndBag.Mode.ALL, null)); GameScene.show(new WndBag(Dungeon.hero.belongings.backpack, null, WndBag.Mode.ALL, null));
} }
protected boolean onLongClick() {
GameScene.show(new WndCatalogs());
return true;
}
;
@Override @Override
protected void createChildren() { protected void createChildren() {
super.createChildren(); super.createChildren();

View File

@ -1,218 +0,0 @@
/*
* Pixel Dungeon
* Copyright (C) 2012-2015 Oleg Dolya
*
* Shattered Pixel Dungeon
* Copyright (C) 2014-2017 Evan Debenham
*
* 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 com.shatteredpixel.shatteredpixeldungeon.ShatteredPixelDungeon;
import com.shatteredpixel.shatteredpixeldungeon.items.Item;
import com.shatteredpixel.shatteredpixeldungeon.items.potions.Potion;
import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.Scroll;
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene;
import com.shatteredpixel.shatteredpixeldungeon.scenes.PixelScene;
import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSprite;
import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet;
import com.shatteredpixel.shatteredpixeldungeon.ui.RedButton;
import com.shatteredpixel.shatteredpixeldungeon.ui.RenderedTextMultiline;
import com.shatteredpixel.shatteredpixeldungeon.ui.ScrollPane;
import com.shatteredpixel.shatteredpixeldungeon.ui.Window;
import com.watabou.noosa.ColorBlock;
import com.watabou.noosa.ui.Component;
import java.util.ArrayList;
public class WndCatalogs extends WndTabbed {
private static final int WIDTH = 112;
private static final int HEIGHT = 141;
private static final int ITEM_HEIGHT = 17;
private RedButton btnJournal;
private RedButton btnTitle;
private ScrollPane list;
private ArrayList<ListItem> items = new ArrayList<>();
private static boolean showPotions = true;
public WndCatalogs() {
super();
resize( WIDTH, HEIGHT );
btnJournal = new RedButton( Messages.get(WndJournal.class, "title"), 9 ){
@Override
protected void onClick() {
hide();
GameScene.show(new WndJournal());
}
};
btnJournal.setRect(0, 0, WIDTH/2f - 1, btnJournal.reqHeight());
PixelScene.align( btnJournal );
add( btnJournal );
//does nothing, we're already in the catalog
btnTitle = new RedButton( Messages.get(this, "title"), 9 );
btnTitle.textColor( Window.TITLE_COLOR );
btnTitle.setRect(WIDTH/2f+1, 0, WIDTH/2f - 1, btnTitle.reqHeight());
PixelScene.align(btnTitle);
add( btnTitle );
list = new ScrollPane( new Component() ) {
@Override
public void onClick( float x, float y ) {
int size = items.size();
for (int i=0; i < size; i++) {
if (items.get( i ).onClick( x, y )) {
break;
}
}
}
};
add( list );
list.setRect( 0, btnTitle.height() + 1, width, height - btnTitle.height() - 1 );
boolean showPotions = WndCatalogs.showPotions;
Tab[] tabs = {
new LabeledTab( Messages.get(this, "potions") ) {
protected void select( boolean value ) {
super.select( value );
WndCatalogs.showPotions = value;
updateList();
};
},
new LabeledTab( Messages.get(this, "scrolls") ) {
protected void select( boolean value ) {
super.select( value );
WndCatalogs.showPotions = !value;
updateList();
};
}
};
for (Tab tab : tabs) {
add( tab );
}
layoutTabs();
select( showPotions ? 0 : 1 );
}
private void updateList() {
items.clear();
Component content = list.content();
content.clear();
list.scrollTo( 0, 0 );
float pos = 0;
for (Class<? extends Item> itemClass : showPotions ? Potion.getKnown() : Scroll.getKnown()) {
ListItem item = new ListItem( itemClass );
item.setRect( 0, pos, width, ITEM_HEIGHT );
content.add( item );
items.add( item );
pos += item.height();
}
for (Class<? extends Item> itemClass : showPotions ? Potion.getUnknown() : Scroll.getUnknown()) {
ListItem item = new ListItem( itemClass );
item.setRect( 0, pos, width, ITEM_HEIGHT );
content.add( item );
items.add( item );
pos += item.height();
}
content.setSize( width, pos );
list.setSize( list.width(), list.height() );
}
private static class ListItem extends Component {
private Item item;
private boolean identified;
private ItemSprite sprite;
private RenderedTextMultiline label;
private ColorBlock line;
public ListItem( Class<? extends Item> cl ) {
super();
try {
item = cl.newInstance();
if (identified = item.isIdentified()) {
sprite.view( item.image(), null );
label.text( Messages.titleCase(item.name()) );
} else {
sprite.view( ItemSpriteSheet.SOMETHING, null );
label.text( Messages.titleCase(item.trueName()) );
label.hardlight( 0xCCCCCC );
}
} catch (Exception e) {
ShatteredPixelDungeon.reportException(e);
}
}
@Override
protected void createChildren() {
sprite = new ItemSprite();
add( sprite );
label = PixelScene.renderMultiline( 7 );
add( label );
line = new ColorBlock( 1, 1, 0xFF222222);
add(line);
}
@Override
protected void layout() {
sprite.y = y + 1 + (height - 1 - sprite.height) / 2f;
PixelScene.align(sprite);
line.size(width, 1);
line.x = 0;
line.y = y;
label.maxWidth((int)(width - sprite.width - 1));
label.setPos(sprite.x + sprite.width + 1, y + 1 + (height - 1 - label.height()) / 2f);
PixelScene.align(label);
}
public boolean onClick( float x, float y ) {
if (inside( x, y )) {
if (identified)
GameScene.show( new WndInfoItem( item ) );
else
GameScene.show( new WndTitledMessage( new ItemSprite(ItemSpriteSheet.SOMETHING, null),
Messages.titleCase(item.trueName()), item.desc() ));
return true;
} else {
return false;
}
}
}
}

View File

@ -24,11 +24,13 @@ package com.shatteredpixel.shatteredpixeldungeon.windows;
import com.shatteredpixel.shatteredpixeldungeon.Dungeon; import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
import com.shatteredpixel.shatteredpixeldungeon.Journal; import com.shatteredpixel.shatteredpixeldungeon.Journal;
import com.shatteredpixel.shatteredpixeldungeon.ShatteredPixelDungeon; import com.shatteredpixel.shatteredpixeldungeon.ShatteredPixelDungeon;
import com.shatteredpixel.shatteredpixeldungeon.items.Generator;
import com.shatteredpixel.shatteredpixeldungeon.items.Item; import com.shatteredpixel.shatteredpixeldungeon.items.Item;
import com.shatteredpixel.shatteredpixeldungeon.items.keys.GoldenKey; import com.shatteredpixel.shatteredpixeldungeon.items.keys.GoldenKey;
import com.shatteredpixel.shatteredpixeldungeon.items.keys.IronKey; import com.shatteredpixel.shatteredpixeldungeon.items.keys.IronKey;
import com.shatteredpixel.shatteredpixeldungeon.items.keys.SkeletonKey; import com.shatteredpixel.shatteredpixeldungeon.items.keys.SkeletonKey;
import com.shatteredpixel.shatteredpixeldungeon.items.potions.Potion; import com.shatteredpixel.shatteredpixeldungeon.items.potions.Potion;
import com.shatteredpixel.shatteredpixeldungeon.items.rings.Ring;
import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.Scroll; import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.Scroll;
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages; import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene; import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene;
@ -45,6 +47,7 @@ import com.watabou.noosa.Image;
import com.watabou.noosa.ui.Component; import com.watabou.noosa.ui.Component;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections; import java.util.Collections;
//FIXME a lot of cleanup and improvements to do here //FIXME a lot of cleanup and improvements to do here
@ -106,7 +109,72 @@ public class WndJournal extends WndTabbed {
select(last_index); select(last_index);
} }
private static class Notes extends Component{ private static class ListItem extends Component {
protected RenderedTextMultiline label;
protected BitmapText depth;
protected ColorBlock line;
protected Image icon;
public ListItem( Image icon, String text ) {
this(icon, text, -1);
}
public ListItem( Image icon, String text, int d ) {
super();
this.icon.copy(icon);
label.text( text );
if (d >= 0) {
depth.text(Integer.toString(d));
depth.measure();
if (d == Dungeon.depth) {
label.hardlight(TITLE_COLOR);
depth.hardlight(TITLE_COLOR);
}
}
}
@Override
protected void createChildren() {
label = PixelScene.renderMultiline( 7 );
add( label );
icon = new Image();
add( icon );
depth = new BitmapText( PixelScene.pixelFont);
add( depth );
line = new ColorBlock( 1, 1, 0xFF222222);
add(line);
}
@Override
protected void layout() {
icon.y = y + 1 + (height() - 1 - icon.height()) / 2f;
PixelScene.align(icon);
depth.x = icon.x + (icon.width - depth.width()) / 2f;
depth.y = icon.y + (icon.height - depth.height()) / 2f + 1;
PixelScene.align(depth);
line.size(width, 1);
line.x = 0;
line.y = y;
label.maxWidth((int)(width - icon.width() - 8 - 1));
label.setPos(icon.x + icon.width() + 1, y + 1 + (height() - label.height()) / 2f);
PixelScene.align(label);
}
}
private static class Notes extends Component {
private ScrollPane list; private ScrollPane list;
@ -140,7 +208,7 @@ public class WndJournal extends WndTabbed {
if (Dungeon.hero.belongings.specialKeys[i] > 1){ if (Dungeon.hero.belongings.specialKeys[i] > 1){
text += " x" + Dungeon.hero.belongings.specialKeys[i]; text += " x" + Dungeon.hero.belongings.specialKeys[i];
} }
ListItem item = new ListItem( Messages.titleCase(text), i ); ListItem item = new ListItem( Icons.get(Icons.DEPTH), Messages.titleCase(text), i );
item.setRect( 0, pos, WIDTH, ITEM_HEIGHT ); item.setRect( 0, pos, WIDTH, ITEM_HEIGHT );
content.add( item ); content.add( item );
@ -153,7 +221,7 @@ public class WndJournal extends WndTabbed {
text += " x" + Dungeon.hero.belongings.ironKeys[i]; text += " x" + Dungeon.hero.belongings.ironKeys[i];
} }
ListItem item = new ListItem( text, i ); ListItem item = new ListItem( Icons.get(Icons.DEPTH), text, i );
item.setRect( 0, pos, WIDTH, ITEM_HEIGHT ); item.setRect( 0, pos, WIDTH, ITEM_HEIGHT );
content.add( item ); content.add( item );
@ -164,7 +232,7 @@ public class WndJournal extends WndTabbed {
//Journal entries //Journal entries
for (Journal.Record rec : Journal.records) { for (Journal.Record rec : Journal.records) {
ListItem item = new ListItem( rec.feature.desc(), rec.depth ); ListItem item = new ListItem( Icons.get(Icons.DEPTH), rec.feature.desc(), rec.depth );
item.setRect( 0, pos, WIDTH, ITEM_HEIGHT ); item.setRect( 0, pos, WIDTH, ITEM_HEIGHT );
content.add( item ); content.add( item );
@ -174,78 +242,19 @@ public class WndJournal extends WndTabbed {
content.setSize( WIDTH, pos ); content.setSize( WIDTH, pos );
} }
private static class ListItem extends Component {
private RenderedTextMultiline label;
private BitmapText depth;
private ColorBlock line;
private Image icon;
public ListItem( String text ) {
this(text, -1);
}
public ListItem( String text, int d ) {
super();
label.text( text );
if (d >= 0) {
depth.text(Integer.toString(d));
depth.measure();
if (d == Dungeon.depth) {
label.hardlight(TITLE_COLOR);
depth.hardlight(TITLE_COLOR);
}
}
}
@Override
protected void createChildren() {
label = PixelScene.renderMultiline( 7 );
add( label );
icon = Icons.get( Icons.DEPTH );
add( icon );
depth = new BitmapText( PixelScene.pixelFont);
add( depth );
line = new ColorBlock( 1, 1, 0xFF222222);
add(line);
}
@Override
protected void layout() {
icon.y = y + 1 + (height() - 1 - icon.height()) / 2f;
PixelScene.align(icon);
depth.x = icon.x + (icon.width - depth.width()) / 2f;
depth.y = icon.y + (icon.height - depth.height()) / 2f + 1;
PixelScene.align(depth);
line.size(width, 1);
line.x = 0;
line.y = y;
label.maxWidth((int)(width - icon.width() - 8 - 1));
label.setPos(icon.x + icon.width() + 1, y + 1 + (height() - 1 - label.height()) / 2f);
PixelScene.align(label);
}
}
} }
private static class Catalog extends Component{ private static class Catalog extends Component{
private RedButton btnPotions; private RedButton btnPotions;
private RedButton btnScrolls; private RedButton btnScrolls;
private RedButton btnRings;
private static int latestPressedIdx = 0;
private ScrollPane list; private ScrollPane list;
private ArrayList<ListItem> items = new ArrayList<>(); private ArrayList<CatalogItem> items = new ArrayList<>();
private static boolean showPotions = true; private static boolean showPotions = true;
@ -256,10 +265,8 @@ public class WndJournal extends WndTabbed {
btnPotions = new RedButton( "" ){ btnPotions = new RedButton( "" ){
@Override @Override
protected void onClick() { protected void onClick() {
if (!showPotions){ latestPressedIdx = 0;
showPotions = true; updateList();
updateList();
}
} }
}; };
btnPotions.icon(new ItemSprite(ItemSpriteSheet.POTION_HOLDER, null)); btnPotions.icon(new ItemSprite(ItemSpriteSheet.POTION_HOLDER, null));
@ -268,15 +275,23 @@ public class WndJournal extends WndTabbed {
btnScrolls = new RedButton( "" ){ btnScrolls = new RedButton( "" ){
@Override @Override
protected void onClick() { protected void onClick() {
if (showPotions){ latestPressedIdx = 1;
showPotions = false; updateList();
updateList();
}
} }
}; };
btnScrolls.icon(new ItemSprite(ItemSpriteSheet.SCROLL_HOLDER, null)); btnScrolls.icon(new ItemSprite(ItemSpriteSheet.SCROLL_HOLDER, null));
add( btnScrolls ); add( btnScrolls );
btnRings = new RedButton( "" ){
@Override
protected void onClick() {
latestPressedIdx = 2;
updateList();
}
};
btnRings.icon(new ItemSprite(ItemSpriteSheet.RING_HOLDER, null));
add( btnRings );
list = new ScrollPane( new Component() ) { list = new ScrollPane( new Component() ) {
@Override @Override
public void onClick( float x, float y ) { public void onClick( float x, float y ) {
@ -291,7 +306,7 @@ public class WndJournal extends WndTabbed {
add( list ); add( list );
} }
private static final int BUTTON_WIDTH = 55; private static final int BUTTON_WIDTH = 36;
private static final int BUTTON_HEIGHT = 18; private static final int BUTTON_HEIGHT = 18;
@Override @Override
@ -301,102 +316,85 @@ public class WndJournal extends WndTabbed {
btnPotions.setRect(0, 0, BUTTON_WIDTH, BUTTON_HEIGHT); btnPotions.setRect(0, 0, BUTTON_WIDTH, BUTTON_HEIGHT);
PixelScene.align( btnPotions ); PixelScene.align( btnPotions );
btnScrolls.setRect(width() - BUTTON_WIDTH, 0, BUTTON_WIDTH, BUTTON_HEIGHT); btnScrolls.setRect((width() - BUTTON_WIDTH)/2f, 0, BUTTON_WIDTH, BUTTON_HEIGHT);
PixelScene.align(btnScrolls); PixelScene.align(btnScrolls);
btnRings.setRect(width() - BUTTON_WIDTH, 0, BUTTON_WIDTH, BUTTON_HEIGHT);
PixelScene.align(btnRings);
list.setRect( 0, btnPotions.height() + 1, width, height - btnPotions.height() - 1 ); list.setRect( 0, btnPotions.height() + 1, width, height - btnPotions.height() - 1 );
} }
private void updateList() { private void updateList() {
if (showPotions){
btnPotions.textColor(TITLE_COLOR);
btnScrolls.textColor(0xFFFFFF);
} else {
btnPotions.textColor(0xFFFFFF);
btnScrolls.textColor(TITLE_COLOR);
}
items.clear(); items.clear();
Component content = list.content(); Component content = list.content();
content.clear(); content.clear();
list.scrollTo( 0, 0 ); list.scrollTo( 0, 0 );
float pos = 0; ArrayList<Class<?>> itemClasses;
for (Class<? extends Item> itemClass : showPotions ? Potion.getKnown() : Scroll.getKnown()) { if (latestPressedIdx == 0){
ListItem item = new ListItem( itemClass ); itemClasses = new ArrayList<>(Arrays.asList(Generator.Category.POTION.classes));
item.setRect( 0, pos, width, ITEM_HEIGHT ); for ( Class unknown : Potion.getUnknown()){
content.add( item ); if (itemClasses.remove(unknown)) itemClasses.add(unknown);
items.add( item ); }
} else if (latestPressedIdx == 1) {
pos += item.height(); itemClasses = new ArrayList<>(Arrays.asList(Generator.Category.SCROLL.classes));
for ( Class unknown : Scroll.getUnknown()){
if (itemClasses.remove(unknown)) itemClasses.add(unknown);
}
} else {
itemClasses = new ArrayList<>(Arrays.asList(Generator.Category.RING.classes));
for ( Class unknown : Ring.getUnknown()){
if (itemClasses.remove(unknown)) itemClasses.add(unknown);
}
} }
for (Class<? extends Item> itemClass : showPotions ? Potion.getUnknown() : Scroll.getUnknown()) { float pos = 0;
ListItem item = new ListItem( itemClass ); for (Class<?> itemClass : itemClasses) {
item.setRect( 0, pos, width, ITEM_HEIGHT ); try{
content.add( item ); CatalogItem item = new CatalogItem((Item) itemClass.newInstance());
items.add( item ); item.setRect( 0, pos, width, ITEM_HEIGHT );
content.add( item );
items.add( item );
pos += item.height(); pos += item.height();
} catch (Exception e) {
ShatteredPixelDungeon.reportException(e);
}
} }
content.setSize( width, pos ); content.setSize( width, pos );
list.setSize( list.width(), list.height() ); list.setSize( list.width(), list.height() );
} }
private static class ListItem extends Component { private static class CatalogItem extends ListItem {
private Item item; private Item item;
private boolean identified; private boolean identified;
private ItemSprite sprite; public CatalogItem(Item item ) {
private RenderedTextMultiline label; super( new ItemSprite(item), Messages.titleCase(item.name()));
private ColorBlock line;
public ListItem( Class<? extends Item> cl ) { this.item = item;
super();
try { if (!(identified = item.isIdentified())) {
item = cl.newInstance(); ItemSprite placeHolder;
if (identified = item.isIdentified()) { if (item instanceof Potion){
sprite.view( item.image(), null ); placeHolder = new ItemSprite( ItemSpriteSheet.POTION_HOLDER, null);
label.text( Messages.titleCase(item.name()) ); } else if (item instanceof Scroll){
placeHolder = new ItemSprite( ItemSpriteSheet.SCROLL_HOLDER, null);
} else if (item instanceof Ring){
placeHolder = new ItemSprite( ItemSpriteSheet.RING_HOLDER, null);
} else { } else {
sprite.view( showPotions ? ItemSpriteSheet.POTION_HOLDER : ItemSpriteSheet.SCROLL_HOLDER, null ); placeHolder = new ItemSprite( ItemSpriteSheet.SOMETHING, null);
label.text( Messages.titleCase(item.trueName()) );
label.hardlight( 0xCCCCCC );
} }
} catch (Exception e) { icon.copy( placeHolder );
ShatteredPixelDungeon.reportException(e); label.text( Messages.titleCase(item.trueName()) );
label.hardlight( 0xCCCCCC );
} }
}
@Override
protected void createChildren() {
sprite = new ItemSprite();
add( sprite );
label = PixelScene.renderMultiline( 7 );
add( label );
line = new ColorBlock( 1, 1, 0xFF222222);
add(line);
}
@Override
protected void layout() {
sprite.y = y + 1 + (height - 1 - sprite.height) / 2f;
PixelScene.align(sprite);
line.size(width, 1);
line.x = 0;
line.y = y;
label.maxWidth((int)(width - sprite.width - 1));
label.setPos(sprite.x + sprite.width + 1, y + 1 + (height - 1 - label.height()) / 2f);
PixelScene.align(label);
} }
public boolean onClick( float x, float y ) { public boolean onClick( float x, float y ) {
@ -404,7 +402,7 @@ public class WndJournal extends WndTabbed {
if (identified) if (identified)
GameScene.show( new WndInfoItem( item ) ); GameScene.show( new WndInfoItem( item ) );
else else
GameScene.show( new WndTitledMessage( new ItemSprite(showPotions ? ItemSpriteSheet.POTION_HOLDER : ItemSpriteSheet.SCROLL_HOLDER, null), GameScene.show(new WndTitledMessage( new Image(icon),
Messages.titleCase(item.trueName()), item.desc() )); Messages.titleCase(item.trueName()), item.desc() ));
return true; return true;
} else { } else {