package com.arretadogames.pilot.screens;
import java.util.ArrayList;
import java.util.List;
import android.graphics.Rect;
import android.graphics.RectF;
import android.support.v4.view.GestureDetectorCompat;
import android.view.GestureDetector.OnGestureListener;
import android.view.MotionEvent;
import com.arretadogames.pilot.MainActivity;
import com.arretadogames.pilot.R;
import com.arretadogames.pilot.accounts.Account;
import com.arretadogames.pilot.accounts.AccountManager;
import com.arretadogames.pilot.config.GameSettings;
import com.arretadogames.pilot.database.GameDatabase;
import com.arretadogames.pilot.database.descriptors.StoreItemDescriptor;
import com.arretadogames.pilot.game.Game;
import com.arretadogames.pilot.game.GameState;
import com.arretadogames.pilot.loading.FontLoader;
import com.arretadogames.pilot.loading.FontLoader.FontTypeFace;
import com.arretadogames.pilot.render.opengl.GLCanvas;
import com.arretadogames.pilot.ui.GameButtonListener;
import com.arretadogames.pilot.ui.ImageButton;
import com.arretadogames.pilot.ui.ItemWidget;
import com.arretadogames.pilot.ui.Text;
import com.arretadogames.pilot.util.Assets;
public class GameStore extends GameScreen implements GameButtonListener, OnGestureListener {
private static final int BACK_BT = 2;
private static final int WIDGETS_X_OFFSET = 110;
private static final int Y_DISTANCE_BETWEEN_WIDGETS = 150;
private static final int INITIAL_WIDGETS_Y = 135;
private static final int SCROLLING_AREA_WIDTH = 580;
// This constant will tell how much damping the fling will have (higher values will make the fling less effective)
private static final float FLING_DAMPING = 0.9f;
// This constant will tell how much initial force the fling will have (higher values will make the fling more powerful)
private static final float FLING_PUSH_FORCE = 0.02f;
private Text storeLabel;
private Text moneyLabel;
private RectF seedRenderingMoneyRect = new RectF(0, 0, 45, 45);
private int currentY = INITIAL_WIDGETS_Y;
private final Rect SCROLLING_AREA_RECT;
private InputEventHandler event;
private ArrayList<ItemWidget> storeItems = new ArrayList<ItemWidget>();
private ImageButton buttonBack;
private GestureDetectorCompat mDetector;
private final int MAX_CURRENT_Y;
public GameStore() {
List<StoreItemDescriptor> items = GameDatabase.getInstance().getStoreItems();
for (StoreItemDescriptor item : items) {
ItemWidget widget = new ItemWidget(0, 0, 0, 580, 150, item);
storeItems.add(widget);
}
if (storeItems.size() >= 4) {
MAX_CURRENT_Y = (storeItems.size() - 3) * Y_DISTANCE_BETWEEN_WIDGETS;
} else {
MAX_CURRENT_Y = - INITIAL_WIDGETS_Y;
}
event = new InputEventHandler(null); // MotionEvent will be set later
SCROLLING_AREA_RECT = new Rect(WIDGETS_X_OFFSET, INITIAL_WIDGETS_Y, WIDGETS_X_OFFSET + SCROLLING_AREA_WIDTH,
(int) getDimension(R.dimen.screen_height));
buttonBack = new ImageButton(BACK_BT,
702, 388,
getDimension(R.dimen.main_menu_button_size),
getDimension(R.dimen.main_menu_button_size), this,
R.drawable.back_bt, //bt_back_selected,
R.drawable.back_bt);// bt_back_unselected);
mDetector = new GestureDetectorCompat(MainActivity.getContext(), this);
}
@Override
public void render(GLCanvas canvas, float timeElapsed) {
canvas.drawBitmap(R.drawable.store_background,
0, 0, getDimension(R.dimen.screen_width), getDimension(R.dimen.screen_height),
0, getDimension(R.dimen.store_bg_extra_height));
if (currentY > INITIAL_WIDGETS_Y) {
currentY = INITIAL_WIDGETS_Y;
} else if (currentY < -MAX_CURRENT_Y) {
currentY = - MAX_CURRENT_Y;
}
renderWidgets(canvas, timeElapsed);
canvas.drawBitmap(R.drawable.store_background_header,
0, 0, getDimension(R.dimen.screen_width), 100);
canvas.drawBitmap(R.drawable.store_top, 100, 68, getDimension(R.dimen.store_header_width), getDimension(R.dimen.store_header_height));
if ( AccountManager.get().getAccount1() != null) { // SyncManager.get().isSignedIn() &&
if (storeLabel == null || moneyLabel == null ||
AccountManager.get().getAccount1().getCoins() > 0) {
createUserInfoLabels();
// p1Coins = AccountManager.get().getAccount1().getCoins();
// labelsAreRelatedToAccountProvider = true;
}
seedRenderingMoneyRect.right = 10 + seedRenderingMoneyRect.width();
seedRenderingMoneyRect.left = 10;
seedRenderingMoneyRect.bottom = 13 + seedRenderingMoneyRect.height();
seedRenderingMoneyRect.top = 13;
canvas.drawBitmap(R.drawable.seed1, seedRenderingMoneyRect);
storeLabel.render(canvas, timeElapsed);
moneyLabel.render(canvas, timeElapsed);
}
buttonBack.render(canvas, timeElapsed);
}
private void createUserInfoLabels() {
Account acc = AccountManager.get().getAccount1();
storeLabel = new Text(333, 100, "Store",
FontLoader.getInstance().getFont(FontTypeFace.TRANSMETALS_STORE), 1.3f, false);
moneyLabel = new Text(70, 34, String.valueOf(acc.getCoins()),
FontLoader.getInstance().getFont(FontTypeFace.TRANSMETALS_STORE), 0.9f, false);
}
@Override
public void step(float timeElapsed) {
currentY += currentFlingVelocity;
currentFlingVelocity *= FLING_DAMPING;
}
@Override
public void input(InputEventHandler event) {
mDetector.onTouchEvent(event.getEvent());
}
@Override
public void onPause() {
}
@Override
public void onClick(int buttonId) {
switch (buttonId) {
case BACK_BT:
Assets.mainMenuMusic.play();
Game.getInstance().goTo(GameState.MAIN_MENU);
break;
}
}
private void renderWidgets(GLCanvas canvas, float timeElapsed) {
canvas.saveState();
canvas.translate(WIDGETS_X_OFFSET, currentY);
for (int i = 0; i < storeItems.size() ; i++) {
storeItems.get(i).render(canvas, timeElapsed);
canvas.translate(0, Y_DISTANCE_BETWEEN_WIDGETS);
}
canvas.restoreState();
}
@Override
public void onBackPressed() {
Assets.mainMenuMusic.play();
Game.getInstance().goTo(GameState.MAIN_MENU);
}
@Override
public boolean onDown(MotionEvent e) {
event.setMotionEvent(e);
return buttonBack.input(event);
}
private float currentFlingVelocity = 0;
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
float velocityY) {
event.setMotionEvent(e1);
if (SCROLLING_AREA_RECT.contains((int)event.getX(), (int)event.getY())) {
currentFlingVelocity += (velocityY / GameSettings.HeightRatio) * FLING_PUSH_FORCE;
return true;
}
return false;
}
@Override
public void onLongPress(MotionEvent e) {
}
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,
float distanceY) {
event.setMotionEvent(e1);
if (SCROLLING_AREA_RECT.contains((int)event.getX(), (int)event.getY())) {
currentY -= distanceY / GameSettings.HeightRatio;
return true;
}
return false;
}
@Override
public void onShowPress(MotionEvent e) {
}
@Override
public boolean onSingleTapUp(MotionEvent e) {
event.setMotionEvent(e);
boolean clicked = false;
event.setOffsetX(-WIDGETS_X_OFFSET);
for (int i = 0 ; i < storeItems.size() ; i++) {
event.setOffsetY( - currentY - Y_DISTANCE_BETWEEN_WIDGETS * i);
clicked |= storeItems.get(i).input(event);
}
event.setOffsetY(0);
event.setOffsetX(0);
clicked |= buttonBack.input(event);
return clicked;
}
}