package com.arretadogames.pilot.database; import java.util.ArrayList; import java.util.List; import android.content.ContentValues; import android.content.Context; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import com.arretadogames.pilot.accounts.Account; import com.arretadogames.pilot.database.descriptors.DigitalStoreItemDescriptor; import com.arretadogames.pilot.database.descriptors.RealStoreItemDescriptor; import com.arretadogames.pilot.database.descriptors.StoreItemDescriptor; import com.arretadogames.pilot.items.ItemType; import com.arretadogames.pilot.levels.LevelDescriptor; import com.arretadogames.pilot.tournaments.Tournament; import com.arretadogames.pilot.tournaments.TournamentType; public class GameDatabase { public static final String TABLE_ACCOUNT = "ACCOUNT"; public static final String ACCOUNT_ID = "acount_id"; public static final String ACC_COINS = "account_coins"; public static final String USER_NAME = "user_name"; public static final String IMAGE = "user_image"; public static final String ACC_PROVIDER = "acc_provided_id"; public static final String PROVIDER_ACC_ID = "provider_acc_id"; public static final String TABLE_LEVEL = "LEVEL"; public static final String LEVEL_ID = "level_id"; public static final String LEVEL_ENABLED = "enabled"; public static final String ACC_ID_RECORD_FIRST = "acc_id_first"; public static final String RECORD_VALUE_FIRST = "record_value_first"; public static final String ACC_ID_RECORD_SECOND = "acc_id_second"; public static final String RECORD_VALUE_SECOND = "record_value_second"; public static final String ACC_ID_RECORD_THIRD = "acc_id_third"; public static final String RECORD_VALUE_THIRD = "record_value_third"; public static final String TABLE_REAL_ITEMS = "REAL_ITEMS"; public static final String R_ITEM_ID = "item_id"; public static final String R_ITEM_NAME = "item_name"; public static final String R_ITEM_DESCRIPTION = "item_desc"; public static final String R_ITEM_PRICE = "item_price"; public static final String R_ITEM_SKU_CODE = "item_sku_code"; public static final String R_ITEM_RES_NAME = "item_res_id"; public static final String TABLE_PLAYER_TOURNAMENTS = "PLAYER_TOURNAMENTS"; public static final String TOURNAMENT_ID = "tournament_id"; public static final String T_ENABLED = "t_enabled"; public static final String T_TYPE_NAME = "t_type_name"; public static final String TABLE_TOURNAMENT_LEVELS = "TOURNAMENT_LEVELS"; public static final String PLAYER_TOURNAMENT_LEVELS_CREATE = "TORUNAMENT_LEVELS"; public static final String TABLE_DIGITAL_ITEMS = "DIGITAL_ITEMS"; public static final String TABLE_PLAYER_ITEMS = "PLAYER_ITEMS"; public static final String TABLE_NEXT_LEVEL = "NEXT_LEVEL"; public static final String ID_NEXT = "next_level"; private static GameDatabase gameDatabase; private SQLiteDatabase db; private boolean started; private GameDatabase(Context c) { db = new GameDatabaseOpenHelper(c).getWritableDatabase(); started = false; } public static void createDatabase(Context c) { gameDatabase = new GameDatabase(c); } public static GameDatabase getInstance() { return gameDatabase; } public void setStarted(boolean start){ this.started = start; } public boolean getStarted(){ return this.started; } public Account getDefaultUser() { Cursor c = db.query(TABLE_ACCOUNT, null, ACC_PROVIDER + " = 'self'", null, null, null, null); c.moveToFirst(); Account a = new Account(); a.setName(c.getString(c.getColumnIndex(GameDatabase.USER_NAME))); a.setCoins(c.getInt(c.getColumnIndex(GameDatabase.ACC_COINS))); a.setAccountName(c.getString(c.getColumnIndex(GameDatabase.PROVIDER_ACC_ID))); a.setAccountId(String.valueOf(c.getInt(c.getColumnIndex(GameDatabase.ACCOUNT_ID)))); c.close(); return a; } public ArrayList<Tournament> getAllTournaments(){ ArrayList<Tournament> allTournaments = new ArrayList<Tournament>(); int[] levels = new int[6]; TournamentType type; String typeName; int levelId; int levelCount; Cursor c; Cursor cLevels; c = db.query(TABLE_PLAYER_TOURNAMENTS, null, null, null, null, null, null); c.moveToFirst(); while(!c.isAfterLast()){ typeName = c.getString(c.getColumnIndexOrThrow(T_TYPE_NAME)); type = getTournamentType(typeName); Tournament curTournament = new Tournament(c.getInt( c.getColumnIndexOrThrow(TOURNAMENT_ID)), type); curTournament.setEnable(c.getInt( c.getColumnIndexOrThrow(T_ENABLED))==1); cLevels = db.query(TABLE_TOURNAMENT_LEVELS, null, TOURNAMENT_ID + " = " + curTournament.getId(), null, null, null, null); cLevels.moveToFirst(); levelCount = 0; while(!cLevels.isAfterLast()){ levelId = cLevels.getInt(cLevels.getColumnIndexOrThrow(LEVEL_ID)); levels[levelCount] = levelId; cLevels.moveToNext(); levelCount++; } curTournament.setIdsLevels(levels); allTournaments.add(curTournament); c.moveToNext(); } return allTournaments; } private TournamentType getTournamentType(String typeName){ if (typeName.equalsIgnoreCase(TournamentType.DESERT.toString())){ return TournamentType.DESERT; }else if (typeName.equalsIgnoreCase(TournamentType.SWAMP.toString())) { return TournamentType.SWAMP; } else if (typeName.equalsIgnoreCase(TournamentType.JUNGLE.toString())) { return TournamentType.JUNGLE; } else { return null; } } public ArrayList<LevelDescriptor> getAllLevels(){ ArrayList<LevelDescriptor> allLevels = new ArrayList<LevelDescriptor>(); Cursor c = db.query(TABLE_LEVEL, null, null, null, null, null, null); c.moveToFirst(); while(!c.isAfterLast()){ LevelDescriptor curLevel = new LevelDescriptor(c.getInt(c.getColumnIndexOrThrow(LEVEL_ID))); curLevel.setRecords( new int[] {c.getInt( c.getColumnIndexOrThrow(RECORD_VALUE_FIRST)), c.getInt( c.getColumnIndexOrThrow(RECORD_VALUE_SECOND)), c.getInt( c.getColumnIndexOrThrow(RECORD_VALUE_THIRD))} ); curLevel.setEnabled (c.getInt( c.getColumnIndexOrThrow(LEVEL_ENABLED))==1 ); allLevels.add(curLevel); c.moveToNext(); } c.close(); return allLevels; } public LevelDescriptor getLevel(int levelID){ LevelDescriptor ld = new LevelDescriptor(levelID); return ld; } public void setNewRecord(int levelId, String accId, int firRec, int secRec, int thiRec ) { ContentValues values = new ContentValues(); values.put(LEVEL_ID, levelId); values.put(ACC_ID_RECORD_FIRST, accId); values.put(RECORD_VALUE_FIRST, firRec ); values.put(RECORD_VALUE_SECOND, secRec ); values.put(RECORD_VALUE_THIRD, thiRec ); db.insertWithOnConflict(TABLE_LEVEL, null, values, SQLiteDatabase.CONFLICT_REPLACE); } public List<StoreItemDescriptor> getStoreItems() { ArrayList<StoreItemDescriptor> items = new ArrayList<StoreItemDescriptor>(); for(StoreItemDescriptor item : getAllDigitalStoreItems()){ items.add(item); } for(StoreItemDescriptor item : getAllRealStoreItems()){ items.add(item); } return items; } private List<DigitalStoreItemDescriptor> getAllDigitalStoreItems() { ArrayList<DigitalStoreItemDescriptor> items = new ArrayList<DigitalStoreItemDescriptor>(); Cursor c = db.query(TABLE_DIGITAL_ITEMS, null, null, null, null, null, null); c.moveToFirst(); int nameIndex = c.getColumnIndexOrThrow(R_ITEM_NAME); int descIndex = c.getColumnIndexOrThrow(R_ITEM_DESCRIPTION); int priceIndex = c.getColumnIndexOrThrow(R_ITEM_PRICE); int resIdIndex = c.getColumnIndexOrThrow(R_ITEM_RES_NAME); while(!c.isAfterLast()){ boolean playerHasItem = playerHasItem(ItemType.parse(c.getString(nameIndex))); DigitalStoreItemDescriptor item; item = new DigitalStoreItemDescriptor( c.getString(nameIndex), c.getString(descIndex), c.getString(resIdIndex), c.getInt(priceIndex), playerHasItem); items.add(item); c.moveToNext(); } c.close(); return items; } private List<RealStoreItemDescriptor> getAllRealStoreItems() { ArrayList<RealStoreItemDescriptor> items = new ArrayList<RealStoreItemDescriptor>(); Cursor c = db.query(TABLE_REAL_ITEMS, null, null, null, null, null, null); c.moveToFirst(); int nameIndex = c.getColumnIndexOrThrow(R_ITEM_NAME); int descIndex = c.getColumnIndexOrThrow(R_ITEM_DESCRIPTION); int priceIndex = c.getColumnIndexOrThrow(R_ITEM_PRICE); int skuIndex = c.getColumnIndexOrThrow(R_ITEM_SKU_CODE); int resIdIndex = c.getColumnIndexOrThrow(R_ITEM_RES_NAME); while(!c.isAfterLast()){ RealStoreItemDescriptor item; item = new RealStoreItemDescriptor( c.getString(nameIndex), c.getString(descIndex), c.getString(resIdIndex), c.getString(skuIndex), c.getFloat(priceIndex)); items.add(item); c.moveToNext(); } c.close(); return items; } public boolean playerHasItem(ItemType it) { Cursor c = db.query(TABLE_PLAYER_ITEMS, null, R_ITEM_NAME + " = '" + it.getName() + "'", null, null, null, null); boolean hasItem = c.getCount() > 0; c.close(); return hasItem; } public boolean buyItem(ItemType it) { if (playerHasItem(it)) return false; ContentValues cv = new ContentValues(); cv.put(R_ITEM_NAME, it.getName()); db.insert(TABLE_PLAYER_ITEMS, null, cv); return true; } }