/*
* Copyright (c) 2012. HappyDroids LLC, All rights reserved.
*/
package com.happydroids.droidtowers.graphics;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.Color;
import com.badlogic.gdx.graphics.g2d.ParticleEffect;
import com.badlogic.gdx.math.Rectangle;
import com.badlogic.gdx.math.Vector2;
import com.google.common.collect.Iterators;
import com.google.common.collect.Sets;
import com.google.common.eventbus.Subscribe;
import com.happydroids.droidtowers.achievements.AchievementEngine;
import com.happydroids.droidtowers.achievements.TutorialEngine;
import com.happydroids.droidtowers.achievements.TutorialStep;
import com.happydroids.droidtowers.entities.GameLayer;
import com.happydroids.droidtowers.entities.GameObject;
import com.happydroids.droidtowers.events.AchievementCompletionEvent;
import com.happydroids.droidtowers.events.GridObjectPlacedEvent;
import com.happydroids.droidtowers.events.PurchaseEvent;
import com.happydroids.droidtowers.events.RespondsToWorldSizeChange;
import com.happydroids.droidtowers.graphics.effects.ParticleEffectManager;
import com.happydroids.droidtowers.grid.GameGrid;
import java.util.Iterator;
import java.util.Set;
import static com.happydroids.droidtowers.TowerConsts.GRID_UNIT_SIZE;
import static com.happydroids.droidtowers.TowerConsts.LOBBY_FLOOR;
public class FireWorksLayer extends GameLayer<ParticleEffectManager> implements RespondsToWorldSizeChange {
private static final float FIREWORK_DURATION = 10f;
private final Iterator<float[]> colorsIterator;
private final Rectangle worldBounds;
private boolean playFireWorks;
private float timePlaying;
public FireWorksLayer(GameGrid gameGrid) {
super();
gameGrid.events().register(this);
TutorialEngine.instance().eventBus().register(this);
AchievementEngine.instance().eventBus().register(this);
ParticleEffect particleEffect = new ParticleEffect();
particleEffect.load(Gdx.files.internal("particles/firework.p"), Gdx.files.internal("particles"));
Set<float[]> colors = Sets.newHashSet();
colors.add(makeParticleColorArray(Color.WHITE, Color.RED, Color.ORANGE));
colors.add(makeParticleColorArray(Color.WHITE, Color.BLUE, Color.GREEN));
colors.add(makeParticleColorArray(Color.WHITE, Color.YELLOW, Color.PINK));
colors.add(makeParticleColorArray(Color.WHITE, Color.PINK, Color.MAGENTA));
colors.add(makeParticleColorArray(Color.WHITE, Color.BLUE, Color.CYAN));
colorsIterator = Iterators.cycle(colors);
worldBounds = new Rectangle();
for (int i = 0; i < 10; i++) {
addChild(new ParticleEffectManager(new ParticleEffect(particleEffect), colorsIterator, worldBounds));
}
}
private float[] makeParticleColorArray(final Color colorA, final Color colorB, final Color colorC) {
return new float[]{
colorA.r, colorA.g, colorA.b, colorA.a,
colorB.r, colorB.g, colorB.b, colorB.a,
colorC.r, colorC.g, colorC.b, colorC.a
};
}
@Override
protected boolean shouldCullObjects() {
return false;
}
private void play() {
playFireWorks = true;
for (GameObject gameObject : gameObjects) {
((ParticleEffectManager) gameObject).resetEffect();
}
}
@Override
public void update(float timeDelta) {
super.update(timeDelta);
if (playFireWorks) {
timePlaying += timeDelta;
if (timePlaying >= FIREWORK_DURATION) {
timePlaying = 0f;
playFireWorks = false;
for (GameObject gameObject : gameObjects) {
((ParticleEffectManager) gameObject).stop();
}
}
}
}
@Override
public void updateWorldSize(Vector2 worldSize) {
int groundHeight = GRID_UNIT_SIZE * LOBBY_FLOOR;
worldBounds.set(0, groundHeight + GRID_UNIT_SIZE * 5, worldSize.x, groundHeight + GRID_UNIT_SIZE * 20);
}
@Subscribe
public void PurchaseManger_onPurchase(PurchaseEvent event) {
play();
}
@Subscribe
public void GameGrid_onGridObjectPlaced(GridObjectPlacedEvent event) {
// play();
}
@Subscribe
public void AchievementEngine_onAchievementCompletion(AchievementCompletionEvent event) {
if (event.getAchievement() instanceof TutorialStep) {
if (event.getAchievement().getId().equalsIgnoreCase("tutorial-finished")) {
play();
}
} else {
play();
}
}
}