package com.ftloverdrive.ui.ship;
import com.badlogic.gdx.assets.AssetManager;
import com.badlogic.gdx.graphics.Color;
import com.badlogic.gdx.graphics.g2d.Sprite;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
import com.badlogic.gdx.graphics.g2d.TextureAtlas;
import com.badlogic.gdx.scenes.scene2d.Actor;
import com.badlogic.gdx.scenes.scene2d.Group;
import com.badlogic.gdx.scenes.scene2d.ui.Image;
import com.badlogic.gdx.scenes.scene2d.utils.SpriteDrawable;
import com.badlogic.gdx.utils.Disposable;
import com.badlogic.gdx.utils.IntMap;
import com.ftloverdrive.core.OverdriveContext;
import com.ftloverdrive.event.game.GamePlayerShipChangeEvent;
import com.ftloverdrive.event.game.GamePlayerShipChangeListener;
import com.ftloverdrive.event.ship.ShipPropertyEvent;
import com.ftloverdrive.event.ship.ShipPropertyListener;
import com.ftloverdrive.io.ImageSpec;
import com.ftloverdrive.model.ship.RoomModel;
import com.ftloverdrive.model.ship.ShipCoordinate;
import com.ftloverdrive.model.ship.ShipModel;
import com.ftloverdrive.ui.ship.ShipFloorLinesActor;
import com.ftloverdrive.ui.ship.ShipFloorTilesActor;
import com.ftloverdrive.ui.ship.ShipRoomDecorsActor;
import com.ftloverdrive.ui.ship.ShipWallLinesActor;
import com.ftloverdrive.util.OVDConstants;
public class ShipActor extends Group implements Disposable, GamePlayerShipChangeListener, ShipPropertyListener {
protected AssetManager assetManager;
protected Group shipFudgeGroup;
protected Group shipHullGroup;
protected Group shipFloorplanGroup;
protected SpriteDrawable nullDrawable;
protected Image shieldImage;
protected Image baseImage;
protected Image cloakImage;
protected Image floorImage;
protected ShipFloorTilesActor floorTiles;
protected ShipFloorLinesActor floorLines;
protected ShipRoomDecorsActor roomDecors;
protected ShipWallLinesActor wallLines;
protected int shipModelRefId = -1;
protected ImageSpec shieldImgSpec = null;
protected ImageSpec baseImgSpec = null;
protected ImageSpec cloakImgSpec = null;
protected ImageSpec floorImgSpec = null;
public ShipActor( OverdriveContext context ) {
super();
assetManager = context.getAssetManager();
assetManager.load( OVDConstants.ROOT_ATLAS, TextureAtlas.class );
assetManager.load( OVDConstants.SHIP_ATLAS, TextureAtlas.class );
assetManager.finishLoading();
shipFudgeGroup = new Group();
shipFudgeGroup.setName( "ShipFudgeGroup" );
this.addActor( shipFudgeGroup );
shipHullGroup = new Group();
shipHullGroup.setName( "ShipHullGroup" );
shipFudgeGroup.addActor( shipHullGroup );
shipFloorplanGroup = new Group();
shipFloorplanGroup.setName( "ShipFloorplanGroup" );
shipFudgeGroup.addActor( shipFloorplanGroup );
TextureAtlas rootAtlas = assetManager.get( OVDConstants.ROOT_ATLAS, TextureAtlas.class );
Sprite nullSprite = rootAtlas.createSprite( "nullResource" );
nullDrawable = new SpriteDrawable( nullSprite );
shieldImage = new Image( nullDrawable );
shipHullGroup.addActor( shieldImage );
baseImage = new Image( nullDrawable );
shipHullGroup.addActor( baseImage );
cloakImage = new Image( nullDrawable );
cloakImage.setVisible( false );
shipHullGroup.addActor( cloakImage );
floorImage = new Image( nullDrawable );
shipHullGroup.addActor( floorImage );
floorTiles = new ShipFloorTilesActor( context );
shipFloorplanGroup.addActor( floorTiles );
floorLines = new ShipFloorLinesActor( context );
shipFloorplanGroup.addActor( floorLines );
roomDecors = new ShipRoomDecorsActor( context );
shipFloorplanGroup.addActor( roomDecors );
wallLines = new ShipWallLinesActor( context );
shipFloorplanGroup.addActor( wallLines );
}
@Override
public void draw( SpriteBatch batch, float parentAlpha ) {
if ( shipModelRefId != -1 ) {
//zzz.setPosition( this.getX(), this.getY() );
super.draw( batch, parentAlpha );
}
}
public void setShipModel( OverdriveContext context, int shipModelRefId ) {
this.shipModelRefId = shipModelRefId;
updateShipInfo( context );
}
@Override
public void gamePlayerShipChanged( OverdriveContext context, GamePlayerShipChangeEvent e ) {
if ( e.getPlayerRefId() != context.getNetManager().getLocalPlayerRefId() ) {
return;
}
setShipModel( context, e.getShipRefId() );
}
@Override
public void shipPropertyChanged( OverdriveContext context, ShipPropertyEvent e ) {
if ( e.getShipRefId() != shipModelRefId ) return;
//if ( e.getPropertyType() == ShipPropertyEvent.INT_TYPE ) {
// if ( OVDConstants.HULL.equals( e.getPropertyKey() ) || OVDConstants.HULL_MAX.equals( e.getPropertyKey() ) ) {
// updateShipInfo( context );
// }
//}
}
/**
* Updates the everything to match the current ShipModel.
*/
private void updateShipInfo( OverdriveContext context ) {
if ( shipModelRefId == -1 ) {
shipFudgeGroup.setPosition( 0, 0 );
shipHullGroup.setPosition( 0, 0 );
shieldImgSpec = null;
shieldImage.setDrawable( nullDrawable );
shieldImage.setBounds( 0, 0, 0, 0 );
shieldImage.validate();
baseImgSpec = null;
baseImage.setDrawable( nullDrawable );
baseImage.setBounds( 0, 0, 0, 0 );
baseImage.validate();
floorTiles.clear();
floorTiles.setSize( 0, 0 );
floorLines.clear();
floorLines.setSize( 0, 0 );
this.setSize( 0, 0 );
}
else {
ShipModel shipModel = context.getReferenceManager().getObject( shipModelRefId, ShipModel.class );
TextureAtlas shipAtlas = assetManager.get( OVDConstants.SHIP_ATLAS, TextureAtlas.class );
shipFudgeGroup.setPosition( shipModel.getShipOffsetX(), shipModel.getShipOffsetY() );
shipHullGroup.setPosition( shipModel.getHullOffsetX(), shipModel.getHullOffsetY() );
ImageSpec currentShieldImgSpec = shipModel.getShieldImageSpec();
if ( !isEqual( shieldImgSpec, currentShieldImgSpec ) ) {
shieldImgSpec = currentShieldImgSpec;
Sprite shieldSprite = shipAtlas.createSprite( shieldImgSpec.getRegionName() );
if ( shieldSprite != null ) {
shieldImage.setDrawable( new SpriteDrawable( shieldSprite ) );
} else {
shieldImage.setDrawable( nullDrawable );
}
shieldImage.setX( shipModel.getShieldEllipseSemiMajorAxis() - shieldImage.getPrefWidth()/2 + shipModel.getShieldEllipseOffsetX() );
shieldImage.setY( shipModel.getShieldEllipseSemiMinorAxis() - shieldImage.getPrefHeight()/2 + shipModel.getShieldEllipseOffsetY() );
shieldImage.setSize( shieldImage.getPrefWidth(), shieldImage.getPrefHeight() );
shieldImage.validate();
}
ImageSpec currentBaseImgSpec = shipModel.getBaseImageSpec();
if ( !isEqual( baseImgSpec, currentBaseImgSpec ) ) {
baseImgSpec = currentBaseImgSpec;
Sprite baseSprite = shipAtlas.createSprite( baseImgSpec.getRegionName() );
if ( baseSprite != null ) {
baseImage.setDrawable( new SpriteDrawable( baseSprite ) );
} else {
baseImage.setDrawable( nullDrawable );
}
baseImage.setPosition( 0, 0 );
baseImage.setSize( shipModel.getHullWidth(), shipModel.getHullHeight() );
baseImage.validate();
}
ImageSpec currentCloakImgSpec = shipModel.getCloakImageSpec();
if ( !isEqual( cloakImgSpec, currentCloakImgSpec ) ) {
cloakImgSpec = currentCloakImgSpec;
Sprite cloakSprite = shipAtlas.createSprite( cloakImgSpec.getRegionName() );
if ( cloakSprite != null ) {
cloakImage.setDrawable( new SpriteDrawable( cloakSprite ) );
} else {
cloakImage.setDrawable( nullDrawable );
}
cloakImage.setPosition( -10, -10 );
cloakImage.setWidth( shipModel.getHullWidth()+20 );
cloakImage.setHeight( shipModel.getHullHeight()+20 );
cloakImage.validate();
}
ImageSpec currentFloorImgSpec = shipModel.getFloorImageSpec();
if ( !isEqual( floorImgSpec, currentFloorImgSpec ) ) {
floorImgSpec = currentFloorImgSpec;
Sprite floorSprite = shipAtlas.createSprite( floorImgSpec.getRegionName() );
if ( floorSprite != null ) {
floorImage.setDrawable( new SpriteDrawable( floorSprite ) );
} else {
floorImage.setDrawable( nullDrawable );
}
floorImage.setPosition( 0, 0 );
floorImage.setSize( shipModel.getHullWidth(), shipModel.getHullHeight() );
floorImage.validate();
}
floorTiles.clear();
floorTiles.setSize( shipModel.getHullWidth(), shipModel.getHullHeight() );
floorTiles.setTileSize( 35 );
for ( ShipCoordinate coord : shipModel.getLayout().getAllShipCoords() ) {
floorTiles.addTile( coord );
}
floorLines.clear();
floorLines.setSize( shipModel.getHullWidth(), shipModel.getHullHeight() );
floorLines.setTileSize( 35 );
for ( ShipCoordinate coord : shipModel.getLayout().getAllShipCoords() ) {
floorLines.addTile( coord );
}
roomDecors.clear();
roomDecors.setSize( shipModel.getHullWidth(), shipModel.getHullHeight() );
roomDecors.setTileSize( 35 );
for ( IntMap.Keys it = shipModel.getLayout().roomRefIds(); it.hasNext; ) {
int roomRefId = it.next();
RoomModel roomModel = context.getReferenceManager().getObject( roomRefId, RoomModel.class );
ImageSpec decorImageSpec = roomModel.getRoomDecorImageSpec();
if ( decorImageSpec == null ) continue;
roomDecors.addDecor( decorImageSpec, shipModel.getLayout().getRoomCoords( roomRefId ) );
}
wallLines.clear();
wallLines.setSize( shipModel.getHullWidth(), shipModel.getHullHeight() );
wallLines.setTileSize( 35 );
for ( ShipCoordinate coord : shipModel.getLayout().getAllShipCoords() ) {
wallLines.addTile( coord, shipModel.getLayout().getAllShipCoords() );
}
}
}
protected boolean isEqual( Object a, Object b ) {
if ( a != null ) return a.equals( b );
if ( b != null ) return b.equals( a );
return true; // Both null.
}
// Actors don't normally have a dispose().
@Override
public void dispose() {
floorTiles.dispose();
roomDecors.dispose();
assetManager.unload( OVDConstants.SHIP_ATLAS );
assetManager.unload( OVDConstants.ROOT_ATLAS );
}
}