package com.mehtank.androminion.util; import java.text.Collator; import java.util.ArrayList; import java.util.Collections; import java.util.Iterator; import java.util.Map; import android.content.Context; import android.content.SharedPreferences; import android.content.SharedPreferences.Editor; import android.preference.PreferenceManager; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ArrayAdapter; import android.widget.CheckedTextView; import android.widget.Toast; import com.mehtank.androminion.R; public class Achievements { @SuppressWarnings("unused") private static final String TAG = "Achievements"; public static final String[] KEYS = { "2players8provinces", "3or4players10provinces", "score100", "score1more", "singlecard", "score50more", "skunk", "trash5inaturn", "gainmorethan30inaturn", "win10inarow", "overpayby10ormore", "stockpile50tokens" }; private static final int[] ids = { R.string.achievements_2players8provinces, R.string.achievements_3or4players10provinces, R.string.achievements_score100, R.string.achievements_score1more, R.string.achievements_singlecard, R.string.achievements_score50more, R.string.achievements_skunk, R.string.achievements_trash5inaturn, R.string.achievements_gainmorethan30inaturn, R.string.achievements_win10inarow, R.string.achievements_overpayby10ormore, R.string.achievements_stockpile50tokens }; public String[] text = new String[KEYS.length]; boolean[] achievementsDone = new boolean[KEYS.length]; public static final String WIN_STREAK_PLAYER_KEY = "win_streak_player"; public static final String WIN_STREAK_COUNT_KEY = "win_streak_count"; SharedPreferences prefs; Context context; public Achievements(Context context) { this.context = context; this.prefs = PreferenceManager.getDefaultSharedPreferences(context); for(int i=0; i < Achievements.KEYS.length; i++) { text[i] = context.getString(ids[i]); achievementsDone[i] = hasAchieved(i); } } public void resetStats() { ArrayList<String> prefsToClear = new ArrayList<String>(); Map<String, ?> all = prefs.getAll(); Iterator<String> keys = all.keySet().iterator(); while(keys.hasNext()) { String key = keys.next(); if(key.startsWith("wins_") || key.startsWith("losses_")) { prefsToClear.add(key); } if(key.startsWith("p2wins_") || key.startsWith("p2losses_")) { prefsToClear.add(key); } if(key.startsWith("p3wins_") || key.startsWith("p3losses_")) { prefsToClear.add(key); } if(key.startsWith("p4wins_") || key.startsWith("p4losses_")) { prefsToClear.add(key); } if(key.startsWith("p5wins_") || key.startsWith("p5losses_")) { prefsToClear.add(key); } if(key.startsWith("p6wins_") || key.startsWith("p6losses_")) { prefsToClear.add(key); } } if(prefsToClear.size() > 0) { Editor editor = prefs.edit(); editor.remove(WIN_STREAK_COUNT_KEY); editor.remove(WIN_STREAK_PLAYER_KEY); for(String pref : prefsToClear) editor.remove(pref); editor.commit(); } } public void resetAchievements() { Editor editor = prefs.edit(); for(int i=0; i < Achievements.KEYS.length; i++) { editor.remove(Achievements.KEYS[i]); achievementsDone[i] = false; } editor.commit(); } private int achievementIndex(String achievement) { int index = -1; for(int i=0; i < KEYS.length; i++) { if(KEYS[i].equals(achievement)) { index = i; break; } } return index; } public boolean hasAchieved(String achievement) { int index = achievementIndex(achievement); if(index == -1) { Log.d("Androminion","ERROR: Requested Achievement not found:" + achievement); return false; } return hasAchieved(index); } public boolean hasAchieved(int index) { if(index < 0 || index >= KEYS.length) { Log.d("Androminion","ERROR: Requested Achievement not found:" + index); return false; } return prefs.getBoolean(KEYS[index], false); } public void achieved(String achievement) { int index = achievementIndex(achievement); if(index == -1) { Log.d("Androminion","ERROR: Acquired Achievement not found:" + achievement); return; } if(!achievementsDone[index]) { achievementsDone[index] = true; Editor editor = prefs.edit(); editor.putBoolean(KEYS[index], true); editor.commit(); Toast.makeText(context, context.getString(R.string.achievements_menu)+ "!!!\n" + text[index], Toast.LENGTH_SHORT).show(); } } public void gameOver(ArrayList<String> allPlayers, ArrayList<Integer> winners) { String winStreakPlayer = prefs.getString(WIN_STREAK_PLAYER_KEY, ""); int winStreakCount = prefs.getInt(WIN_STREAK_COUNT_KEY, 0); String numPlayersPrefix = "p" + allPlayers.size(); for(int i=0; i < allPlayers.size(); i++) { String name = getSafeName(allPlayers.get(i)); int totalWins = prefs.getInt("wins_" + name, 0); int totalLosses = prefs.getInt("losses_" + name, 0); int numPlayersWins = prefs.getInt(numPlayersPrefix + "wins_" + name, 0); int numPlayersLosses = prefs.getInt(numPlayersPrefix + "losses_" + name, 0); boolean won = false; for(int j=0; j < winners.size(); j++) { if(winners.get(j).intValue() == i) { won = true; totalWins++; numPlayersWins++; break; } } if(!won) { if(allPlayers.get(i).equals(winStreakPlayer)) { winStreakPlayer = ""; winStreakCount = 0; Editor editor = prefs.edit(); editor.putString(WIN_STREAK_PLAYER_KEY, winStreakPlayer); editor.putInt(WIN_STREAK_COUNT_KEY, winStreakCount); editor.commit(); } totalLosses++; numPlayersLosses++; } Editor editor = prefs.edit(); editor.putInt("wins_" + name, totalWins); editor.putInt("losses_" + name, totalLosses); editor.putInt(numPlayersPrefix + "wins_" + name, numPlayersWins); editor.putInt(numPlayersPrefix + "losses_" + name, numPlayersLosses); editor.commit(); } for(int j=0; j < winners.size(); j++) { String player = allPlayers.get(winners.get(j).intValue()); if(isHumanPlayer(player)) { if(!player.equals(winStreakPlayer)) { winStreakPlayer = player; winStreakCount = 0; } winStreakCount++; Editor editor = prefs.edit(); editor.putString(WIN_STREAK_PLAYER_KEY, winStreakPlayer); editor.putInt(WIN_STREAK_COUNT_KEY, winStreakCount); editor.commit(); break; } } if(winStreakCount >= 10) { achieved("win10inarow"); } } public ArrayList<String> getAllPlayers() { ArrayList<String> players = new ArrayList<String>(); Map<String, ?> all = prefs.getAll(); Iterator<String> keys = all.keySet().iterator(); while(keys.hasNext()) { String key = keys.next(); if(key.startsWith("wins_")) { String name = key.substring("wins_".length()); if(!players.contains(name)) { players.add(name); } } if(key.startsWith("losses_")) { String name = key.substring("losses_".length()); if(!players.contains(name)) { players.add(name); } } } Collections.sort(players, Collator.getInstance()); return players; } public int getTotalWins(String player) { return prefs.getInt("wins_" + player, 0); } public int getPlayerWins(String player, int numPlayers) { String numPlayersPrefix = "p" + numPlayers; return prefs.getInt(numPlayersPrefix + "wins_" + player, 0); } public int getTotalLosses(String player) { return prefs.getInt("losses_" + player, 0); } public int getPlayerLosses(String player, int numPlayers) { String numPlayersPrefix = "p" + numPlayers; return prefs.getInt(numPlayersPrefix + "losses_" + player, 0); } public int getWinStreak(String player) { if (prefs.getString(WIN_STREAK_PLAYER_KEY, "").equals(player)) return prefs.getInt(WIN_STREAK_COUNT_KEY, 0); return 0; } public static String getSafeName(String name) { if(name == null) name = ""; StringBuilder sb = new StringBuilder(); for(char c : name.toCharArray()) { if(Character.isLetterOrDigit(c)) { sb.append(c); } } return sb.toString(); } public static boolean isHumanPlayer(String s) { if(!s.equals("Mary") && !s.equals("Sarah") && !s.equals("Earl") && !s.equals("Drew") && !s.equals("Chuck") && !s.equals("Patrick")) { return true; } return false; } public AchievementsAdapter getNewAchievementsAdapter() { return new AchievementsAdapter(); } public class AchievementsAdapter extends ArrayAdapter<String> { private final static int ROWLAYOUT = android.R.layout.simple_list_item_checked; public AchievementsAdapter() { super(context, ROWLAYOUT, text); } @Override public View getView(int position, View convertView, ViewGroup parent) { View rowView = convertView; if (rowView == null) { LayoutInflater inflater = LayoutInflater.from(context); rowView = inflater.inflate(ROWLAYOUT, null); CheckedTextView cbx = (CheckedTextView) rowView.findViewById(android.R.id.text1); rowView.setTag(cbx); } CheckedTextView cbx = (CheckedTextView) rowView.getTag(); cbx.setText(text[position]); cbx.setChecked(achievementsDone[position]); return rowView; } } }