/** * Copyright (C) 2013 Gundog Studios LLC. * * 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.godsandtowers.graphics.menu.layouts; import java.text.NumberFormat; import java.util.ArrayList; import android.app.Activity; import android.content.res.Resources; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.view.Gravity; import android.view.View; import android.view.View.OnClickListener; import android.view.View.OnLongClickListener; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.BaseAdapter; import android.widget.Gallery; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.RelativeLayout; import android.widget.RelativeLayout.LayoutParams; import android.widget.TextView; import android.widget.Toast; import com.godsandtowers.R; import com.godsandtowers.core.PlayerStats; import com.godsandtowers.graphics.game.BitmapCache; import com.godsandtowers.graphics.menu.layouts.RaceSelectionGallery.Selector; import com.godsandtowers.sprites.BaseCreature; import com.godsandtowers.sprites.BaseTower; import com.godsandtowers.sprites.Races; import com.godsandtowers.sprites.Upgradeable; import com.godsandtowers.util.ADS; import com.godsandtowers.util.ResourceUtilities; import com.godsandtowers.util.TDWPreferences; import com.gundogstudios.modules.Modules; public class UpgradeRightLayout implements ILayout { private static final float NOT_SELECTED = .75f; private static final float SELECTED = 1f; private LinearLayout upgradeLayout; private LinearLayout selectionLayout; private UpgradeLeftLayout leftLayout; private View lastView; private Activity activity; private PlayerStats stats; public UpgradeRightLayout(final Activity activity, UpgradeLeftLayout leftLayout, PlayerStats stats) { this.activity = activity; this.stats = stats; this.leftLayout = leftLayout; } public void reset() { upgradeLayout = new LinearLayout(activity); upgradeLayout.setOrientation(LinearLayout.VERTICAL); ADS.placeObtrusiveADMobAD(upgradeLayout); selectionLayout = new LinearLayout(activity); selectionLayout.setOrientation(LinearLayout.VERTICAL); Gallery gallery = generateRaceSelectionLayout(); upgradeLayout.addView(gallery); ImageView seperator = new ImageView(activity); seperator.setImageBitmap(BitmapCache.getBitmap(R.drawable.menu_seperator)); upgradeLayout.addView(seperator); upgradeLayout.addView(selectionLayout); } private Gallery generateRaceSelectionLayout() { Selector selector = new Selector() { @Override public void onSelection(boolean[] selections) { selectionLayout.removeAllViews(); updateSelection(selections); } }; RaceSelectionGallery gallery = new RaceSelectionGallery(activity, Races.ALL_RACES, selector); updateSelection(gallery.getSelections()); return gallery; } private void updateSelection(boolean[] racesSelected) { int[] r = Races.asArray(Races.getRaces(racesSelected)); if (r.length == 0) { // Only show player stats when no races are selected displayUpgrades(selectionLayout, stats.getBasePlayer(), stats.getBasePlayer().getUpgradeIDs(), Races.ALL_RACES); return; } else if (r.length == 1) { // Only show race stats when only 1 race is selected displayUpgrades(selectionLayout, stats.getBaseRace(), stats.getBaseRace().getUpgradeIDs(r[0]), r); ImageView seperator = new ImageView(activity); seperator.setImageBitmap(BitmapCache.getBitmap(R.drawable.menu_seperator)); selectionLayout.addView(seperator); } ArrayList<Upgradeable> upgradeables = new ArrayList<Upgradeable>(); ArrayList<Integer> iconIDs = new ArrayList<Integer>(); ArrayList<int[]> races = new ArrayList<int[]>(); for (BaseCreature creature : stats.getBaseCreatures()) { if (creature.isUnlocked() && Races.compareRaces(r, creature.getRaces())) { int iconID = ResourceUtilities.getIconID(creature); iconIDs.add(iconID); upgradeables.add(creature); races.add(Races.asArray(creature.getRaces())); } } for (BaseTower tower : stats.getBaseTowers()) { if (tower.isUnlocked() && Races.compareRaces(r, tower.getRaces())) { int iconID = ResourceUtilities.getIconID(tower); iconIDs.add(iconID); upgradeables.add(tower); races.add(Races.asArray(tower.getRaces())); } } generateLayout(selectionLayout, upgradeables, iconIDs, races); } private void generateLayout(LinearLayout wrapper, final ArrayList<Upgradeable> upgradeables, ArrayList<Integer> imageIDs, final ArrayList<int[]> races) { final LinearLayout upgrades = new LinearLayout(activity); upgrades.setOrientation(LinearLayout.VERTICAL); Gallery gallery = new Gallery(activity); gallery.setAdapter(new ImageAdapter(imageIDs)); gallery.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { if (lastView != null) { ((ImageView) lastView).setAlpha(NOT_SELECTED); } upgrades.removeAllViews(); if (view != lastView) { ((ImageView) view).setAlpha(SELECTED); Upgradeable upgradeable = upgradeables.get(position); int[] r = races.get(position); displayUpgrades(upgrades, upgradeable, upgradeable.getUpgradeIDs(), r); ADS.placeADMobAd(upgrades); lastView = view; } else { lastView = null; } } }); wrapper.addView(gallery); ImageView seperator = new ImageView(activity); seperator.setImageBitmap(BitmapCache.getBitmap(R.drawable.menu_seperator)); wrapper.addView(seperator); wrapper.addView(upgrades); } private void displayUpgrades(LinearLayout layout, final Upgradeable upgradable, int[] upgradeableIDs, final int[] races) { int heightPadding = Modules.PREFERENCES.get(TDWPreferences.HEIGHT, 0) / 20; int widthPadding = Modules.PREFERENCES.get(TDWPreferences.WIDTH, 0) / 25; final Resources resources = activity.getResources(); for (int nameID : upgradeableIDs) { RelativeLayout insideLayout = new RelativeLayout(activity); insideLayout.setBackgroundResource(R.drawable.menu_upgrade_button); insideLayout.setPadding(0, heightPadding, 0, heightPadding); insideLayout.setGravity(Gravity.CENTER); ImageView image = new ImageView(activity); final String name = upgradable.getUpgradeName(nameID); int iconID = ResourceUtilities.getIconID(name); image.setImageBitmap(BitmapCache.getBitmap(iconID)); image.setOnLongClickListener(new OnLongClickListener() { @Override public boolean onLongClick(View v) { Toast.makeText(activity, ResourceUtilities.getString(name), Toast.LENGTH_SHORT).show(); return true; } }); image.setPadding(widthPadding, 0, 0, 0); RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); params.addRule(RelativeLayout.ALIGN_PARENT_LEFT); insideLayout.addView(image, params); final int id = nameID; final TextView nameView = new TextView(activity); nameView.setText(getText(resources, upgradable, id)); nameView.setPadding(widthPadding, 0, widthPadding, 0); params = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); params.addRule(RelativeLayout.CENTER_IN_PARENT); insideLayout.addView(nameView, params); ImageView purchase = new ImageView(activity); purchase.setImageBitmap(BitmapCache.getBitmap(R.drawable.bottommenu_upgrade)); purchase.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { long cost = upgradable.getUpgradeCost(id); boolean hasEnoughXP = true; for (int race : races) { hasEnoughXP &= stats.getRaceXP(race) >= cost; if (!hasEnoughXP) { CharSequence text = activity.getResources().getText(R.string.upgrade_notEnoughXP); Toast toast = Toast.makeText( activity, text + " " + ResourceUtilities.getString(Races.getName(race)) + " " + stats.getRaceXP(race) + " / " + cost, Toast.LENGTH_SHORT); toast.show(); } } if (hasEnoughXP) { for (int race : races) stats.decreaseXP(race, cost); upgradable.upgrade(id); leftLayout.refresh(); nameView.setText(getText(resources, upgradable, id)); } } }); purchase.setPadding(0, 0, widthPadding, 0); params = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); params.addRule(RelativeLayout.ALIGN_PARENT_RIGHT); insideLayout.addView(purchase, params); layout.addView(insideLayout); } } private String getText(Resources resources, Upgradeable upgradable, int id) { NumberFormat formatter = NumberFormat.getInstance(); formatter.setMaximumFractionDigits(2); String base = formatter.format(upgradable.getBaseValue(id)); String upgraded = formatter.format(upgradable.getUpgradedValue(id)); String cost = formatter.format(upgradable.getUpgradeCost(id)); return base + " --> " + upgraded + "\n" + cost + " " + resources.getText(R.string.upgrade_XP); } @Override public void attach(LinearLayout baseLayout) { if (upgradeLayout == null) { reset(); } baseLayout.addView(upgradeLayout); } private class ImageAdapter extends BaseAdapter { private ImageView[] images; public ImageAdapter(ArrayList<Integer> imageIDs) { images = new ImageView[imageIDs.size()]; for (int i = 0; i < images.length; i++) { images[i] = new ImageView(activity); Bitmap bitmap = BitmapFactory.decodeResource(activity.getResources(), imageIDs.get(i)); int width = (int) (bitmap.getWidth() * 1.5); int height = bitmap.getHeight(); images[i].setLayoutParams(new Gallery.LayoutParams(width, height)); images[i].setImageBitmap(bitmap); images[i].setAlpha(NOT_SELECTED); } } public int getCount() { return images.length; } public Object getItem(int position) { return position; } public long getItemId(int position) { return position; } public View getView(int position, View convertView, ViewGroup parent) { return images[position]; } } }