/* * Copyright (c) 2003-onwards Shaven Puppy Ltd * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * * Neither the name of 'Shaven Puppy' nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package worm.screens; import java.util.ArrayList; import java.util.Arrays; import java.util.Comparator; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import net.puppygames.applet.Area; import net.puppygames.applet.Game; import net.puppygames.applet.Screen; import org.lwjgl.util.ReadableRectangle; import worm.Worm; import worm.WormGameState; import worm.animation.SimpleThingWithLayers; import worm.features.LayersFeature; import worm.features.MedalFeature; import com.shavenpuppy.jglib.Resources; import com.shavenpuppy.jglib.resources.ColorMapFeature; import com.shavenpuppy.jglib.sprites.Appearance; import com.shavenpuppy.jglib.sprites.Sprite; /** * The medals screen */ public class MedalsScreen extends Screen { private static final long serialVersionUID = 1L; private static final int MEDALS_PER_PAGE = 6; private static final String BACKGROUND = "background_glow"; private static final String ID_PREV = "prev"; private static final String ID_NEXT = "next"; private static final String ID_CLOSE = "close"; private static MedalsScreen instance; /** Current page */ private transient int page; /** Number of pages */ private transient int numPages; /** Map of medals to number earned */ private transient Map<MedalFeature, Integer> medals; /** Sorted list of medals */ private transient MedalFeature[] sortedMedals; /** Sprites */ private transient List<SimpleThingWithLayers> medalLayers; private transient SimpleThingWithLayers rankLayers; /** * C'tor * @param name */ public MedalsScreen(String name) { super(name); setAutoCreated(); } @Override protected void doRegister() { instance = this; } @Override protected void doDeregister() { instance = null; } public static void show() { instance.open(); } @Override protected void onOpen() { WormGameState gameState = Worm.getGameState(); medals = new HashMap<MedalFeature, Integer>(gameState.getMedals()); String world = gameState.getWorld().getUntranslated(); getArea(BACKGROUND).setMouseOffAppearance((Appearance) Resources.get(world+".research.background.anim")); ColorMapFeature.getDefaultColorMap().copy((ColorMapFeature) Resources.get(world+".colormap")); getArea("score").setText("{color:text font:tinyfont.glfont}"+Game.getMessage("ultraworm.medalsscreen.score")+": {color:text-bold}"+gameState.getScore()); getArea("rank").setText("{color:text font:smallfont.glfont}"+Game.getMessage("ultraworm.medalsscreen.rank")+": {color:text-bold}"+gameState.getRank().getTitle()); // rank img if (rankLayers != null) { rankLayers.remove(); rankLayers = null; } LayersFeature layers = gameState.getRank().getAppearance(); if (layers != null) { Area rankImgArea = getArea("rank-img"); ReadableRectangle pos = rankImgArea.getBounds(); rankLayers = new SimpleThingWithLayers(this); layers.createSprites(this, rankLayers); Sprite[] rankSprite = rankLayers.getSprites(); for (Sprite element : rankSprite) { element.setLocation(pos.getX()+pos.getWidth()/2, pos.getY()+pos.getHeight()/2); } } // Add all missing medals for (Iterator<MedalFeature> i = MedalFeature.getMedals().values().iterator(); i.hasNext(); ) { MedalFeature mf = i.next(); if (!medals.containsKey(mf) && (!mf.isXmas() || (mf.isXmas() && gameState.getGameMode() == WormGameState.GAME_MODE_XMAS))) { medals.put(mf, Integer.valueOf(0)); } } // Calculate number of pages numPages = medals.size() / MEDALS_PER_PAGE + (medals.size() % MEDALS_PER_PAGE > 0 ? 1 : 0); sortedMedals = medals.keySet().toArray(new MedalFeature[medals.size()]); Arrays.sort(sortedMedals, new Comparator<MedalFeature>() { @Override public int compare(MedalFeature mf0, MedalFeature mf1) { int n0 = medals.get(mf0).intValue(); int n1 = medals.get(mf1).intValue(); if (n0 > 0 && n1 == 0) { return -1; } else if (n1 > 0 && n0 == 0) { return 1; } else if (mf0.getPoints() > mf1.getPoints()) { return -1; } else if (mf0.getPoints() < mf1.getPoints()) { return 1; } else { return mf0.getTitle().compareTo(mf1.getTitle()); } } }); // Start on first page setPage(0); } private void setPage(int newPage) { if (medalLayers != null) { for (Iterator<SimpleThingWithLayers> i = medalLayers.iterator(); i.hasNext(); ) { SimpleThingWithLayers s = i.next(); if (s != null) { s.remove(); } } medalLayers = null; } medalLayers = new ArrayList<SimpleThingWithLayers>(MEDALS_PER_PAGE); page = newPage; getArea("page").setText(page + 1 + "/" + numPages); int idx = page * MEDALS_PER_PAGE; for (int i = 0; i < MEDALS_PER_PAGE; i ++) { if (idx < sortedMedals.length) { // Show setGroupVisible("slot_"+(i + 1)+"_group", true); MedalFeature medal = sortedMedals[idx]; Integer n = medals.get(medal); String titleColor, descColor; if (n.intValue() == 0) { titleColor = "{color:text-darkest}"; descColor = "{color:text-darkest}"; } else if (n.intValue() == 1) { descColor = "{color:text}"; titleColor = "{color:text-bold}"; } else { descColor = "{color:text}"; titleColor = "{color:text-bold}"; } getArea("id_medal_slot_"+(i + 1)+"_title").setText(titleColor+medal.getTitle()+(n.intValue() > 1 ? " ["+n.intValue()+"]" : "")); getArea("id_medal_slot_"+(i + 1)+"_desc").setText(descColor+medal.getDescription()); boolean hasPoints = medal.getPoints() > 0; boolean hasBonus = medal.getMoney() > 0; getArea("id_medal_slot_"+(i + 1)+"_value").setText ( (hasPoints ? titleColor+String.valueOf(medal.getPoints()) : "") + (hasPoints && hasBonus ? "\n" : "") + (hasBonus ? "$"+String.valueOf(medal.getMoney()) : "") ); Area imgArea = getArea("id_medal_slot_"+(i + 1)+"_img"); if (n.intValue() > 0) { ReadableRectangle pos = imgArea.getBounds(); LayersFeature layers = medal.getAppearance(); if (layers != null) { SimpleThingWithLayers sl = new SimpleThingWithLayers(this); layers.createSprites(this, sl); Sprite[] s = sl.getSprites(); for (Sprite element : s) { if (element != null) { element.setLocation(pos.getX() + pos.getWidth() / 2, pos.getY() + pos.getHeight() / 2); } } medalLayers.add(sl); } } } else { // Hide setGroupVisible("slot_"+(i + 1)+"_group", false); } idx ++; } setEnabled(ID_PREV, page > 0); setEnabled(ID_NEXT, page < numPages - 1); } @Override protected void onClicked(String id) { if (ID_PREV.equals(id)) { if (page > 0) { setPage(page - 1); } } else if (ID_NEXT.equals(id)) { if (page < numPages - 1) { setPage(page + 1); } } else if (ID_CLOSE.equals(id)) { close(); } } }