package haven.minimap;
import java.awt.Color;
import java.util.*;
import haven.*;
import haven.Utils;
public class Radar {
private final MarkerFactory factory;
private final Map<Long, Marker> markers = new HashMap<Long, Marker>();
private final Map<Long, GobRes> undefined = new HashMap<Long, GobRes>();
private final Object markerLock = new Object();
public Radar() {
factory = new MarkerFactory();
}
public void add(Gob g, Indir<Resource> res) {
synchronized (markerLock) {
if (this.contains(g))
return;
boolean added = false;
try {
Resource r = res.get();
if (r != null && r.name != null && r.name.length() != 0) {
add(r.name, g);
added = true;
}
} catch (Session.LoadingIndir ignored) {
} catch (Resource.Loading ignored) {
}
if (!added) {
// resource isn't loaded yet?
undefined.put(g.id, new GobRes(g, res));
}
}
}
public void update() {
synchronized (markerLock) {
checkUndefined();
}
}
private void add(String name, Gob gob) {
Marker m = factory.makeMarker(name, gob);
if (m != null) {
markers.put(gob.id, m);
gob.setattr(new GobBlink(gob, m));
}
}
private void checkUndefined() {
if (undefined.size() == 0)
return;
GobRes[] gs = undefined.values().toArray(new GobRes[undefined.size()]);
for (GobRes gr : gs) {
try {
Resource r = gr.res.get();
if (r != null && r.name != null && r.name.length() != 0) {
add(r.name, gr.gob);
undefined.remove(gr.gob.id);
}
} catch (Session.LoadingIndir ignored) {
} catch (Resource.Loading ignored) {
}
}
}
private boolean contains(Gob g) {
return undefined.containsKey(g.id) || markers.containsKey(g.id);
}
public Marker[] getMarkers() {
synchronized (markerLock) {
checkUndefined();
return markers.values().toArray(new Marker[markers.size()]);
}
}
public Marker get(Gob gob){
return markers.get(gob.id);
}
public void remove(Long gobid) {
synchronized (markerLock) {
markers.remove(gobid);
undefined.remove(gobid);
}
}
public void reload() {
synchronized (markerLock) {
undefined.clear();
factory.setConfig(new RadarConfig());
Marker[] ms = markers.values().toArray(new Marker[markers.size()]);
markers.clear();
for (Marker m : ms) {
add(m.name, m.gob);
}
}
}
private static class GobRes {
public final Gob gob;
public final Indir<Resource> res;
public GobRes(Gob gob, Indir<Resource> res) {
this.gob = gob;
this.res = res;
}
}
public static class GobBlink extends GAttrib {
private final Marker marker;
Material.Colors fx;
int time = 0;
public GobBlink(Gob gob, Marker marker) {
super(gob);
this.marker = marker;
Color c = new Color(255, 100, 100, 100);
fx = new Material.Colors();
fx.amb = Utils.c2fa(c);
fx.dif = Utils.c2fa(c);
fx.emi = Utils.c2fa(c);
}
public void ctick(int dt) {
int max = 2000;
time = (time + dt)%max;
float a = (float)time/max;
if(a > 0.6f){
a = 0;
} else if(a > 0.3f){
a = 2.0f - a/0.3f;
} else {
a = a/0.3f;
}
fx.amb[3] = a;
fx.dif[3] = a;
fx.emi[3] = a;
}
public GLState getfx() {
return(fx);
}
public boolean visible() {
return marker.template.visible;
}
}
}