/*******************************************************************************
* Copyright (c) 2013 Philip Collin.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the GNU Public License v3.0
* which accompanies this distribution, and is available at
* http://www.gnu.org/licenses/gpl.html
*
* Contributors:
* Philip Collin - initial API and implementation
******************************************************************************/
package com.lyeeedar.Roguelike3D.Game.Level;
import java.io.Serializable;
import java.util.ArrayList;
import com.badlogic.gdx.graphics.Camera;
import com.lyeeedar.Graphics.ParticleEffects.ParticleEmitter;
import com.lyeeedar.Roguelike3D.Game.GameObject;
import com.lyeeedar.Roguelike3D.Game.Actor.GameActor;
import com.lyeeedar.Roguelike3D.Game.Actor.Player;
import com.lyeeedar.Roguelike3D.Game.LevelObjects.Door;
import com.lyeeedar.Roguelike3D.Game.LevelObjects.LevelObject;
import com.lyeeedar.Roguelike3D.Game.LevelObjects.PlayerPlacer;
import com.lyeeedar.Roguelike3D.Game.LevelObjects.Spawner;
import com.lyeeedar.Roguelike3D.Game.LevelObjects.Stair;
import com.lyeeedar.Roguelike3D.Game.LevelObjects.Static;
import com.lyeeedar.Roguelike3D.Graphics.Lights.LightManager;
import com.lyeeedar.Roguelike3D.Graphics.Renderers.Renderer;
import com.lyeeedar.Utils.Bag;
public class Tile implements Serializable {
private static final long serialVersionUID = -2774877067050458423L;
public char character;
/**
* The floor of the tile
*/
public float floor;
/**
* The roof of the tile (the very top)
*/
public float roof;
/**
* The height of the tile (if this = roof then it a full height wall)
*/
public float height;
public boolean visible = false;
public boolean seen = false;
public Bag<GameActor> actors = new Bag<GameActor>();
public Bag<LevelObject> levelObjects = new Bag<LevelObject>();
private transient int arrayLen;
public Tile (char character, float floor, float roof, float height)
{
this.character = character;
this.floor = floor;
this.roof = roof;
this.height = height;
}
public void update(float delta, Camera cam)
{
for (LevelObject lo : levelObjects)
{
lo.update(delta, cam);
}
for (GameActor ga : actors)
{
ga.update(delta, cam);
}
}
public void render(Renderer renderer, Camera cam, ArrayList<ParticleEmitter> visibleEmitters)
{
for (LevelObject lo : levelObjects)
{
lo.render(renderer, visibleEmitters, cam);
}
for (GameActor ga : actors)
{
ga.render(renderer, visibleEmitters, cam);
}
}
public Player getPlayer()
{
for (GameActor ga : actors)
{
if (ga instanceof Player)
{
return (Player) ga;
}
}
return null;
}
public boolean isSolid()
{
for (LevelObject lo : levelObjects)
{
if (lo instanceof Static)
{
return true;
}
}
return false;
}
public void getLights(LightManager lightManager)
{
for (GameObject go : actors) go.getLight(lightManager);
for (GameObject go : levelObjects) go.getLight(lightManager);
}
public boolean positionPlayer(Player player, String prevLevel, String currentLevel)
{
for (LevelObject lo : levelObjects) {
if (lo instanceof PlayerPlacer)
{
System.out.println("Player placed at Player Placer");
if (prevLevel.equals(currentLevel))
{
player.positionAbsolutely(lo.position.x, lo.position.y+player.radius+1, lo.position.z);
return true;
}
}
else if (lo instanceof Stair)
{
System.out.println("Player placed at Stair");
Stair s = (Stair) lo;
if (s.level_UID.equals(prevLevel))
{
player.positionAbsolutely(s.position.x, s.position.y+s.position.y+s.radius+player.radius+1, 0);
return true;
}
}
}
return false;
}
public void evaluateUniqueBehaviour(Level level, LightManager lightManager)
{
for (LevelObject lo : levelObjects) {
if (lo instanceof Spawner)
{
Spawner s = (Spawner) lo;
s.spawn(level, lightManager);
}
else if (lo instanceof Door)
{
Door d = (Door) lo;
d.orientate(level);
}
}
}
public void bakeLights(LightManager lightManager)
{
for (GameActor ga : actors)
{
ga.bakeLights(lightManager, false);
if (ga.L_HAND != null) ga.L_HAND.model.bakeLight(lightManager, false);
if (ga.R_HAND != null) ga.R_HAND.model.bakeLight(lightManager, false);
}
for (LevelObject lo : levelObjects)
{
lo.bakeLights(lightManager, true);
}
}
public void create()
{
for (GameActor ga : actors)
{
ga.create();
}
for (LevelObject lo : levelObjects)
{
lo.create();
}
}
public void dispose()
{
for (GameActor ga : actors)
{
ga.dispose();
}
for (LevelObject lo : levelObjects)
{
lo.dispose();
}
}
public void fixReferences()
{
for (GameActor ga : actors)
{
ga.fixReferences();
}
for (LevelObject lo : levelObjects)
{
lo.fixReferences();
}
}
public void removeLevelObject(String UID)
{
arrayLen = levelObjects.size;
for (int i = 0; i < arrayLen; i++)
{
if (UID.equals(levelObjects.get(i).UID)) {
levelObjects.remove(i);
return;
}
}
}
public void removeGameActor(String UID)
{
arrayLen = actors.size;
for (int i = 0; i < arrayLen; i++)
{
if (UID.equals(actors.get(i).UID)) {
actors.remove(i);
return;
}
}
}
}