package com.gebauz.burutaru.game;
import java.util.Vector;
import com.gebauz.bauzoid.game.Game;
import com.gebauz.bauzoid.game.GameObject;
import com.gebauz.bauzoid.game.entities.EntityManager;
import com.gebauz.bauzoid.graphics.renderstates.RenderStates;
import com.gebauz.bauzoid.graphics.sprite.SpriteTransform;
import com.gebauz.bauzoid.math.Matrix4;
import com.gebauz.bauzoid.math.collision.AABoundingBox;
import com.gebauz.burutaru.BurutaruCustomServices;
import com.gebauz.burutaru.GameConsts;
import com.gebauz.burutaru.game.entities.CollisionWorld;
import com.gebauz.burutaru.game.entities.Entity;
import com.gebauz.burutaru.game.entities.Hud;
import com.gebauz.burutaru.game.entities.IntroOutroTextDisplay;
import com.gebauz.burutaru.game.entities.LightManager;
import com.gebauz.burutaru.game.entities.PowerUps;
import com.gebauz.burutaru.game.entities.Ship;
import com.gebauz.burutaru.game.entities.StarField;
import com.gebauz.burutaru.game.entities.VirtualPad;
import com.gebauz.burutaru.game.entities.effects.Explosions;
import com.gebauz.burutaru.game.entities.effects.Lightning;
import com.gebauz.burutaru.game.entities.effects.WeaponsImpact;
import com.gebauz.burutaru.game.entities.enemies.BasicShots;
import com.gebauz.burutaru.game.entities.enemies.Enemy;
import com.gebauz.burutaru.game.entities.enemies.EnemyInstance;
import com.gebauz.burutaru.game.entities.enemies.LargeShots;
import com.gebauz.burutaru.game.entities.level.Level;
import com.gebauz.burutaru.game.entities.weapons.Bombs;
import com.gebauz.burutaru.game.entities.weapons.Missiles;
import com.gebauz.burutaru.game.entities.weapons.PlasmaShots;
import com.gebauz.burutaru.game.entities.weapons.BeamShots;
import com.gebauz.burutaru.game.ShipParameters;
public class GameLogic
extends GameObject
{
// Constants========================================================================================
// Embedded Types===================================================================================
// Fields===========================================================================================
private EntityManager mEntities =
new EntityManager
();
private Vector<Enemy
> mEnemies =
new Vector<Enemy
>();
private Ship mShip =
null;
private VirtualPad mVirtualPad =
null;
private Hud mHud =
null;
private StarField mStarField =
null;
private LightManager mLightManager =
null;
private PlasmaShots mPlasmaShots =
null;
private BeamShots mBeamShots =
null;
private Missiles mMissiles =
null;
private Bombs mBombs =
null;
private BasicShots mBasicShots =
null;
private LargeShots mLargeShots =
null;
private PowerUps mPowerUps =
null;
private Explosions mExplosions =
null;
private WeaponsImpact mWeaponsImpact =
null;
private Lightning mLightning =
null;
private ShipController mShipController =
null;
private ShipParameters mShipParameters =
null;
private Level mLevel =
null;
private CollisionWorld mCollisionWorld =
null;
private IntroOutroTextDisplay mIntroOutroTextDisplay =
null;
/** The timer used as a reference for spawning and scripting. */
private float mLevelTimer = 0.0f
;
private String mLevelFile =
"data/levels/stage01.level";
// Methods==========================================================================================
public GameLogic
(Game game
)
{
super(game
);
}
public void initAsync
()
{
createEntities
();
mEntities.
initAsync();
}
public void init
()
{
mEntities.
init();
mShipController =
new ShipController
(this);
mShipParameters =
new ShipParameters
(this);
/*
mPowerUps.spawn(600, 40, PowerUps.Type.SPEED_UP);
mPowerUps.spawn(600, 140, PowerUps.Type.MISSILE);
mPowerUps.spawn(600, 240, PowerUps.Type.BOMB);
mPowerUps.spawn(600, 340, PowerUps.Type.BEAM_SHOT);
mPowerUps.spawn(600, 440, PowerUps.Type.SPEED_UP);
*/
mLevel.
start();
}
public void createEntities
()
{
mShip = mEntities.
addEntity(new Ship
(this));
mVirtualPad = mEntities.
addEntity(new VirtualPad
(this));
mHud = mEntities.
addEntity(new Hud
(this));
mPlasmaShots = mEntities.
addEntity(new PlasmaShots
(this));
mBeamShots = mEntities.
addEntity(new BeamShots
(this));
mMissiles = mEntities.
addEntity(new Missiles
(this));
mBombs = mEntities.
addEntity(new Bombs
(this));
mBasicShots = mEntities.
addEntity(new BasicShots
(this));
mLargeShots = mEntities.
addEntity(new LargeShots
(this));
mExplosions = mEntities.
addEntity(new Explosions
(this));
mWeaponsImpact = mEntities.
addEntity(new WeaponsImpact
(this));
mLightning = mEntities.
addEntity(new Lightning
(this));
mPowerUps = mEntities.
addEntity(new PowerUps
(this));
/*mPlasmaShots = mEntities.addEntity(new PlasmaShots(this));
mBeamShots = mEntities.addEntity(new BeamShots(this));
mBlobEnemies = mEntities.addEntity(new BlobEnemies(this));
mCarrotEnemies = mEntities.addEntity(new CarrotEnemies(this));
mPowerUpMissile = mEntities.addEntity(new PowerUpMissile(this));
mPowerUpBomb = mEntities.addEntity(new PowerUpBomb(this));
mImpactExplosions = mEntities.addEntity(new ImpactExplosions(this));*/
mStarField = mEntities.
addEntity(new StarField
(this));
mLightManager = mEntities.
addEntity(new LightManager
(this));
mCollisionWorld = mEntities.
addEntity(new CollisionWorld
(this));
mIntroOutroTextDisplay = mEntities.
addEntity(new IntroOutroTextDisplay
(this));
mLevel = mEntities.
addEntity(new Level(this));
}
public Entity findEntity
(Class<? extends Entity> classType
)
{
for (int i =
0; i
< mEntities.
getNumEntities(); i++
)
{
Entity e =
(Entity)mEntities.
getEntity(i
);
//if (e instanceof classType)
if (classType.
isInstance(e
))
return e
;
}
return null;
}
/** Retrieve the instance of an Entity of a certain class type. Instantiates the entity if it doesn't exist yet. */
public Entity initializeEntity
(Class<? extends Entity> classType
)
{
// if entity already exists, it already has been initialized, just return it then
Entity newEntity = findEntity
(classType
);
if (newEntity
!=
null)
return newEntity
;
try
{
newEntity = classType.
getDeclaredConstructor(GameLogic.
class).
newInstance(this);
}
catch (Exception ex
)
{
getGame
().
log("Cannot instantiate '" + classType.
getName() +
"'");
}
mEntities.
addEntity(newEntity,
true);
newEntity.
initAsync();
// if enemy type, add to list
if (newEntity
instanceof Enemy
)
{
getGame
().
log("Added Enemy Entity '" + classType.
getName() +
"'");
mEnemies.
add((Enemy
)newEntity
);
}
else
getGame
().
log("Added Entity '" + classType.
getName() +
"'");
return newEntity
;
}
public void exit
()
{
mEntities.
exit();
mEnemies.
clear();
mShipController =
null;
}
public void update
(float deltaTime
)
{
//deltaTime /= 5.0f;
/*try
{
Thread.sleep(250);
}
catch (Exception ex)
{
}
deltaTime = 0.12f;*/
mLightManager.
clearLightSources();
mEntities.
update(deltaTime
);
mShip.
update(deltaTime
);
mVirtualPad.
update(deltaTime
);
mBasicShots.
update(deltaTime
);
mLargeShots.
update(deltaTime
);
mPlasmaShots.
update(deltaTime
);
mBeamShots.
update(deltaTime
);
mMissiles.
update(deltaTime
);
mBombs.
update(deltaTime
);
mPowerUps.
update(deltaTime
);
mExplosions.
update(deltaTime
);
mWeaponsImpact.
update(deltaTime
);
mLightning.
update(deltaTime
);
if (!mLevel.
hasLevelEnded())
{
mLevel.
update(deltaTime
);
if (mLevel.
hasLevelEnded())
{
getGame
().
log("Stage Clear!");
mIntroOutroTextDisplay.
startOutro("Stage Clear!");
mShip.
resetNoUpDownMovement();
}
}
mStarField.
update(deltaTime
);
if (!mLevel.
hasLevelEnded())
mShipController.
handleInput(deltaTime
);
// update last because it can accumulate the data before rendering
mLightManager.
update(deltaTime
);
mIntroOutroTextDisplay.
update(deltaTime
);
mHud.
update(deltaTime
);
mLevelTimer += deltaTime
;
}
public void render
()
{
// render level background
//mLevel.renderBackground();
RenderStates rs = getGraphics
().
renderStates;
rs.
pushViewMatrix();
{
Matrix4 t1 = Matrix4.
createTranslation(GameConsts.
VIRTUAL_SCREEN_WIDTH/
2, GameConsts.
VIRTUAL_SCREEN_HEIGHT/
2,
0);
Matrix4 t2 = Matrix4.
createTranslation(-GameConsts.
VIRTUAL_SCREEN_WIDTH/
2, -GameConsts.
VIRTUAL_SCREEN_HEIGHT/
2,
0);
/*Matrix4 t1 = Matrix4.createTranslation(getShip().getPositionX(), getShip().getPositionY(), 0);
Matrix4 t2 = Matrix4.createTranslation(-getShip().getPositionX(), -getShip().getPositionY(), 0);*/
Matrix4 r = Matrix4.
createRotationZ(-getShip
().
getAngle());
rs.
view.
identity();
rs.
view.
multiply(t2
);
rs.
view.
multiply(r
);
rs.
view.
multiply(t1
);
//rs.view.setLookAt(500, 0, -1000, 400, 240, 0, 0, 1, 0);
//rs.view.multiply(Matrix4.createRotationZ(180));
mLevel.
render(Level.
BACKGROUND_LAYER1);
mStarField.
render();
mLevel.
render(Level.
BACKGROUND_LAYER2);
// render level main layer
mLevel.
render(Level.
MAIN_LAYER);
// render powerup pickups
mPowerUps.
render();
// render enemy weapons
mBasicShots.
render();
mLargeShots.
render();
// render entities
mEntities.
render();
// render weapons
mPlasmaShots.
render();
mBeamShots.
render();
mMissiles.
render();
mBombs.
render();
// render ship
mShip.
render();
// explosions and effects
mWeaponsImpact.
render();
mLightning.
render();
mExplosions.
render();
for (int i =
0; i
< mEntities.
getNumEntities(); i++
)
{
Entity e =
(Entity)mEntities.
getEntity(i
);
e.
renderForeground();
}
mLevel.
render(Level.
FOREGROUND_LAYER);
}
rs.
popViewMatrix();
// render HUD and UI
mIntroOutroTextDisplay.
render();
mVirtualPad.
render();
mHud.
render();
//getGraphics().getFont().drawText(String.format("%.3fs", mLevel.getCurrentTime()) + " HP: " + getShipParameters().getHealth(), 10, 10);
BurutaruCustomServices s =
((BurutaruCustomServices
)getGame
().
getCustomServices());
s.
getPrettyFont().
drawText(String.
format("%.03fs", mLevel.
getCurrentTime()),
10,
40, 0.5f
);
mLevel.
render();
}
public boolean isOutOfScreen
(SpriteTransform transform,
float offset
)
{
AABoundingBox box = transform.
getApproximateBoundingBox();
return ((box.
min.
x > (GameConsts.
VIRTUAL_SCREEN_WIDTH + offset
)) ||
(box.
min.
y > (GameConsts.
VIRTUAL_SCREEN_HEIGHT + offset
)) ||
(box.
max.
x < -offset
) ||
(box.
max.
y < -offset
));
}
public boolean isOutOfScreen
(SpriteTransform transform
)
{
return isOutOfScreen
(transform,
0);
}
public EnemyInstance findClosestEnemy
(float x,
float y
)
{
float closestDistanceSqr =
Float.
MAX_VALUE;
EnemyInstance result =
null;
for (int i =
0; i
< mEnemies.
size(); i++
)
{
//EnemyInstance e = mEnemies.get(i).getNearestEnemy(x, y, closestDistanceSqr);
Enemy.
SearchResult searchResult = mEnemies.
get(i
).
getNearestEnemy(x, y, closestDistanceSqr
);
if ((searchResult.
enemyInstance !=
null) && (searchResult.
distanceSqr < closestDistanceSqr
))
{
result = searchResult.
enemyInstance;
closestDistanceSqr = searchResult.
distanceSqr;
}
}
return result
;
}
/** Find all enemies within a certain radius. */
public void findEnemiesInRange
(Vector<EnemyInstance
> enemyList,
float x,
float y,
float radius
)
{
float radiusSqr = radius
*radius
;
for (int i =
0; i
< mEnemies.
size(); i++
)
{
//EnemyInstance e = mEnemies.get(i).getNearestEnemy(x, y, closestDistanceSqr);
mEnemies.
get(i
).
getEnemiesInRange(enemyList, x, y, radiusSqr
);
}
}
/** Find all enemies with the given name. */
public void findEnemyInstancesByName
(Vector<EnemyInstance
> result,
String name
)
{
for (int i =
0; i
< mEnemies.
size(); i++
)
{
for (int j =
0; j
< mEnemies.
get(i
).
getNumInstances(); j++
)
{
EnemyInstance e = mEnemies.
get(i
).
getInstance(j
);
if (name.
equalsIgnoreCase(e.
name))
result.
add(e
);
}
}
}
// Getters/Setters==================================================================================
public final Ship getShip
() { return mShip
; }
public final VirtualPad getVirtualPad
() { return mVirtualPad
; }
public final PlasmaShots getPlasmaShots
() { return mPlasmaShots
; }
public final BeamShots getBeamShots
() { return mBeamShots
; }
public final Missiles getMissiles
() { return mMissiles
; }
public final Bombs getBombs
() { return mBombs
; }
public final BasicShots getBasicShots
() { return mBasicShots
; }
public final LargeShots getLargeShots
() { return mLargeShots
; }
public final PowerUps getPowerUps
() { return mPowerUps
; }
public final Explosions getExplosions
() { return mExplosions
; }
public final WeaponsImpact getWeaponsImpact
() { return mWeaponsImpact
; }
public final Lightning getLightning
() { return mLightning
; }
public final ShipParameters getShipParameters
() { return mShipParameters
; }
public final Level getLevel
() { return mLevel
; }
public final StarField getStarField
() { return mStarField
; }
public final CollisionWorld getCollisionWorld
() { return mCollisionWorld
; }
public final IntroOutroTextDisplay getIntroOutroTextDisplay
() { return mIntroOutroTextDisplay
; }
public final EntityManager getEntities
() { return mEntities
; }
public final float getLevelTimer
() { return mLevelTimer
; }
public String getCurrentLevelFile
() { return mLevelFile
; }
public final Hud getHud
() { return mHud
; }
public final LightManager getLightManager
() { return mLightManager
; }
}