package com.rebelkeithy.ftl.view;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import com.badlogic.gdx.graphics.Pixmap;
import com.badlogic.gdx.graphics.Pixmap.Format;
import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.graphics.g2d.Sprite;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
import com.badlogic.gdx.graphics.g2d.TextureRegion;
import com.rebelkeithy.ftl.crew.Crew;
import com.rebelkeithy.ftl.ship.Direction;
import com.rebelkeithy.ftl.ship.Door;
import com.rebelkeithy.ftl.ship.Room;
import com.rebelkeithy.ftl.ship.Ship;
import com.rebelkeithy.ftl.ship.Tile;
public class ShipRenderer
{
Texture floor;
Texture thrusters;
Ship ship;
Set<Sprite> rooms;
int offsetX;
int offsetY;
int shipOffsetX;
int shipOffsetY;
int shipTextureOffsetX = 0;
int shipTextureOffsetY = 0;
int shieldOffsetX = 0;
int shieldOffsetY = 0;
int roomTextureOffsetX = 0;
int roomTextureOffsetY = 0;
RoomRenderer roomRenderer;
//CrewRenderer crewRenderer;
private boolean interactive;
public ShipRenderer(Ship ship)
{
rooms = new HashSet<Sprite>();
this.ship = ship;
thrusters = TextureRegistry.registerSprite("thrusters_on", "effects/thrusters_on");
roomRenderer = new RoomRenderer();
//crewRenderer = new CrewRenderer(crew, "human_glow");
shipOffsetX = ship.renderData.offsetX;
shipOffsetY = ship.renderData.offsetY;
shipTextureOffsetX = ship.renderData.shipTextureOffsetX;
shipTextureOffsetY = ship.renderData.shipTextureOffsetY;
roomTextureOffsetX = ship.renderData.roomTextureOffsetX;
roomTextureOffsetY = ship.renderData.roomTextureOffsetY;
shieldOffsetX = ship.renderData.shieldTextureOffsetX;
shieldOffsetY = ship.renderData.shieldTextureOffsetY;
Map<String, Room> shipRooms = ship.getRooms();
float tileWidth = 35f;
for(Room room : shipRooms.values())
{
Pixmap roomMap = new Pixmap((int)(room.getWidth()*35), (int)(room.getHeight()*35), Format.RGBA8888);
roomMap.setColor(230/256f, 225/256f, 219/256f, 1);
roomMap.fill();
roomMap.setColor(0, 0, 0, 1);
roomMap.drawRectangle(0, 0, roomMap.getWidth(), roomMap.getHeight());
roomMap.drawRectangle(1, 1, roomMap.getWidth()-2, roomMap.getHeight()-2);
roomMap.setColor(182/256f, 173/256f, 166/256f, 1);
for(int i = 1; i < room.getWidth(); i++)
{
roomMap.drawLine(i*34, 2, i*34, roomMap.getHeight()-3);
}
for(int i = 1; i < room.getHeight(); i++)
{
roomMap.drawLine(2, i*34, roomMap.getWidth()-3, i*34);
}
Sprite sprite = new Sprite(new Texture(roomMap));
roomMap.dispose();
sprite.setPosition(shipOffsetX + room.getX() * tileWidth, shipOffsetY + room.getY() * tileWidth);
sprite.setSize(room.getWidth() * tileWidth, room.getHeight() * tileWidth);
rooms.add(sprite);
}
}
public void setOffset(int offsetX, int offsetY)
{
this.offsetX = offsetX;
this.offsetY = offsetY;
}
public void render(SpriteBatch batch, Ship ship)
{
int totalShipOffsetX = shipOffsetX + offsetX;
int totalShipOffsetY = shipOffsetY + offsetY;
//Matrix4 m = batch.getProjectionMatrix();
//Matrix4 m_saved = m.cpy();
//if(false /*Event has another ship*/)
// batch.setProjectionMatrix(m.translate(shipOffsetX-150, shipOffsetY, 0));
//else
// batch.setProjectionMatrix(m.translate(shipOffsetX, shipOffsetY, 0));
Texture shieldImage = TextureRegistry.getTexture(ship.renderData.shieldTexture);
int shieldLvl = ship.getShieldLvl();
if(shieldLvl > 0)
{
float alpha = 0.5f + 0.12f * (shieldLvl-1);
batch.setColor(1, 1, 1, alpha);
batch.draw(shieldImage, totalShipOffsetX + shieldOffsetX, totalShipOffsetY + shieldOffsetY);
batch.setColor(1, 1, 1, 1);
}
Texture texture = TextureRegistry.getTexture(ship.renderData.shipTexture);
batch.draw(texture, totalShipOffsetX + shipTextureOffsetX, totalShipOffsetY + shipTextureOffsetY);
if(ship.getSystem("engines").isPowered() && ship.getSystem("pilot").isManned())
{
long time = System.currentTimeMillis();
int u = (int) ((time%500)/125);
TextureRegion thrustersRegion = new TextureRegion(thrusters, u*22, 0, 22, 70);
for(int i = 0; i < ship.renderData.thrusterX.length; i++)
{
batch.draw(thrustersRegion, totalShipOffsetX + ship.renderData.thrusterX[i], totalShipOffsetY + ship.renderData.thrusterY[i]);
}
}
texture = TextureRegistry.getTexture(ship.renderData.roomTexture);
batch.draw(texture, totalShipOffsetX + roomTextureOffsetX, totalShipOffsetY + roomTextureOffsetY);
for(Room room : ship.getRooms().values())
{
roomRenderer.render(batch, room, totalShipOffsetX, totalShipOffsetY);
}
for(Room room : ship.getRooms().values())
{
for(Door door : room.getDoors())
{
DoorRenderer.getRenderer(door).render(batch, door, totalShipOffsetX, totalShipOffsetY);
}
}
for(Crew member : ship.getCrew())
{
if(CrewRenderer.getCrewRenderer(member) == null)
{
CrewRenderer.registerCrewRenderer(member, new CrewRenderer(member));
}
CrewRenderer.getCrewRenderer(member).render(batch, member, totalShipOffsetX, totalShipOffsetY);
}
}
public boolean click(int screenX, int screenY, int button)
{
if(!interactive)
return false;
for(int i = 0; i < ship.getCrew().size(); i++)
{
Crew member = ship.getCrew().get(i);
int crewX = (int) (member.getX() * 35 + shipOffsetX + offsetX);
int crewY = (int) (member.getY() * 35 + shipOffsetY + offsetY);
if(button == 0 && screenX > crewX && screenX < crewX + 35 && screenY > crewY && screenY < crewY + 35)
{
FTLView.inputHandler.selected = member;
return true;
}
CrewRenderer renderer = CrewRenderer.getCrewRenderer(member);
renderer.click(screenX, screenY, button, member, i);
}
if(FTLView.inputHandler.selected instanceof Crew)
{
for(Room room : ship.getRooms().values())
{
int roomX = room.getX() * 35 + shipOffsetX + offsetX;
int roomY = room.getY() * 35 + shipOffsetY + offsetY;
if(screenX > roomX && screenX < roomX + room.getWidth()*35 && screenY > roomY && screenY < roomY + room.getHeight()*35)
{
Crew crew = (Crew) FTLView.inputHandler.selected;
if(room.getSystem() != null && room.getSystem().canMann() && !room.getSystem().isManned())
{
Tile stationTile = room.getTile(room.getSystem().getStationX(), room.getSystem().getStationY());
if(!stationTile.getProperties().containsValue("crew"))
crew.move(room, room.getSystem().getStationX(), room.getSystem().getStationY());
else
crew.move(room);
}
else
{
//TODO: find open tile
crew.move(room);
}
}
}
}
if(button == 0 && FTLView.inputHandler.selected == null)
{
boolean changed = false;
for(Room room : ship.getRooms().values())
{
for(Door door : room.getDoors())
{
int doorX = (int) (door.getX() * 35 + shipOffsetX + offsetX);
int doorY = (int) (door.getY() * 35 + shipOffsetY + offsetY);
int shrinkH = 5;
int shrinkV = 10;
if(door.direction == Direction.RIGHT || door.direction == Direction.LEFT)
if(screenX > doorX - 35/2 + shrinkV && screenX < doorX + 35/2 - shrinkV && screenY > doorY + shrinkH && screenY < doorY + 35 - shrinkH)
{
changed = true;
door.forceOpen = !door.forceOpen;
}
if(door.direction == Direction.UP || door.direction == Direction.DOWN)
if(screenX > doorX + shrinkH && screenX < doorX + 35 - shrinkH && screenY > doorY - 35/2 + shrinkV && screenY < doorY + 35/2 - shrinkV)
{
changed = true;
door.forceOpen = !door.forceOpen;
}
}
}
if(changed)
return true;
}
return false;
}
public void setInteractive(boolean interactive)
{
this.interactive = interactive;
}
}