package com.ftloverdrive.event.handler;
import com.badlogic.gdx.utils.Pools;
import com.ftloverdrive.core.OverdriveContext;
import com.ftloverdrive.event.OVDEvent;
import com.ftloverdrive.event.OVDEventHandler;
import com.ftloverdrive.event.ship.ShipCreationEvent;
import com.ftloverdrive.event.ship.ShipLayoutRoomAddEvent;
import com.ftloverdrive.event.ship.ShipPropertyEvent;
import com.ftloverdrive.event.ship.ShipPropertyListener;
import com.ftloverdrive.event.ship.ShipRoomCreationEvent;
import com.ftloverdrive.event.ship.ShipRoomImageChangeEvent;
import com.ftloverdrive.io.ImageSpec;
import com.ftloverdrive.model.ship.DefaultRoomModel;
import com.ftloverdrive.model.ship.RoomModel;
import com.ftloverdrive.model.ship.ShipCoordinate;
import com.ftloverdrive.model.ship.ShipModel;
import com.ftloverdrive.model.ship.TestShipModel;
import com.ftloverdrive.util.OVDConstants;
public class ShipEventHandler implements OVDEventHandler {
private Class[] eventClasses;
private Class[] listenerClasses;
public ShipEventHandler() {
eventClasses = new Class[] {
ShipCreationEvent.class,
ShipPropertyEvent.class,
ShipLayoutRoomAddEvent.class,
ShipRoomCreationEvent.class,
ShipRoomImageChangeEvent.class
};
listenerClasses = new Class[] {
ShipPropertyListener.class
};
}
@Override
public Class[] getEventClasses() {
return eventClasses;
}
@Override
public Class[] getListenerClasses() {
return listenerClasses;
}
@SuppressWarnings("unchecked")
@Override
public void handle( OverdriveContext context, OVDEvent e, Object[] listeners ) {
if ( e instanceof ShipCreationEvent ) {
ShipCreationEvent event = (ShipCreationEvent)e;
int shipRefId = event.getShipRefId();
ShipModel shipModel = new TestShipModel();
context.getReferenceManager().addObject( shipModel, shipRefId );
}
else if ( e instanceof ShipPropertyEvent ) {
ShipPropertyEvent event = (ShipPropertyEvent)e;
int shipRefId = event.getShipRefId();
ShipModel shipModel = context.getReferenceManager().getObject( shipRefId, ShipModel.class );
if ( event.getPropertyType() == ShipPropertyEvent.INT_TYPE ) {
if ( event.getAction() == ShipPropertyEvent.SET_ACTION ) {
int value = event.getIntValue();
String key = event.getPropertyKey();
shipModel.getProperties().setInt( key, value );
}
else if ( event.getAction() == ShipPropertyEvent.INCREMENT_ACTION ) {
int value = event.getIntValue();
String key = event.getPropertyKey();
shipModel.getProperties().incrementInt( key, value );
}
}
for ( int i = listeners.length-2; i >= 0; i-=2 ) {
if ( listeners[i] == ShipPropertyListener.class ) {
((ShipPropertyListener)listeners[i+1]).shipPropertyChanged( context, event );
}
}
}
else if ( e instanceof ShipRoomCreationEvent ) {
ShipRoomCreationEvent event = (ShipRoomCreationEvent)e;
int roomRefId = event.getRoomRefId();
RoomModel roomModel = new DefaultRoomModel();
context.getReferenceManager().addObject( roomModel, roomRefId );
}
else if ( e instanceof ShipRoomImageChangeEvent ) {
ShipRoomImageChangeEvent event = (ShipRoomImageChangeEvent)e;
if ( event.getEventType() == ShipRoomImageChangeEvent.DECOR ) {
int roomRefId = event.getRoomRefId();
ImageSpec imageSpec = event.getImageSpec();
RoomModel roomModel = context.getReferenceManager().getObject( roomRefId, RoomModel.class );
roomModel.setRoomDecorImageSpec( imageSpec );
}
}
else if ( e instanceof ShipLayoutRoomAddEvent ) {
ShipLayoutRoomAddEvent event = (ShipLayoutRoomAddEvent)e;
int shipRefId = event.getShipRefId();
ShipModel shipModel = context.getReferenceManager().getObject( shipRefId, ShipModel.class );
int roomRefId = event.getRoomRefId();
//RoomModel roomModel = context.getReferenceManager().getObject( roomRefId, RoomModel.class );
ShipCoordinate[] roomCoords = event.getRoomCoords();
shipModel.getLayout().addRoom( roomRefId, roomCoords );
}
}
@SuppressWarnings("unchecked")
@Override
public void disposeEvent( OVDEvent e ) {
if ( e.getClass() == ShipCreationEvent.class ) {
Pools.get( ShipCreationEvent.class ).free( (ShipCreationEvent)e );
}
else if ( e.getClass() == ShipPropertyEvent.class ) {
Pools.get( ShipPropertyEvent.class ).free( (ShipPropertyEvent)e );
}
else if ( e.getClass() == ShipRoomCreationEvent.class ) {
Pools.get( ShipRoomCreationEvent.class ).free( (ShipRoomCreationEvent)e );
}
else if ( e.getClass() == ShipRoomImageChangeEvent.class ) {
Pools.get( ShipRoomImageChangeEvent.class ).free( (ShipRoomImageChangeEvent)e );
}
else if ( e.getClass() == ShipLayoutRoomAddEvent.class ) {
Pools.get( ShipLayoutRoomAddEvent.class ).free( (ShipLayoutRoomAddEvent)e );
}
}
}