package com.rebelkeithy.ftl.systems;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import com.rebelkeithy.ftl.crew.Crew;
import com.rebelkeithy.ftl.ship.Door;
import com.rebelkeithy.ftl.ship.Room;
import com.rebelkeithy.ftl.ship.Ship;
public class OxygenSystem extends AbstractShipSystem
{
public OxygenSystem(Ship ship, String name, int maxPower)
{
super(ship, name, maxPower);
}
public String getDisplayName() { return "Oxygen"; }
public String getDescription()
{
return "Refills the oxygen in the ship. Upgrading\nincreases the rate of refill";
}
public String getUpgradeDescription(int level)
{
switch(level)
{
case 0:
return "O2 Refill Boost: 1x";
case 1:
return "O2 Refill Boost: 3x";
case 2:
return "O2 Refill Boost: 6x";
}
return "";
}
@Override
public void update(double dt)
{
super.update(dt);
double oxyChange = 0;
if(getPower() <= 0)
oxyChange = -1;
if(getPower() == 1)
oxyChange = 1;
if(getPower() == 2)
oxyChange = 3;
if(getPower() == 3)
oxyChange = 6;
Map<String, Room> rooms = getShip().getRooms();
// TODO: make oxygen propagate from room to room
for(Room room : rooms.values())
{
double oxygen = 100;
if(room.getProperties().containsValue("oxygen"))
oxygen = room.getProperties().getDouble("oxygen");
oxygen += oxyChange * dt;
if(oxygen < 0)
oxygen = 0;
if(oxygen > 100)
oxygen = 100;
room.getProperties().setDouble("oxygen", oxygen);
if(oxygen < 5)
{
Set<Crew> crew = room.getCrew();
for(Crew member : crew)
{
member.damage(5*dt, "Oxygen");
}
}
}
double flowThroughDoor = 10;
Map<Room, Double> changes = new HashMap<Room, Double>();
for(Room room : rooms.values())
{
for(Door door : room.getDoors())
{
double oxy1 = room.getProperties().getDouble("oxygen");
if(door.isOpen())
{
if(door.room2 == null)
{
double change = 0;
if(changes.containsKey(room))
change = changes.get(room);
changes.put(room, change-50);
}
else
{
double oxyDiff = oxy1 - door.room2.getProperties().getDouble("oxygen");
if(oxyDiff > 0)
{
if(oxyDiff > flowThroughDoor)
oxyDiff = flowThroughDoor;
if(changes.containsKey(room))
changes.put(room, -oxyDiff + changes.get(room));
else
changes.put(room, -oxyDiff);
/*
if(changes.containsKey(door.room2))
changes.put(room, oxyDiff + changes.get(door.room2));
else
changes.put(room, oxyDiff);*/
}
}
}
}
}
for(Room room : changes.keySet())
{
double oxygen = room.getProperties().getDouble("oxygen");
oxygen += (changes.get(room) * dt);
if(oxygen > 100)
oxygen = 100;
if(oxygen < 0)
oxygen = 0;
room.getProperties().setDouble("oxygen", oxygen);
}
}
public boolean canMann()
{
return false;
}
}