/*
* Copyright 2015 Daniel Dittmar
*
* 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 dan.dit.whatsthat.riddle.types;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import java.util.ArrayList;
import java.util.List;
import dan.dit.whatsthat.R;
import dan.dit.whatsthat.image.Image;
import dan.dit.whatsthat.riddle.Riddle;
import dan.dit.whatsthat.riddle.RiddleConfig;
import dan.dit.whatsthat.riddle.achievement.holders.AchievementCircle;
import dan.dit.whatsthat.riddle.achievement.holders.AchievementDice;
import dan.dit.whatsthat.riddle.achievement.holders.AchievementFlow;
import dan.dit.whatsthat.riddle.achievement.holders.AchievementJumper;
import dan.dit.whatsthat.riddle.achievement.holders.AchievementLazor;
import dan.dit.whatsthat.riddle.achievement.holders.AchievementMemory;
import dan.dit.whatsthat.riddle.achievement.holders.AchievementSnow;
import dan.dit.whatsthat.riddle.achievement.holders.AchievementTriangle;
import dan.dit.whatsthat.riddle.achievement.holders.TypeAchievementHolder;
import dan.dit.whatsthat.riddle.control.RiddleScoreConfig;
import dan.dit.whatsthat.riddle.games.RiddleCircle;
import dan.dit.whatsthat.riddle.games.RiddleDeveloper;
import dan.dit.whatsthat.riddle.games.RiddleDice;
import dan.dit.whatsthat.riddle.games.RiddleFlow;
import dan.dit.whatsthat.riddle.control.RiddleGame;
import dan.dit.whatsthat.riddle.games.RiddleJumper;
import dan.dit.whatsthat.riddle.games.RiddleLazor;
import dan.dit.whatsthat.riddle.games.RiddleMemory;
import dan.dit.whatsthat.riddle.games.RiddleSnow;
import dan.dit.whatsthat.riddle.games.RiddleTorchlight;
import dan.dit.whatsthat.riddle.games.RiddleTriangle;
import dan.dit.whatsthat.util.general.PercentProgressListener;
/**
* Static helper class that holds static PracticalRiddleType implementations
* for RiddleGames. Each supported type is a singleton whose instance is held and returned by the
* PracticalRiddleType class.
* Created by daniel on 18.05.15.
*/
public class TypesHolder {
public static final int SCORE_MINIMAL = 1;
public static final int SCORE_SIMPLE = 2;
public static final int SCORE_MEDIUM = 3;
public static final int SCORE_HARD = 4;
public static final int SCORE_VERY_HARD = 5;
public static final int SCORE_ULTRA = 6;
private static final long SEC_TO_MS = 1000L;
private TypesHolder() {} // do not instantiate
/**
* The matching type for RiddleCircle.
*/
public static class Circle extends PracticalRiddleType {
public static final String NAME = "Circle";
protected Circle() {
super(new RiddleScoreConfig(25 * SEC_TO_MS, SCORE_SIMPLE));
mHolder = new AchievementCircle(this);
}
@Override
protected String getName() {return NAME;}
@Override
public RiddleGame makeRiddle(Riddle riddle, Image image, Bitmap bitmap, Resources res, RiddleConfig config, PercentProgressListener listener) {
return new RiddleCircle(riddle, image, bitmap, res, config, listener);
}
@Override
public int getInterestValue(RiddleType typeToCheck) {
int interest = super.getInterestValue(typeToCheck);
// if image prefers square format and is strong or medium in contrast we like it
interest += typeToCheck.getInterestValueIfEqual(FormatRiddleType.SQUARE_INSTANCE);
interest += typeToCheck.getInterestValueIfEqual(ContentRiddleType.CONTRAST_STRONG_INSTANCE);
interest += typeToCheck.getInterestValueIfEqual(ContentRiddleType.CONTRAST_MEDIUM_INSTANCE);
interest += typeToCheck.getInterestValueIfEqual(ContentRiddleType.GREY_VERY_INSTANCE);
interest += typeToCheck.getInterestValueIfEqual(ContentRiddleType.GREY_MEDIUM_INSTANCE);
return interest;
}
@Override
public int getRefusalValue(RiddleType preferredTypeOfImage) {
int refusal = super.getRefusalValue(preferredTypeOfImage);
refusal += preferredTypeOfImage.getInterestValueIfEqual(ContentRiddleType.CONTRAST_WEAK_INSTANCE);
return refusal;
}
@Override
public int getIconResId() {
return R.drawable.icon_circle;
}
@Override
public boolean enforcesBitmapAspectRatio() {return true;}
@Override
public int getNameResId() {
return R.string.riddle_type_circle;
}
@Override
public int getExplanationResId() {
return R.string.riddle_type_circle_explanation;
}
@Override
public CharSequence getRiddleHint(Resources res, int hintNumber) {
String[] hints = res.getStringArray(R.array.riddle_type_circle_hints);
if (hintNumber >= 0 && hintNumber < hints.length) {
return hints[hintNumber];
}
return null;
}
@Override
public int getAvailableHintsAtStartCount() {
return 1;
}
@Override
public int getTotalAvailableHintsCount() {
return 9;
}
public List<Integer> getHintCosts() {
List<Integer> costs = new ArrayList<>(getTotalAvailableHintsCount());
costs.add(0);
costs.add(0);
costs.add(0);
costs.add(5);
costs.add(10);
costs.add(15);
costs.add(20);
costs.add(30);
return costs;
}
@Override
public int getAdvertisingResId() {
return R.string.riddle_type_circle_advertising;
}
@Override
public int getId() {
return 1;
}
}
/**
* The matching type for RiddleSnow.
*/
public static class Snow extends PracticalRiddleType {
public static final String NAME = "Snow";
protected Snow() {
super(new RiddleScoreConfig(60 * SEC_TO_MS, SCORE_MEDIUM));
mHolder = new AchievementSnow(this);
}
@Override
protected String getName() {return NAME;}
@Override
public int getAdvertisingResId() {
return R.string.riddle_type_snow_advertising;
}
@Override
public RiddleGame makeRiddle(Riddle riddle, Image image, Bitmap bitmap, Resources res, RiddleConfig config, PercentProgressListener listener) {
return new RiddleSnow(riddle, image, bitmap, res, config, listener);
}
@Override
public int getIconResId() {
return R.drawable.icon_snow;
}
@Override
public int getNameResId() {
return R.string.riddle_type_snow;
}
@Override
public int getExplanationResId() {
return R.string.riddle_type_snow_explanation;
}
@Override
public CharSequence getRiddleHint(Resources res, int hintNumber) {
String[] hints = res.getStringArray(R.array.riddle_type_snow_hints);
if (hintNumber >= 0 && hintNumber < hints.length) {
return hints[hintNumber];
}
return null;
}
@Override
public int getAvailableHintsAtStartCount() {
return 2;
}
@Override
public int getTotalAvailableHintsCount() {
return 6;
}
public List<Integer> getHintCosts() {
List<Integer> costs = new ArrayList<>(getTotalAvailableHintsCount());
costs.add(0);
costs.add(0);
costs.add(25);
costs.add(25);
costs.add(30);
return costs;
}
@Override
public int getId() {
return 2;
}
}
/**
* The matching type for RiddleDice.
*/
public static class Dice extends PracticalRiddleType {
public static final String NAME = "Dice";
protected Dice() {
super(new RiddleScoreConfig(90 * SEC_TO_MS, SCORE_VERY_HARD));
mHolder = new AchievementDice(this);
}
@Override
protected String getName() {return NAME;}
@Override
public int getAdvertisingResId() {
return R.string.riddle_type_dice_advertising;
}
@Override
public boolean enforcesBitmapAspectRatio() {
return true;
}
@Override
public RiddleGame makeRiddle(Riddle riddle, Image image, Bitmap bitmap, Resources res, RiddleConfig config, PercentProgressListener listener) {
return new RiddleDice(riddle, image, bitmap, res, config, listener);
}
@Override
public int getInterestValue(RiddleType typeToCheck) {
int interest = super.getInterestValue(typeToCheck);
interest += typeToCheck.getInterestValueIfEqual(FormatRiddleType.SQUARE_INSTANCE);
interest += typeToCheck.getInterestValueIfEqual(ContentRiddleType.GREY_LITTLE_INSTANCE);
interest += typeToCheck.getInterestValueIfEqual(ContentRiddleType.CONTRAST_WEAK_INSTANCE);
return interest;
}
@Override
public int getIconResId() {
return R.drawable.icon_dice;
}
@Override
public int getNameResId() {
return R.string.riddle_type_dice;
}
@Override
public int getExplanationResId() {
return R.string.riddle_type_dice_explanation;
}
@Override
public CharSequence getRiddleHint(Resources res, int hintNumber) {
String[] hints = res.getStringArray(R.array.riddle_type_dice_hints);
if (hintNumber >= 0 && hintNumber < hints.length) {
return hints[hintNumber];
}
return null;
}
@Override
public int getAvailableHintsAtStartCount() {
return 2;
}
@Override
public int getTotalAvailableHintsCount() {return 9;}
public List<Integer> getHintCosts() {
List<Integer> costs = new ArrayList<>(getTotalAvailableHintsCount());
costs.add(0);
costs.add(0);
costs.add(30);
costs.add(35);
costs.add(35);
costs.add(30);
return costs;
}
@Override
public int getId() {
return 3;
}
}
/**
* The matching type for RiddleTriangle.
*/
public static class Triangle extends PracticalRiddleType {
public static final String NAME = "Triangle";
protected Triangle() {
super(new RiddleScoreConfig(22 * SEC_TO_MS, SCORE_SIMPLE));
mHolder = new AchievementTriangle(this);
}
@Override
protected String getName() {return NAME;}
@Override
public int getAdvertisingResId() {
return R.string.riddle_type_triangle_advertising;
}
@Override
public boolean enforcesBitmapAspectRatio() {return true;}
@Override
public RiddleGame makeRiddle(Riddle riddle, Image image, Bitmap bitmap, Resources res, RiddleConfig config, PercentProgressListener listener) {
return new RiddleTriangle(riddle, image, bitmap, res, config, listener);
}
@Override
public int getInterestValue(RiddleType typeToCheck) {
int interest = super.getInterestValue(typeToCheck);
interest += typeToCheck.getInterestValueIfEqual(ContentRiddleType.GREY_LITTLE_INSTANCE);
interest += typeToCheck.getInterestValueIfEqual(ContentRiddleType.CONTRAST_WEAK_INSTANCE);
return interest;
}
@Override
public int getIconResId() {
return R.drawable.icon_triangle;
}
@Override
public int getNameResId() {
return R.string.riddle_type_triangle;
}
@Override
public int getExplanationResId() {
return R.string.riddle_type_triangle_explanation;
}
@Override
public CharSequence getRiddleHint(Resources res, int hintNumber) {
String[] hints = res.getStringArray(R.array.riddle_type_triangle_hints);
if (hintNumber >= 0 && hintNumber < hints.length) {
return hints[hintNumber];
}
return null;
}
@Override
public int getAvailableHintsAtStartCount() {
return 1;
}
@Override
public int getTotalAvailableHintsCount() {return 6;
}
public List<Integer> getHintCosts() {
List<Integer> costs = new ArrayList<>(getTotalAvailableHintsCount());
costs.add(0);
costs.add(30);
costs.add(35);
costs.add(25);
return costs;
}
@Override
public int getId() {
return 4;
}
}
/**
* The matching type for RiddleJumper.
*/
public static class Jumper extends PracticalRiddleType {
public static final String NAME = "Jumper";
public static final double BITMAP_ASPECT_RATIO = 5. / 4.;
protected Jumper() {
super(new RiddleScoreConfig(70 * SEC_TO_MS, SCORE_HARD));
mHolder = new AchievementJumper(this);
}
@Override
protected String getName() {return NAME;}
@Override
public int getAdvertisingResId() {
return R.string.riddle_type_jumper_advertising;
}
@Override
public RiddleGame makeRiddle(Riddle riddle, Image image, Bitmap bitmap, Resources res, RiddleConfig config, PercentProgressListener listener) {
return new RiddleJumper(riddle, image, bitmap, res, config, listener);
}
@Override
public int getIconResId() {
return R.drawable.icon_jumprun;
}
@Override
public int getNameResId() {
return R.string.riddle_type_jumper;
}
@Override
public int getExplanationResId() {
return R.string.riddle_type_jumper_explanation;
}
@Override
public double getSuggestedBitmapAspectRatio() {
return BITMAP_ASPECT_RATIO;
}
@Override
public CharSequence getRiddleHint(Resources res, int hintNumber) {
String[] hints = res.getStringArray(R.array.riddle_type_jumper_hints);
if (hintNumber >= 0 && hintNumber < hints.length) {
return hints[hintNumber];
}
return null;
}
@Override
public int getAvailableHintsAtStartCount() {
return 2;
}
@Override
public int getTotalAvailableHintsCount() {
return 12;
}
public List<Integer> getHintCosts() {
List<Integer> costs = new ArrayList<>(getTotalAvailableHintsCount());
costs.add(0);
costs.add(0);
costs.add(5);
costs.add(10);
costs.add(10);
costs.add(20);
costs.add(20);
costs.add(35);
costs.add(40);
costs.add(40);
costs.add(50);
costs.add(70);
return costs;
}
@Override
public int getInterestValue(RiddleType typeToCheck) {
int interest = super.getInterestValue(typeToCheck);
interest += typeToCheck.getInterestValueIfEqual(ContentRiddleType.CONTRAST_WEAK_INSTANCE);
return interest;
}
@Override
public int getId() {
return 5;
}
}
/**
* The matching type for RiddleMemory.
*/
public static class Memory extends PracticalRiddleType {
public static final String NAME = "Memory";
protected Memory() {
super(new RiddleScoreConfig(90 * SEC_TO_MS, SCORE_VERY_HARD));
mHolder = new AchievementMemory(this);
}
@Override
protected String getName() {return NAME;}
@Override
public int getAdvertisingResId() {
return R.string.riddle_type_memory_advertising;
}
@Override
public RiddleGame makeRiddle(Riddle riddle, Image image, Bitmap bitmap, Resources res, RiddleConfig config, PercentProgressListener listener) {
return new RiddleMemory(riddle, image, bitmap, res, config, listener);
}
@Override
public int getIconResId() {
return R.drawable.icon_memory;
}
@Override
public int getNameResId() {
return R.string.riddle_type_memory;
}
@Override
public int getExplanationResId() {
return R.string.riddle_type_memory_explanation;
}
@Override
public CharSequence getRiddleHint(Resources res, int hintNumber) {
String[] hints = res.getStringArray(R.array.riddle_type_memory_hints);
if (hintNumber >= 0 && hintNumber < hints.length) {
return hints[hintNumber];
}
return null;
}
@Override
public int getAvailableHintsAtStartCount() {
return 1;
}
@Override
public int getTotalAvailableHintsCount() {return 5;}
public List<Integer> getHintCosts() {
List<Integer> costs = new ArrayList<>(getTotalAvailableHintsCount());
costs.add(0);
costs.add(20);
costs.add(30);
costs.add(40);
return costs;
}
@Override
public int getId() {
return 6;
}
}
/**
* The matching type for RiddleDeveloper. Not to be really used as the game does nothing
* and is meant for testing purposes and stuff only available to the developers.
*/
public static class Developer extends PracticalRiddleType {
public static final String NAME = "Developer";
protected Developer() {
super(new RiddleScoreConfig(1000L, 0));
}
@Override
protected String getName() {return NAME;}
@Override
public int getAdvertisingResId() {
return R.string.riddle_type_developer_advertising;
}
@Override
public RiddleGame makeRiddle(Riddle riddle, Image image, Bitmap bitmap, Resources res, RiddleConfig config, PercentProgressListener listener) {
return new RiddleDeveloper(riddle, image, bitmap, res, config, listener);
}
@Override
public int getIconResId() {
return R.drawable.icon_plain;
}
@Override
public int getNameResId() {
return R.string.riddle_type_developer;
}
@Override
public int getExplanationResId() {
return R.string.riddle_type_developer_explanation;
}
@Override
public int getId() {
return 7;
}
}
/**
* New testing project by FD
*/
public static class Torchlight extends PracticalRiddleType {
public static final String NAME = "Torchlight";
protected Torchlight() {
super(new RiddleScoreConfig(1000L, 0));
}
@Override
protected String getName() {return NAME;}
@Override
public int getAdvertisingResId() {
return R.string.riddle_type_torchlight_advertising;
}
@Override
public RiddleGame makeRiddle(Riddle riddle, Image image, Bitmap bitmap, Resources res, RiddleConfig config, PercentProgressListener listener) {
return new RiddleTorchlight(riddle, image, bitmap, res, config, listener);
}
@Override
public int getIconResId() {
return R.drawable.icon_plain;
}
@Override
public int getNameResId() {
return R.string.riddle_type_torchlight;
}
@Override
public int getExplanationResId() {
return R.string.riddle_type_torchlight_explanation;
}
@Override
public int getId() {
return 8;
}
}
/**
* The riddle type for the Flow riddle.
*/
public static class Flow extends PracticalRiddleType {
public static final String NAME = "Flow";
protected Flow() {
super(new RiddleScoreConfig(40 * SEC_TO_MS, SCORE_MEDIUM));
mHolder = new AchievementFlow(this);
}
@Override
protected String getName() {return NAME;}
@Override
public int getAdvertisingResId() {
return R.string.riddle_type_flow_advertising;
}
@Override
public RiddleGame makeRiddle(Riddle riddle, Image image, Bitmap bitmap, Resources res, RiddleConfig config, PercentProgressListener listener) {
return new RiddleFlow(riddle, image, bitmap, res, config, listener);
}
@Override
public int getIconResId() {
return R.drawable.icon_flow;
}
@Override
public int getNameResId() {
return R.string.riddle_type_flow;
}
@Override
public int getExplanationResId() {
return R.string.riddle_type_flow_explanation;
}
@Override
public int getInterestValue(RiddleType typeToCheck) {
int interest = super.getInterestValue(typeToCheck);
interest += typeToCheck.getInterestValueIfEqual(ContentRiddleType.CONTRAST_STRONG_INSTANCE);
interest += typeToCheck.getInterestValueIfEqual(ContentRiddleType.CONTRAST_MEDIUM_INSTANCE);
return interest;
}
@Override
public CharSequence getRiddleHint(Resources res, int hintNumber) {
String[] hints = res.getStringArray(R.array.riddle_type_flow_hints);
if (hintNumber >= 0 && hintNumber < hints.length) {
return hints[hintNumber];
}
return null;
}
@Override
public int getAvailableHintsAtStartCount() {
return 1;
}
@Override
public int getTotalAvailableHintsCount() {
return 4;
}
public List<Integer> getHintCosts() {
List<Integer> costs = new ArrayList<>(getTotalAvailableHintsCount());
costs.add(0);
costs.add(10);
costs.add(15);
return costs;
}
@Override
public int getId() {
return 9;
}
}
/**
* The riddle type for the Lazor riddle.
*/
public static class Lazor extends PracticalRiddleType {
public static final String NAME = "Lazor";
private static final double BITMAP_ASPECT_RATIO = 5. / 4.;
protected Lazor() {
super(new RiddleScoreConfig(60 * SEC_TO_MS, SCORE_HARD));
mHolder = new AchievementLazor(this);
}
@Override
protected String getName() {return NAME;}
@Override
public int getAdvertisingResId() {
return R.string.riddle_type_lazor_advertising;
}
@Override
public double getSuggestedBitmapAspectRatio() {
return BITMAP_ASPECT_RATIO;
}
@Override
public boolean enforcesBitmapAspectRatio() {return true;}
@Override
public RiddleGame makeRiddle(Riddle riddle, Image image, Bitmap bitmap, Resources res, RiddleConfig config, PercentProgressListener listener) {
return new RiddleLazor(riddle, image, bitmap, res, config, listener);
}
@Override
public int getIconResId() {
return R.drawable.icon_lazor;
}
@Override
public int getNameResId() {
return R.string.riddle_type_lazor;
}
@Override
public int getExplanationResId() {
return R.string.riddle_type_lazor_explanation;
}
@Override
public CharSequence getRiddleHint(Resources res, int hintNumber){
String[] hints = res.getStringArray(R.array.riddle_type_lazor_hints);
if (hintNumber >=0 && hintNumber < hints.length) {
return hints[hintNumber];
}
return null;
}
@Override
public int getAvailableHintsAtStartCount() {return 2;}
@Override
public int getTotalAvailableHintsCount() {return 7;}
public List<Integer> getHintCosts(){
List<Integer> costs = new ArrayList<>(getTotalAvailableHintsCount());
costs.add(0);
costs.add(10);
costs.add(15);
costs.add(35);
costs.add(20);
costs.add(30);
return costs;
}
@Override
public int getInterestValue(RiddleType typeToCheck) {
int interest = super.getInterestValue(typeToCheck);
interest += typeToCheck.getInterestValueIfEqual(FormatRiddleType.LANDSCAPE_INSTANCE);
interest += typeToCheck.getInterestValueIfEqual(ContentRiddleType.CONTRAST_WEAK_INSTANCE);
return interest;
}
@Override
public int getId() {
return 10;
}
}
}