/*******************************************************************************
* 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.Graphics.Screens;
import java.util.ArrayList;
import java.util.HashMap;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.Color;
import com.badlogic.gdx.graphics.GL20;
import com.badlogic.gdx.graphics.Texture;
import com.lyeeedar.Graphics.ParticleEffects.ParticleEffect;
import com.lyeeedar.Graphics.ParticleEffects.ParticleEmitter;
import com.lyeeedar.Roguelike3D.Roguelike3DGame;
import com.lyeeedar.Roguelike3D.Roguelike3DGame.GameScreen;
import com.lyeeedar.Roguelike3D.Game.GameData;
import com.lyeeedar.Roguelike3D.Game.GameData.Damage_Type;
import com.lyeeedar.Roguelike3D.Game.GameData.Element;
import com.lyeeedar.Roguelike3D.Game.GameObject;
import com.lyeeedar.Roguelike3D.Game.GameStats;
import com.lyeeedar.Roguelike3D.Game.Actor.Enemy;
import com.lyeeedar.Roguelike3D.Game.Actor.GameActor;
import com.lyeeedar.Roguelike3D.Game.Actor.Player;
import com.lyeeedar.Roguelike3D.Game.Item.Equipment_HAND;
import com.lyeeedar.Roguelike3D.Game.Item.Equipment_HAND.WeaponType;
import com.lyeeedar.Roguelike3D.Game.Level.Level;
import com.lyeeedar.Roguelike3D.Game.Level.LevelGraphics;
import com.lyeeedar.Roguelike3D.Game.Level.XML.BiomeReader;
import com.lyeeedar.Roguelike3D.Game.Level.XML.RoomReader;
import com.lyeeedar.Roguelike3D.Game.LevelObjects.LevelObject;
import com.lyeeedar.Roguelike3D.Graphics.Lights.LightManager;
import com.lyeeedar.Roguelike3D.Graphics.Lights.LightManager.LightQuality;
import com.lyeeedar.Roguelike3D.Graphics.Models.SkyBox;
import com.lyeeedar.Roguelike3D.Graphics.Renderers.ForwardRenderer;
public class LevelLoadingScreen extends AbstractScreen{
Texture loading_bar;
ArrayList<GameObject> objects = new ArrayList<GameObject>();
float percent = 0;
String message = "";
float step;
Level level;
LevelGraphics graphics;
BiomeReader biome;
RoomReader rReader;
float taskSteps;
GameScreen nextScreen;
int width;
int height;
public LevelLoadingScreen(Roguelike3DGame game) {
super(game);
}
public void setSettings(BiomeReader biome, RoomReader rReader, GameScreen nextScreen)
{
this.width = biome.getWidth();
this.height = biome.getHeight();
this.rReader = rReader;
this.biome = biome;
this.nextScreen = nextScreen;
float size = height*1.5f;
taskSteps = 100f/size;
percent = 0;
message = "";
loadingStage = 0;
}
long time;
int loadingStage = 0;
public void loadingTask()
{
if (loadingStage == 0)
{
time = System.nanoTime();
message = "Disposing previous level";
if (GameData.level != null) GameData.level.dispose();
if (GameData.levelGraphics != null) GameData.levelGraphics.dispose();
loadingStage++;
}
else if (loadingStage == 1)
{
message = "Loading Level";
level = GameData.getCurrentLevelContainer().getLevel(biome, rReader);
GameData.level = level;
percent += taskSteps;
if (level != null) loadingStage++;
}
else if (loadingStage == 2)
{
level.create();
level.fixReferences();
Player player = level.getPlayer();
if (player == null)
{
player = new Player(new Color(0, 0.6f, 0, 1.0f), "blank", 0, 0, 0, 0.5f, GL20.GL_TRIANGLES, "file", "model@");
HashMap<Damage_Type, Integer> DAM_DEF = new HashMap<Damage_Type, Integer>();
DAM_DEF.put(Damage_Type.PIERCE, 50);
DAM_DEF.put(Damage_Type.IMPACT, 50);
DAM_DEF.put(Damage_Type.TOUCH, 0);
HashMap<Element, Integer> ELE_DEF = new HashMap<Element, Integer>();
ELE_DEF.put(Element.FIRE, 0);
ELE_DEF.put(Element.AIR, 0);
ELE_DEF.put(Element.WATER, 0);
ELE_DEF.put(Element.WOOD, 0);
ELE_DEF.put(Element.METAL, 0);
ELE_DEF.put(Element.AETHER, 100);
ELE_DEF.put(Element.VOID, 0);
player.R_HAND = Equipment_HAND.getWeapon(WeaponType.MELEE, "sword", "SWING", 15, ELE_DEF, DAM_DEF, 20, 85, false, 3, 1, level);
player.L_HAND = Equipment_HAND.getWeapon(WeaponType.RANGED, "torch", "FIREBALL", 15, ELE_DEF, DAM_DEF, 71, 13, false, 3, 1, level);
player.create();
player.visible = false;
level.addGameActor(player);
}
GameStats.setPlayerStats(player);
GameData.player = player;
level.positionPlayer(player, GameData.prevLevel, GameData.currentLevel);
percent += taskSteps;
loadingStage++;
}
else if (loadingStage == 3)
{
message = "Creating Fundamental Structure";
graphics = new LevelGraphics(level.levelArray, level.colours, biome, level.hasRoof);
if (GameData.getCurrentLevelContainer().skybox != null)
{
GameData.skyBox = new SkyBox(GameData.getCurrentLevelContainer().skybox);
}
else GameData.skyBox = null;
loadingStage++;
percent += taskSteps*5;
}
else if (loadingStage == 4)
{
message = "Forcing Matter Into Existence";
boolean done = graphics.createTileRow();
percent += taskSteps;
if (done) loadingStage++;
}
else if (loadingStage == 5)
{
message = "Coalescing Matter";
boolean done = graphics.createChunkRow();
percent += taskSteps;
if (done) loadingStage++;
}
else if (loadingStage == 6)
{
message = "Baking Lights";
level.getLights(GameData.lightManager);
level.evaluateUniqueBehaviour(lightManager);
if (GameData.lightQuality != LightQuality.FORWARD_VERTEX)
{
loadingStage++;
return;
}
graphics.bakeLights(GameData.lightManager, true);
level.bakeLights(GameData.lightManager);
loadingStage++;
}
else if (loadingStage == 7)
{
System.out.println("Level loading done in "+((float)(System.nanoTime()-time)/1000000000f)+"seconds");
GameData.finishLoading(graphics, GameScreen.INGAME);
loadingStage++;
}
if (percent > 100) percent = 100;
}
ArrayList<ParticleEmitter> emitters = new ArrayList<ParticleEmitter>();
@Override
public void drawModels(float delta) {
renderer.begin();
for (GameObject go : objects)
{
go.render(renderer, emitters, cam);
}
renderer.end(lightManager);
}
@Override
public void drawOrthogonals(float delta) {
}
@Override
public void drawTransparent(float delta) {
spriteBatch.begin();
spriteBatch.draw(loading_bar, 100, 200, percent*step, 25);
font.drawMultiLine(spriteBatch, message, 250, 175);
spriteBatch.end();
}
float xrotate = 360f/560f;
@Override
public void update(float delta) {
loadingTask();
cam.update();
}
LightManager lightManager;
@Override
public void create() {
lightManager = new LightManager(4, LightQuality.FORWARD_VERTEX);
renderer = new ForwardRenderer();
renderer.createShader(lightManager);
GameObject go = new Enemy(new Color(), "icon", 0, 0, -4, 0.5f, GL20.GL_TRIANGLES, "cube", "2", "2", "2");
go.create();
go.bakeLights(lightManager, true);
objects.add(go);
loading_bar = new Texture(Gdx.files.internal("data/skins/loading_bar.png"));
}
@Override
public void resize(int width, int height)
{
super.resize(width, height);
step = (width-200)/100;
}
@Override
public void hide() {
}
@Override
public void show()
{
Gdx.input.setCursorCatched(false);
}
@Override
public void pause() {
}
@Override
public void resume() {
}
@Override
public void superDispose() {
}
}