/*
* Copyright (C) 2016 Google Inc. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.google.android.apps.santatracker.presentquest.model;
import com.orm.SugarRecord;
import java.util.List;
public class User extends SugarRecord {
public static final int WORKSHOP_2_LEVEL = 2;
public static final int WORKSHOP_3_LEVEL = 4;
public int presentsCollected = 0;
public int presentsReturned = 0;
// Presents required on each level to proceed to next level.
// If the user is on level i they will have collected somewhere between
// PRESENTS_REQUIRED[i - 1] and PRESENTS_REQUIRED[i] presents
//
// A good game of present collecting returns around 50 presents, so getting
// 100 points is two games and 1000 points is twenty games.
private static final int[] PRESENTS_REQUIRED = {
0, // Level 0 (does not exist)
1, // Level 1
50, // Level 2
200, // Level 3
500, // Level 4
750, // Level 5
1000, // Level 6
2000, // Level 7
5000, // Level 8
10000, // Level 9
15000, // Level 10
20000, // Level 11
// Level 12 is the last level, can't beat it
Integer.MAX_VALUE
};
// Maximum presents that can be collected (held before returning) on each level.
private static final int[] MAX_PRESENTS_COLLECTED = {
0, // Level 0 (does not exist)
10, // Level 1
50, // Level 2
75, // Level 3
100, // Level 4
250, // Level 5
300, // Level 6
350, // Level 7
400, // Level 8
450, // Level 9
500, // Level 10
500, // Level 11
1000, // Level 12
};
// Chance that a present bunch dropped is "large"
private static final float[] LARGE_PRESENT_CHANCE = {
0.00f, // Level 0
0.05f, // Level 1
0.10f, // Level 2
0.15f, // Level 3
0.20f, // Level 4
0.25f, // Level 5
0.30f, // Level 6
0.35f, // Level 7
0.40f, // Level 8
0.45f, // Level 9
0.55f, // Level 10
0.60f, // Level 11
0.65f, // Level 12
};
// Returns the user object, or creates it.
public static User get() {
List<User> users = User.listAll(User.class);
if (users.isEmpty()) {
return new User();
} else {
return users.get(0);
}
}
public User() {}
// Returns current level.
public int getLevel() {
for (int i = 0; i < PRESENTS_REQUIRED.length; i++) {
if (presentsReturned < PRESENTS_REQUIRED[i]) {
return i;
}
}
return 1;
}
// Returns avatar for current level.
public int getAvatar() {
return Avatars.AVATARS_UNLOCKED[getLevel() - 1];
}
// Returns progress percentage for current level.
public int getLevelProgress() {
int level = getLevel();
// It's impossible to get past the last level, so always show full progress at level 12.
if (level == (PRESENTS_REQUIRED.length - 1)) {
return 100;
}
int requiredThisLevel = PRESENTS_REQUIRED[level];
int requiredPreviousLevel = PRESENTS_REQUIRED[level - 1];
int requiredForLevel = requiredThisLevel - requiredPreviousLevel;
int returnedForLevel = presentsReturned - requiredPreviousLevel;
int progress = (int) ((returnedForLevel * 100.0f) / requiredForLevel);
return progress;
}
public void collectPresents(int num) {
// Can't hold more than max capacity
int maxCapacity = getMaxPresentsCollected();
int newCollected = Math.min(maxCapacity, presentsCollected + num);
presentsCollected = newCollected;
save();
}
public void returnPresentsAndEmpty(int num) {
// Can't return more than you've collected
int maxReturn = Math.min(num, presentsCollected);
// Increment presents returned, empty bag
presentsReturned = presentsReturned + maxReturn;
presentsCollected = 0;
save();
}
public int getMaxWorkshops() {
int level = getLevel();
if (level >= WORKSHOP_3_LEVEL) {
return 3;
} else if (level >= WORKSHOP_2_LEVEL) {
return 2;
} else {
return 1;
}
}
public int getMaxPresentsCollected() {
return MAX_PRESENTS_COLLECTED[getLevel()];
}
public int getPresentsCollectedAllTime() {
return presentsReturned + presentsCollected;
}
public int getBagFillPercentage() {
int percentFull = (100 * presentsCollected) / (getMaxPresentsCollected());
return Math.min(percentFull, 100);
}
public float getLargePresentChance() {
return LARGE_PRESENT_CHANCE[getLevel()];
}
// FOR DEBUG ONLY -- Moves user down a level
public void downlevel() {
int currentLevel = getLevel();
int requiredPreviousLevel = PRESENTS_REQUIRED[currentLevel - 1];
int newPresentsReturned = (int) (requiredPreviousLevel / 2);
presentsReturned = newPresentsReturned;
presentsCollected = 0;
save();
}
}